maxwell_agent 0.0.5 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +2 -0
- data/Gemfile +5 -3
- data/Gemfile.lock +63 -66
- data/README.md +22 -1
- data/bin/agent.rb +6 -0
- data/lib/maxwell/agent.rb +8 -5
- data/lib/maxwell/agent/attributes.rb +5 -0
- data/lib/maxwell/agent/coercable.rb +38 -0
- data/lib/maxwell/agent/evented_worker.rb +7 -0
- data/lib/maxwell/agent/host.rb +31 -10
- data/lib/maxwell/agent/host/service.rb +49 -0
- data/lib/maxwell/agent/middleware_runner.rb +11 -0
- data/lib/maxwell/agent/probe.rb +12 -0
- data/lib/maxwell/agent/redis_objects.rb +18 -0
- data/lib/maxwell/agent/redis_objects/set.rb +42 -0
- data/lib/maxwell/agent/redis_objects/sorted_set.rb +35 -0
- data/lib/maxwell/agent/runner.rb +18 -15
- data/lib/maxwell/agent/scheduler.rb +18 -14
- data/lib/maxwell/agent/standard_worker.rb +7 -0
- data/lib/maxwell/agent/version.rb +1 -1
- data/lib/maxwell/agent/work.rb +19 -44
- data/lib/maxwell/agent/work_schedule.rb +19 -52
- data/lib/maxwell/agent/worker.rb +1 -2
- data/maxwell_agent.gemspec +1 -0
- data/plugins/README.md +2 -0
- data/plugins/check_shell.rb +15 -0
- data/spec/agent/probe_spec.rb +13 -0
- data/spec/agent/scheduler_spec.rb +1 -6
- data/spec/agent/work_schedule_spec.rb +9 -9
- data/spec/agent/work_spec.rb +1 -12
- data/spec/spec_helper.rb +1 -1
- metadata +87 -59
- data/lib/maxwell/agent/dynamic_attributes.rb +0 -11
@@ -3,15 +3,18 @@ module Maxwell
|
|
3
3
|
class WorkSchedule
|
4
4
|
include Celluloid
|
5
5
|
|
6
|
+
def initialize
|
7
|
+
@schedule = RedisObjects::SortedSet.new_link('work_schedule')
|
8
|
+
@working = RedisObjects::Set.new_link('work_schedule:working')
|
9
|
+
end
|
10
|
+
|
6
11
|
def add(work)
|
7
|
-
async.
|
12
|
+
@schedule.async.add(work.generate_rank, work)
|
8
13
|
work
|
9
14
|
end
|
10
15
|
|
11
16
|
def count
|
12
|
-
|
13
|
-
redis.zcard 'work_schedule'
|
14
|
-
end
|
17
|
+
schedule.count
|
15
18
|
end
|
16
19
|
|
17
20
|
def get
|
@@ -19,22 +22,16 @@ module Maxwell
|
|
19
22
|
end
|
20
23
|
|
21
24
|
def put_back(work)
|
22
|
-
|
23
|
-
|
25
|
+
@working.async.remove(work)
|
26
|
+
add(work)
|
24
27
|
end
|
25
28
|
|
26
29
|
def working
|
27
|
-
|
28
|
-
redis.smembers 'work_schedule:working'
|
29
|
-
end
|
30
|
-
work_items.map {|work| Work.load(work) }
|
30
|
+
@working.all.map {|work| Work.load(work) }
|
31
31
|
end
|
32
32
|
|
33
33
|
def schedule
|
34
|
-
|
35
|
-
redis.zrange 'work_schedule', 0, -1
|
36
|
-
end
|
37
|
-
work_items.map {|work| Work.load(work) }
|
34
|
+
@schedule.all.map {|work| Work.load(work) }
|
38
35
|
end
|
39
36
|
|
40
37
|
def all
|
@@ -42,57 +39,27 @@ module Maxwell
|
|
42
39
|
end
|
43
40
|
|
44
41
|
private
|
45
|
-
def redis(&block)
|
46
|
-
Agent.redis(&block)
|
47
|
-
end
|
48
42
|
|
49
43
|
def find_ready_for_work
|
50
44
|
work = get_work
|
51
|
-
|
52
|
-
|
45
|
+
if work && work.work_now?
|
46
|
+
move_to_working_queue(work)
|
47
|
+
work
|
48
|
+
end
|
53
49
|
end
|
54
50
|
|
55
51
|
def get_work
|
56
|
-
work =
|
57
|
-
redis.zrange('work_schedule', 0, 0)[0]
|
58
|
-
end
|
59
|
-
|
52
|
+
work = @schedule.first
|
60
53
|
Work.load(work) if work
|
61
54
|
end
|
62
55
|
|
63
56
|
def move_to_working_queue(work)
|
64
|
-
|
65
|
-
|
66
|
-
end
|
67
|
-
|
68
|
-
def remove_from_main_queue(work)
|
69
|
-
redis do |redis|
|
70
|
-
redis.zrem 'work_schedule', work.to_json
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
def add_to_working_queue(work)
|
75
|
-
redis do |redis|
|
76
|
-
redis.sadd 'work_schedule:working', work.to_json
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
def remove_from_working_queue(work)
|
81
|
-
redis do |redis|
|
82
|
-
redis.srem 'work_schedule:working', work.to_json
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
def add_work(work)
|
87
|
-
redis do |redis|
|
88
|
-
redis.zadd 'work_schedule', work.generate_rank, work.to_json
|
89
|
-
end
|
57
|
+
@working.async.add(work)
|
58
|
+
@schedule.async.remove(work)
|
90
59
|
end
|
91
60
|
|
92
61
|
def is_being_worked_on?(work)
|
93
|
-
|
94
|
-
redis.sismember 'work_schedule:working', work.to_json
|
95
|
-
end
|
62
|
+
@working.exists?(work)
|
96
63
|
end
|
97
64
|
end
|
98
65
|
end
|
data/lib/maxwell/agent/worker.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
module Maxwell
|
2
2
|
module Agent
|
3
3
|
class Worker
|
4
|
-
include Celluloid
|
5
4
|
|
6
5
|
def perform(work)
|
7
6
|
work.perform
|
@@ -21,7 +20,7 @@ module Maxwell
|
|
21
20
|
work.perform_at = nil
|
22
21
|
work.last_run = Time.now
|
23
22
|
|
24
|
-
Agent.
|
23
|
+
Agent.runner[:middleware_runner].inoke(work)
|
25
24
|
end
|
26
25
|
end
|
27
26
|
end
|
data/maxwell_agent.gemspec
CHANGED
@@ -25,6 +25,7 @@ Gem::Specification.new do |spec|
|
|
25
25
|
spec.add_development_dependency "fakeredis"
|
26
26
|
|
27
27
|
spec.add_runtime_dependency "celluloid", "~> 0.15.0"
|
28
|
+
spec.add_runtime_dependency "celluloid-io"
|
28
29
|
spec.add_runtime_dependency "activesupport"
|
29
30
|
spec.add_runtime_dependency "connection_pool"
|
30
31
|
spec.add_runtime_dependency "redis"
|
data/plugins/README.md
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module Maxwell
|
3
|
+
module Agent
|
4
|
+
describe Probe do
|
5
|
+
|
6
|
+
context 'Probe is included' do
|
7
|
+
Given(:probe) { Class.new { include Probe } }
|
8
|
+
When(:result) { probe.work_type }
|
9
|
+
Then { expect(result).to eq(:non_evented) }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -2,12 +2,7 @@ require 'spec_helper'
|
|
2
2
|
module Maxwell
|
3
3
|
module Agent
|
4
4
|
describe Scheduler do
|
5
|
-
|
6
|
-
runner = double(:runner)
|
7
|
-
Agent.stub(:runner).and_return(runner)
|
8
|
-
allow(runner).to receive(:[]).with(:scheduler).and_return(Maxwell::Scheduler.new)
|
9
|
-
end
|
10
|
-
Given(:scheduler) { Agent.runner[:scheduler] }
|
5
|
+
|
11
6
|
end
|
12
7
|
end
|
13
8
|
end
|
@@ -10,24 +10,24 @@ module Maxwell
|
|
10
10
|
end
|
11
11
|
|
12
12
|
Given(:queue) { Agent.runner[:work_schedule] }
|
13
|
-
Given(:work) {
|
13
|
+
Given(:work) { Host::Service.new(name: 'foo', work_class: 'bar') }
|
14
14
|
describe '.add' do
|
15
15
|
context 'Work is added' do
|
16
16
|
When(:result) { queue.add(work) }
|
17
|
-
Then { expect(queue.count).to
|
17
|
+
Then { expect(queue.count).to eq 1 }
|
18
18
|
end
|
19
19
|
context 'The same Work is added 2x' do
|
20
20
|
Given { queue.add(work) }
|
21
21
|
When { queue.add(work) }
|
22
|
-
Then { expect(queue.count).to
|
22
|
+
Then { expect(queue.count).to eq 1 }
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
26
|
describe '.working' do
|
27
27
|
Given { queue.add(work) }
|
28
28
|
When { queue.get }
|
29
|
-
Then { expect(queue.working.count).to
|
30
|
-
And { expect(queue.count).to
|
29
|
+
Then { expect(queue.working.count).to eq 1 }
|
30
|
+
And { expect(queue.count).to eq 0 }
|
31
31
|
end
|
32
32
|
|
33
33
|
describe '.put_back' do
|
@@ -40,12 +40,12 @@ module Maxwell
|
|
40
40
|
|
41
41
|
describe '.all' do
|
42
42
|
Given { queue.add(work) }
|
43
|
-
Given { queue.add(
|
43
|
+
Given { queue.add(Host::Service.new(name: 'foo', work_class: 'bar',
|
44
44
|
perform_at: 5.minutes.ago)) }
|
45
45
|
When { queue.get }
|
46
|
-
Then { expect(queue.all.count).to
|
47
|
-
And { expect(queue.working.count).to
|
48
|
-
And { expect(queue.schedule.count).to
|
46
|
+
Then { expect(queue.all.count).to eq 2 }
|
47
|
+
And { expect(queue.working.count).to eq 1 }
|
48
|
+
And { expect(queue.schedule.count).to eq 1 }
|
49
49
|
end
|
50
50
|
|
51
51
|
end
|
data/spec/agent/work_spec.rb
CHANGED
@@ -4,25 +4,14 @@ class Bar; end
|
|
4
4
|
|
5
5
|
module Maxwell
|
6
6
|
module Agent
|
7
|
-
class WorkTest
|
7
|
+
class WorkTest < Host::Service
|
8
8
|
include Work
|
9
|
-
def initialize(attrs={})
|
10
|
-
attrs.each do |key, value|
|
11
|
-
send("#{key}=", value)
|
12
|
-
end
|
13
|
-
end
|
14
9
|
end
|
15
10
|
|
16
11
|
describe Work do
|
17
12
|
Given(:work) { WorkTest.new name: :foo, work_class: 'Foo' }
|
18
13
|
Given(:work2) { WorkTest.new name: :bar, work_class: 'Bar' }
|
19
14
|
|
20
|
-
describe '#load' do
|
21
|
-
Given(:work_json) { work.to_json }
|
22
|
-
When(:result) { Work.load(work_json) }
|
23
|
-
Then { expect(work_json).to eq(result.to_json) }
|
24
|
-
end
|
25
|
-
|
26
15
|
describe '.work_now?' do
|
27
16
|
context 'work is scheduled normally' do
|
28
17
|
Given { work.last_run = 1000.hours.ago }
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,167 +1,191 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: maxwell_agent
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Goff
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-03-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
version_requirements: !ruby/object:Gem::Requirement
|
15
|
-
requirements:
|
16
|
-
- - "~>"
|
17
|
-
- !ruby/object:Gem::Version
|
18
|
-
version: '1.3'
|
19
|
-
prerelease: false
|
20
|
-
type: :development
|
21
14
|
name: bundler
|
22
15
|
requirement: !ruby/object:Gem::Requirement
|
23
16
|
requirements:
|
24
|
-
- -
|
17
|
+
- - ~>
|
25
18
|
- !ruby/object:Gem::Version
|
26
19
|
version: '1.3'
|
27
|
-
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
28
22
|
version_requirements: !ruby/object:Gem::Requirement
|
29
23
|
requirements:
|
30
|
-
- -
|
24
|
+
- - ~>
|
31
25
|
- !ruby/object:Gem::Version
|
32
|
-
version: '
|
33
|
-
|
34
|
-
type: :development
|
26
|
+
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
35
28
|
name: rake
|
36
29
|
requirement: !ruby/object:Gem::Requirement
|
37
30
|
requirements:
|
38
|
-
- -
|
31
|
+
- - '>='
|
39
32
|
- !ruby/object:Gem::Version
|
40
33
|
version: '0'
|
41
|
-
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
42
36
|
version_requirements: !ruby/object:Gem::Requirement
|
43
37
|
requirements:
|
44
|
-
- -
|
38
|
+
- - '>='
|
45
39
|
- !ruby/object:Gem::Version
|
46
40
|
version: '0'
|
47
|
-
|
48
|
-
type: :development
|
41
|
+
- !ruby/object:Gem::Dependency
|
49
42
|
name: rspec
|
50
43
|
requirement: !ruby/object:Gem::Requirement
|
51
44
|
requirements:
|
52
|
-
- -
|
45
|
+
- - '>='
|
53
46
|
- !ruby/object:Gem::Version
|
54
47
|
version: '0'
|
55
|
-
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
51
|
requirements:
|
58
|
-
- -
|
52
|
+
- - '>='
|
59
53
|
- !ruby/object:Gem::Version
|
60
54
|
version: '0'
|
61
|
-
|
62
|
-
type: :development
|
55
|
+
- !ruby/object:Gem::Dependency
|
63
56
|
name: rpsec-given
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
58
|
requirements:
|
66
|
-
- -
|
59
|
+
- - '>='
|
67
60
|
- !ruby/object:Gem::Version
|
68
61
|
version: '0'
|
69
|
-
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
70
64
|
version_requirements: !ruby/object:Gem::Requirement
|
71
65
|
requirements:
|
72
|
-
- -
|
66
|
+
- - '>='
|
73
67
|
- !ruby/object:Gem::Version
|
74
68
|
version: '0'
|
75
|
-
|
76
|
-
type: :development
|
69
|
+
- !ruby/object:Gem::Dependency
|
77
70
|
name: fakeredis
|
78
71
|
requirement: !ruby/object:Gem::Requirement
|
79
72
|
requirements:
|
80
|
-
- -
|
73
|
+
- - '>='
|
81
74
|
- !ruby/object:Gem::Version
|
82
75
|
version: '0'
|
83
|
-
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
84
78
|
version_requirements: !ruby/object:Gem::Requirement
|
85
79
|
requirements:
|
86
|
-
- -
|
80
|
+
- - '>='
|
87
81
|
- !ruby/object:Gem::Version
|
88
|
-
version: 0
|
89
|
-
|
90
|
-
type: :runtime
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
91
84
|
name: celluloid
|
92
85
|
requirement: !ruby/object:Gem::Requirement
|
93
86
|
requirements:
|
94
|
-
- -
|
87
|
+
- - ~>
|
95
88
|
- !ruby/object:Gem::Version
|
96
89
|
version: 0.15.0
|
97
|
-
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
98
92
|
version_requirements: !ruby/object:Gem::Requirement
|
99
93
|
requirements:
|
100
|
-
- -
|
94
|
+
- - ~>
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.15.0
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: celluloid-io
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '>='
|
101
102
|
- !ruby/object:Gem::Version
|
102
103
|
version: '0'
|
103
|
-
prerelease: false
|
104
104
|
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
105
112
|
name: activesupport
|
106
113
|
requirement: !ruby/object:Gem::Requirement
|
107
114
|
requirements:
|
108
|
-
- -
|
115
|
+
- - '>='
|
109
116
|
- !ruby/object:Gem::Version
|
110
117
|
version: '0'
|
111
|
-
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
112
120
|
version_requirements: !ruby/object:Gem::Requirement
|
113
121
|
requirements:
|
114
|
-
- -
|
122
|
+
- - '>='
|
115
123
|
- !ruby/object:Gem::Version
|
116
124
|
version: '0'
|
117
|
-
|
118
|
-
type: :runtime
|
125
|
+
- !ruby/object:Gem::Dependency
|
119
126
|
name: connection_pool
|
120
127
|
requirement: !ruby/object:Gem::Requirement
|
121
128
|
requirements:
|
122
|
-
- -
|
129
|
+
- - '>='
|
123
130
|
- !ruby/object:Gem::Version
|
124
131
|
version: '0'
|
125
|
-
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
126
134
|
version_requirements: !ruby/object:Gem::Requirement
|
127
135
|
requirements:
|
128
|
-
- -
|
136
|
+
- - '>='
|
129
137
|
- !ruby/object:Gem::Version
|
130
138
|
version: '0'
|
131
|
-
|
132
|
-
type: :runtime
|
139
|
+
- !ruby/object:Gem::Dependency
|
133
140
|
name: redis
|
134
141
|
requirement: !ruby/object:Gem::Requirement
|
135
142
|
requirements:
|
136
|
-
- -
|
143
|
+
- - '>='
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :runtime
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - '>='
|
137
151
|
- !ruby/object:Gem::Version
|
138
152
|
version: '0'
|
139
153
|
description: Maxwell Agent
|
140
154
|
email:
|
141
155
|
- cpuguy83@gmail.com
|
142
|
-
executables:
|
156
|
+
executables:
|
157
|
+
- agent.rb
|
143
158
|
extensions: []
|
144
159
|
extra_rdoc_files: []
|
145
160
|
files:
|
146
|
-
-
|
147
|
-
-
|
148
|
-
-
|
161
|
+
- .document
|
162
|
+
- .gitignore
|
163
|
+
- .travis.yml
|
149
164
|
- Gemfile
|
150
165
|
- Gemfile.lock
|
151
166
|
- Guardfile
|
152
167
|
- LICENSE.txt
|
153
168
|
- README.md
|
154
169
|
- Rakefile
|
170
|
+
- bin/agent.rb
|
155
171
|
- config/host_configuration.json
|
156
172
|
- lib/maxwell/agent.rb
|
173
|
+
- lib/maxwell/agent/attributes.rb
|
174
|
+
- lib/maxwell/agent/coercable.rb
|
157
175
|
- lib/maxwell/agent/configuration.rb
|
158
|
-
- lib/maxwell/agent/
|
176
|
+
- lib/maxwell/agent/evented_worker.rb
|
159
177
|
- lib/maxwell/agent/host.rb
|
178
|
+
- lib/maxwell/agent/host/service.rb
|
160
179
|
- lib/maxwell/agent/middleware/chain.rb
|
161
180
|
- lib/maxwell/agent/middleware/logging.rb
|
181
|
+
- lib/maxwell/agent/middleware_runner.rb
|
162
182
|
- lib/maxwell/agent/probe.rb
|
183
|
+
- lib/maxwell/agent/redis_objects.rb
|
184
|
+
- lib/maxwell/agent/redis_objects/set.rb
|
185
|
+
- lib/maxwell/agent/redis_objects/sorted_set.rb
|
163
186
|
- lib/maxwell/agent/runner.rb
|
164
187
|
- lib/maxwell/agent/scheduler.rb
|
188
|
+
- lib/maxwell/agent/standard_worker.rb
|
165
189
|
- lib/maxwell/agent/version.rb
|
166
190
|
- lib/maxwell/agent/web.rb
|
167
191
|
- lib/maxwell/agent/web_helpers.rb
|
@@ -170,8 +194,11 @@ files:
|
|
170
194
|
- lib/maxwell/agent/worker.rb
|
171
195
|
- lib/maxwell_agent.rb
|
172
196
|
- maxwell_agent.gemspec
|
197
|
+
- plugins/README.md
|
198
|
+
- plugins/check_shell.rb
|
173
199
|
- spec/agent/Guardfile
|
174
200
|
- spec/agent/host_spec.rb
|
201
|
+
- spec/agent/probe_spec.rb
|
175
202
|
- spec/agent/scheduler_spec.rb
|
176
203
|
- spec/agent/work_schedule_spec.rb
|
177
204
|
- spec/agent/work_spec.rb
|
@@ -187,23 +214,24 @@ require_paths:
|
|
187
214
|
- lib
|
188
215
|
required_ruby_version: !ruby/object:Gem::Requirement
|
189
216
|
requirements:
|
190
|
-
- -
|
217
|
+
- - '>='
|
191
218
|
- !ruby/object:Gem::Version
|
192
219
|
version: '0'
|
193
220
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
194
221
|
requirements:
|
195
|
-
- -
|
222
|
+
- - '>='
|
196
223
|
- !ruby/object:Gem::Version
|
197
224
|
version: '0'
|
198
225
|
requirements: []
|
199
226
|
rubyforge_project:
|
200
|
-
rubygems_version: 2.
|
227
|
+
rubygems_version: 2.0.3
|
201
228
|
signing_key:
|
202
229
|
specification_version: 4
|
203
230
|
summary: Maxwell Agent
|
204
231
|
test_files:
|
205
232
|
- spec/agent/Guardfile
|
206
233
|
- spec/agent/host_spec.rb
|
234
|
+
- spec/agent/probe_spec.rb
|
207
235
|
- spec/agent/scheduler_spec.rb
|
208
236
|
- spec/agent/work_schedule_spec.rb
|
209
237
|
- spec/agent/work_spec.rb
|