maxwell_agent 0.0.5 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- 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
|