gru 0.1.2 → 0.1.3
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/lib/gru/adapters/redis_adapter.rb +10 -2
- data/lib/gru/version.rb +1 -1
- data/spec/gru/adapters/redis_adapter_spec.rb +12 -12
- data/spec/gru/gru_integration_spec.rb +30 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 15b0d3917dc6d07575874b7f0a87cbc5b109214c
|
4
|
+
data.tar.gz: 1d164bcef80f5b1f7e6a3594de72e6715847a85a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 45547c39e99a83b4c30c5e8e50aee8a47e24b6bfc120f4ca245ad6ef7df872ab54991a032716d2c57467b15531d53c6fe1fe9e0f8e36103c92fab236175b5366
|
7
|
+
data.tar.gz: d942a5d16235720661c81f3af3ab841300b55f7dd0d54732fd0c308d9da4bd18743f11535bb595fa0dfe8c15ba2ca74fd0fd74d0f55ef2404a9d519851488ea3
|
@@ -18,6 +18,7 @@ module Gru
|
|
18
18
|
set_max_worker_counts(@settings.host_maximums)
|
19
19
|
register_global_workers(@settings.cluster_maximums)
|
20
20
|
set_max_global_worker_counts(@settings.cluster_maximums)
|
21
|
+
remove_stale_worker_entries
|
21
22
|
update_heartbeat if manage_heartbeat?
|
22
23
|
end
|
23
24
|
|
@@ -79,6 +80,13 @@ module Gru
|
|
79
80
|
false
|
80
81
|
end
|
81
82
|
|
83
|
+
def remove_stale_worker_entries
|
84
|
+
stale_keys = max_global_workers.keys - @settings.cluster_maximums.keys
|
85
|
+
stale_keys.each do |key|
|
86
|
+
send_message(:hdel, global_max_worker_key, key)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
82
90
|
private
|
83
91
|
|
84
92
|
def register_workers(workers)
|
@@ -164,8 +172,8 @@ module Gru
|
|
164
172
|
end
|
165
173
|
|
166
174
|
def adjust_workers(worker,amount)
|
167
|
-
lock_key = "#{gru_key}:#{worker}"
|
168
|
-
if send_message(:
|
175
|
+
lock_key = "#{gru_key}:locks:#{worker}"
|
176
|
+
if send_message(:set,lock_key,Time.now.to_i, { nx: true, px: 10000 })
|
169
177
|
send_message(:hincrby,host_workers_running_key,worker,amount)
|
170
178
|
send_message(:hincrby,global_workers_running_key,worker,amount)
|
171
179
|
send_message(:del,lock_key)
|
data/lib/gru/version.rb
CHANGED
@@ -81,8 +81,8 @@ describe Gru::Adapters::RedisAdapter do
|
|
81
81
|
expect(client).to receive(:multi).exactly(3).times.and_yield(client).and_return([0,-1,3,3])
|
82
82
|
expect(client).to receive(:hset).with("#{gru_key}:global:workers_running",'test_worker', 0)
|
83
83
|
expect(client).to receive(:hget).with("#{gru_key}:global:workers_running",'test_worker').exactly(1).times.and_return(0)
|
84
|
-
expect(client).to receive(:
|
85
|
-
expect(client).to receive(:del).with("#{gru_key}:test_worker").exactly(3).times
|
84
|
+
expect(client).to receive(:set).exactly(3).times.and_return(true)
|
85
|
+
expect(client).to receive(:del).with("#{gru_key}:locks:test_worker").exactly(3).times
|
86
86
|
expect(client).to receive(:get).with("#{gru_key}:rebalance").exactly(3).times
|
87
87
|
expect(client).to receive(:hgetall).with("#{gru_key}:#{hostname}:workers_running").exactly(3).times.and_return({'test_worker' => '1'})
|
88
88
|
expect(client).to receive(:hincrby).with("#{gru_key}:global:workers_running",'test_worker',1).exactly(3).times
|
@@ -97,8 +97,8 @@ describe Gru::Adapters::RedisAdapter do
|
|
97
97
|
|
98
98
|
it "returns workers when max local and global counts have not been reached" do
|
99
99
|
expect(client).to receive(:multi).exactly(3).times.and_yield(client).and_return([1,1,3,3])
|
100
|
-
expect(client).to receive(:
|
101
|
-
expect(client).to receive(:del).with("#{gru_key}:test_worker").exactly(3).times
|
100
|
+
expect(client).to receive(:set).exactly(3).times.and_return(true)
|
101
|
+
expect(client).to receive(:del).with("#{gru_key}:locks:test_worker").exactly(3).times
|
102
102
|
expect(client).to receive(:get).with("#{gru_key}:rebalance").exactly(3).times
|
103
103
|
expect(client).to receive(:hgetall).with("#{gru_key}:#{hostname}:workers_running").exactly(3).times.and_return({'test_worker' => '1'})
|
104
104
|
expect(client).to receive(:hincrby).with("#{gru_key}:global:workers_running",'test_worker',1).exactly(3).times
|
@@ -173,8 +173,8 @@ describe Gru::Adapters::RedisAdapter do
|
|
173
173
|
|
174
174
|
it "removes workers when local maximum has been exceeded" do
|
175
175
|
expect(client).to receive(:multi).exactly(1).times.and_yield(client).and_return([3,3,1,3])
|
176
|
-
expect(client).to receive(:
|
177
|
-
expect(client).to receive(:del).with("#{gru_key}:test_worker").exactly(1).times
|
176
|
+
expect(client).to receive(:set).exactly(1).times.and_return(true)
|
177
|
+
expect(client).to receive(:del).with("#{gru_key}:locks:test_worker").exactly(1).times
|
178
178
|
expect(client).to receive(:hincrby).with("#{gru_key}:global:workers_running",'test_worker',-1).exactly(1).times
|
179
179
|
expect(client).to receive(:hincrby).with("#{gru_key}:#{hostname}:workers_running",'test_worker',-1).exactly(1).times
|
180
180
|
expect(adapter.expire_workers).to eq({'test_worker' => -1})
|
@@ -182,8 +182,8 @@ describe Gru::Adapters::RedisAdapter do
|
|
182
182
|
|
183
183
|
it "removes workers when global maximum has been exceeded" do
|
184
184
|
expect(client).to receive(:multi).exactly(1).times.and_yield(client).and_return([3,3,3,1])
|
185
|
-
expect(client).to receive(:
|
186
|
-
expect(client).to receive(:del).with("#{gru_key}:test_worker").exactly(1).times
|
185
|
+
expect(client).to receive(:set).exactly(1).times.and_return(true)
|
186
|
+
expect(client).to receive(:del).with("#{gru_key}:locks:test_worker").exactly(1).times
|
187
187
|
expect(client).to receive(:hincrby).with("#{gru_key}:global:workers_running",'test_worker',-1).exactly(1).times
|
188
188
|
expect(client).to receive(:hincrby).with("#{gru_key}:#{hostname}:workers_running",'test_worker',-1).exactly(1).times
|
189
189
|
expect(adapter.expire_workers).to eq({'test_worker' => -1})
|
@@ -225,10 +225,10 @@ describe Gru::Adapters::RedisAdapter do
|
|
225
225
|
expect(client).to receive(:hget).with("#{gru_key}:global:max_workers",'test_worker').exactly(3).times
|
226
226
|
expect(client).to receive(:keys).with("#{gru_key}:*:workers_running").exactly(3).times.and_return(['foo'])
|
227
227
|
expect(client).to receive(:hgetall).with("#{gru_key}:#{hostname}:workers_running").exactly(3).times.and_return({'test_worker' => '1'})
|
228
|
-
expect(client).to receive(:
|
228
|
+
expect(client).to receive(:set).exactly(3).times.and_return(true)
|
229
229
|
expect(client).to receive(:hincrby).with("#{gru_key}:global:workers_running",'test_worker',1).exactly(3).times
|
230
230
|
expect(client).to receive(:hincrby).with("#{gru_key}:#{hostname}:workers_running",'test_worker',1).exactly(3).times
|
231
|
-
expect(client).to receive(:del).with("#{gru_key}:test_worker").exactly(3).times
|
231
|
+
expect(client).to receive(:del).with("#{gru_key}:locks:test_worker").exactly(3).times
|
232
232
|
expect(client).to receive(:get).with("#{gru_key}:rebalance").and_return("true").exactly(3).times
|
233
233
|
adapter.provision_workers
|
234
234
|
end
|
@@ -250,12 +250,12 @@ describe Gru::Adapters::RedisAdapter do
|
|
250
250
|
it "provisions workers if local proc max hasn't been reached" do
|
251
251
|
expect(client).to receive(:multi).exactly(3).times.and_yield(client).and_return([9,20,20,30], [10,20,20,30])
|
252
252
|
expect(client).to receive(:hgetall).with("#{gru_key}:#{hostname}:max_workers").and_return(config.cluster_maximums)
|
253
|
-
expect(client).to receive(:
|
253
|
+
expect(client).to receive(:set).exactly(1).times.and_return(true)
|
254
254
|
expect(client).to receive(:hgetall).with("#{gru_key}:#{hostname}:workers_running").exactly(3).times.and_return(
|
255
255
|
{'test_worker' => '9'}, {'test_worker' => '10'}, {'test_worker' => '10'})
|
256
256
|
expect(client).to receive(:hincrby).with("#{gru_key}:foo:workers_running",'test_worker',1).exactly(1).times
|
257
257
|
expect(client).to receive(:hincrby).with("#{gru_key}:global:workers_running",'test_worker',1).exactly(1).times
|
258
|
-
expect(client).to receive(:del).with("#{gru_key}:test_worker").exactly(1).times
|
258
|
+
expect(client).to receive(:del).with("#{gru_key}:locks:test_worker").exactly(1).times
|
259
259
|
expect(client).to receive(:keys).with("#{gru_key}:*:workers_running").exactly(3).times.and_return(["test1","test2"])
|
260
260
|
expect(client).to receive(:get).with("#{gru_key}:rebalance").exactly(3).times.and_return("true")
|
261
261
|
expect(client).to receive(:hget).with("#{gru_key}:#{hostname}:max_workers",'test_worker').exactly(3).times
|
@@ -485,4 +485,34 @@ xdescribe Gru do
|
|
485
485
|
})
|
486
486
|
end
|
487
487
|
end
|
488
|
+
|
489
|
+
context "Remove Stale Workers" do
|
490
|
+
let(:new_settings) {
|
491
|
+
{
|
492
|
+
cluster_maximums: {
|
493
|
+
'foo_worker' => '3'
|
494
|
+
}
|
495
|
+
}
|
496
|
+
}
|
497
|
+
|
498
|
+
let(:adapter1) {
|
499
|
+
adapter1 = Gru::Adapters::RedisAdapter.new(Gru::Configuration.new(settings.clone))
|
500
|
+
allow(adapter1).to receive(:hostname).and_return('test1')
|
501
|
+
adapter1
|
502
|
+
}
|
503
|
+
|
504
|
+
let(:adapter2) {
|
505
|
+
adapter2 = Gru::Adapters::RedisAdapter.new(Gru::Configuration.new(new_settings.clone))
|
506
|
+
allow(adapter2).to receive(:hostname).and_return('test2')
|
507
|
+
adapter2
|
508
|
+
}
|
509
|
+
|
510
|
+
it "removes stale worker keys" do
|
511
|
+
test1 = Gru::WorkerManager.new(adapter1)
|
512
|
+
test2 = Gru::WorkerManager.new(adapter2)
|
513
|
+
test1.register_workers
|
514
|
+
test2.register_workers
|
515
|
+
expect(client.hgetall("GRU:default:default:global:max_workers").keys).to eq(['foo_worker'])
|
516
|
+
end
|
517
|
+
end
|
488
518
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gru
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeffrey Gillis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-07-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|