resque-concurrent-restriction 0.5.1 → 0.5.2
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.
@@ -74,6 +74,12 @@ module Resque
|
|
74
74
|
"concurrent.queue.#{queue}.#{parts[2..-1].join('.')}"
|
75
75
|
end
|
76
76
|
|
77
|
+
# The redis key used to store the aggregate number of jobs
|
78
|
+
# in restriction queues by queue name
|
79
|
+
def queue_count_key
|
80
|
+
"concurrent.queue_counts"
|
81
|
+
end
|
82
|
+
|
77
83
|
def restriction_queue_availability_key(tracking_key)
|
78
84
|
parts = tracking_key.split(".")
|
79
85
|
"concurrent.queue_availability.#{parts[2..-1].join('.')}"
|
@@ -139,6 +145,7 @@ module Resque
|
|
139
145
|
else raise "Invalid location to ConcurrentRestriction.push_to_restriction_queue"
|
140
146
|
end
|
141
147
|
|
148
|
+
increment_queue_count(job.queue)
|
142
149
|
update_queues_available(tracking_key, job.queue, :add)
|
143
150
|
mark_runnable(tracking_key, false)
|
144
151
|
end
|
@@ -154,6 +161,8 @@ module Resque
|
|
154
161
|
clear_runnable(tracking_key, queue)
|
155
162
|
end
|
156
163
|
|
164
|
+
decrement_queue_count(queue)
|
165
|
+
|
157
166
|
# increment by one to indicate that we are running
|
158
167
|
# do this before update_queues_available so that the current queue gets cleaned
|
159
168
|
increment_running_count(tracking_key) if str
|
@@ -209,6 +218,26 @@ module Resque
|
|
209
218
|
return restricted
|
210
219
|
end
|
211
220
|
|
221
|
+
def increment_queue_count(queue, by=1)
|
222
|
+
value = Resque.redis.hincrby(queue_count_key, queue, by)
|
223
|
+
return value
|
224
|
+
end
|
225
|
+
|
226
|
+
def decrement_queue_count(queue, by=1)
|
227
|
+
value = Resque.redis.hincrby(queue_count_key, queue, -by)
|
228
|
+
return value
|
229
|
+
end
|
230
|
+
|
231
|
+
def queue_counts
|
232
|
+
value = Resque.redis.hgetall(queue_count_key)
|
233
|
+
value = Hash[*value.collect {|k, v| [k, v.to_i] }.flatten]
|
234
|
+
return value
|
235
|
+
end
|
236
|
+
|
237
|
+
def set_queue_count(queue, count)
|
238
|
+
Resque.redis.hset(queue_count_key, queue, count)
|
239
|
+
end
|
240
|
+
|
212
241
|
def runnable?(tracking_key, queue)
|
213
242
|
Resque.redis.sismember(runnables_key(queue), tracking_key)
|
214
243
|
end
|
@@ -375,14 +404,18 @@ module Resque
|
|
375
404
|
runnable_keys = Resque.redis.keys("concurrent.runnable*")
|
376
405
|
Resque.redis.del(*runnable_keys) if runnable_keys.size > 0
|
377
406
|
|
407
|
+
Resque.redis.del(queue_count_key)
|
378
408
|
queues_enabled = 0
|
379
409
|
queue_keys = Resque.redis.keys("concurrent.queue.*")
|
380
410
|
queue_keys.each do |k|
|
381
|
-
|
411
|
+
len = Resque.redis.llen(k)
|
412
|
+
if len > 0
|
382
413
|
parts = k.split(".")
|
383
414
|
queue = parts[2]
|
384
415
|
ident = parts[3..-1].join('.')
|
385
416
|
tracking_key = "concurrent.tracking.#{ident}"
|
417
|
+
|
418
|
+
increment_queue_count(queue, len)
|
386
419
|
update_queues_available(tracking_key, queue, :add)
|
387
420
|
mark_runnable(tracking_key, true)
|
388
421
|
queues_enabled += 1
|
@@ -393,46 +426,46 @@ module Resque
|
|
393
426
|
|
394
427
|
end
|
395
428
|
|
396
|
-
def stats
|
397
|
-
|
429
|
+
def stats(extended=false)
|
430
|
+
result = {}
|
398
431
|
|
399
|
-
|
432
|
+
result[:queues] = queue_counts
|
400
433
|
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
434
|
+
if extended
|
435
|
+
ident_sizes = {}
|
436
|
+
queue_keys = Resque.redis.keys("concurrent.queue.*")
|
437
|
+
queue_keys.each do |k|
|
438
|
+
parts = k.split(".")
|
439
|
+
ident = parts[3..-1].join(".")
|
440
|
+
queue_name = parts[2]
|
441
|
+
size = Resque.redis.llen(k)
|
442
|
+
ident_sizes[ident] ||= {}
|
443
|
+
ident_sizes[ident][queue_name] ||= 0
|
444
|
+
ident_sizes[ident][queue_name] += size
|
445
|
+
end
|
413
446
|
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
447
|
+
count_keys = Resque.redis.keys("concurrent.count.*")
|
448
|
+
running_counts = {}
|
449
|
+
count_keys.each do |k|
|
450
|
+
parts = k.split(".")
|
451
|
+
ident = parts[2..-1].join(".")
|
452
|
+
ident_sizes[ident] ||= {}
|
453
|
+
ident_sizes[ident]["running"] = Resque.redis.get(k).to_i
|
454
|
+
end
|
455
|
+
|
456
|
+
result[:identifiers] = ident_sizes
|
457
|
+
else
|
458
|
+
result[:identifiers] = {}
|
420
459
|
end
|
421
460
|
|
461
|
+
|
422
462
|
lock_keys = Resque.redis.keys("concurrent.lock.*")
|
423
|
-
lock_count = lock_keys.size
|
463
|
+
result[:lock_count] = lock_keys.size
|
424
464
|
|
425
465
|
runnable_count = Resque.redis.scard(runnables_key)
|
466
|
+
result[:runnable_count] = runnable_count
|
426
467
|
|
427
|
-
return
|
428
|
-
:queue_totals => {
|
429
|
-
:by_queue_name => queue_sizes,
|
430
|
-
:by_identifier => ident_sizes
|
431
|
-
},
|
432
|
-
:running_counts => running_counts,
|
433
|
-
:lock_count => lock_count,
|
434
|
-
:runnable_count => runnable_count,
|
435
|
-
}
|
468
|
+
return result
|
436
469
|
|
437
470
|
end
|
438
471
|
|
@@ -295,6 +295,25 @@ describe Resque::Plugins::ConcurrentRestriction do
|
|
295
295
|
ConcurrentRestrictionJob.runnables("somequeue2").sort.should == []
|
296
296
|
end
|
297
297
|
|
298
|
+
it "should track queue_counts" do
|
299
|
+
ConcurrentRestrictionJob.queue_counts.should == {}
|
300
|
+
|
301
|
+
job1 = Resque::Job.new("somequeue", {"class" => "ConcurrentRestrictionJob", "args" => [1]})
|
302
|
+
job2 = Resque::Job.new("somequeue", {"class" => "ConcurrentRestrictionJob", "args" => [2]})
|
303
|
+
job3 = Resque::Job.new("somequeue2", {"class" => "ConcurrentRestrictionJob", "args" => [3]})
|
304
|
+
|
305
|
+
ConcurrentRestrictionJob.push_to_restriction_queue(job1)
|
306
|
+
ConcurrentRestrictionJob.push_to_restriction_queue(job2)
|
307
|
+
ConcurrentRestrictionJob.push_to_restriction_queue(job3)
|
308
|
+
ConcurrentRestrictionJob.queue_counts.should == {"somequeue"=>2, "somequeue2"=>1}
|
309
|
+
|
310
|
+
ConcurrentRestrictionJob.pop_from_restriction_queue(ConcurrentRestrictionJob.tracking_key, "somequeue")
|
311
|
+
ConcurrentRestrictionJob.queue_counts.should == {"somequeue"=>1, "somequeue2"=>1}
|
312
|
+
|
313
|
+
ConcurrentRestrictionJob.pop_from_restriction_queue(ConcurrentRestrictionJob.tracking_key, "somequeue")
|
314
|
+
ConcurrentRestrictionJob.pop_from_restriction_queue(ConcurrentRestrictionJob.tracking_key, "somequeue2")
|
315
|
+
ConcurrentRestrictionJob.queue_counts.should == {"somequeue"=>0, "somequeue2"=>0}
|
316
|
+
end
|
298
317
|
end
|
299
318
|
|
300
319
|
context "#stash_if_restricted" do
|
@@ -456,6 +475,8 @@ describe Resque::Plugins::ConcurrentRestriction do
|
|
456
475
|
|
457
476
|
IdentifiedRestrictionJob.runnables.sort.should == [ConcurrentRestrictionJob.tracking_key, IdentifiedRestrictionJob.tracking_key(1), IdentifiedRestrictionJob.tracking_key(2)]
|
458
477
|
|
478
|
+
ConcurrentRestrictionJob.queue_counts.should == {"queue1"=>2, "queue2"=>2, "queue3"=>1}
|
479
|
+
|
459
480
|
end
|
460
481
|
|
461
482
|
end
|
@@ -464,11 +485,21 @@ describe Resque::Plugins::ConcurrentRestriction do
|
|
464
485
|
|
465
486
|
it "should have blank info when nothing going on" do
|
466
487
|
stats = ConcurrentRestrictionJob.stats
|
467
|
-
stats[:
|
468
|
-
stats[:
|
469
|
-
stats[:running_counts].should == {}
|
488
|
+
stats[:queues].should == {}
|
489
|
+
stats[:identifiers].should == {}
|
470
490
|
stats[:lock_count].should == 0
|
471
491
|
stats[:runnable_count].should == 0
|
492
|
+
estats = ConcurrentRestrictionJob.stats(true)
|
493
|
+
estats.should == stats
|
494
|
+
end
|
495
|
+
|
496
|
+
it "should not track identifiers when not extended" do
|
497
|
+
job1 = Resque::Job.new("queue1", {"class" => "IdentifiedRestrictionJob", "args" => [1]})
|
498
|
+
IdentifiedRestrictionJob.push_to_restriction_queue(job1)
|
499
|
+
IdentifiedRestrictionJob.set_running_count(IdentifiedRestrictionJob.tracking_key(1), 2)
|
500
|
+
|
501
|
+
stats = IdentifiedRestrictionJob.stats
|
502
|
+
stats[:identifiers].should == {}
|
472
503
|
end
|
473
504
|
|
474
505
|
it "should track queue_totals" do
|
@@ -484,17 +515,18 @@ describe Resque::Plugins::ConcurrentRestriction do
|
|
484
515
|
IdentifiedRestrictionJob.push_to_restriction_queue(job4)
|
485
516
|
ConcurrentRestrictionJob.push_to_restriction_queue(job5)
|
486
517
|
|
487
|
-
stats = IdentifiedRestrictionJob.stats
|
488
|
-
stats[:
|
489
|
-
|
518
|
+
stats = IdentifiedRestrictionJob.stats(true)
|
519
|
+
stats[:queues].should == {"queue1" => 2, "queue2" => 2, "queue3" => 1}
|
520
|
+
|
521
|
+
stats[:identifiers].should == {"IdentifiedRestrictionJob.1"=>{"queue1"=>1, "queue2"=>1}, "IdentifiedRestrictionJob.2"=>{"queue1"=>1, "queue2"=>1}, "ConcurrentRestrictionJob"=>{"queue3"=>1}}
|
490
522
|
end
|
491
523
|
|
492
524
|
it "should track running_counts" do
|
493
525
|
IdentifiedRestrictionJob.set_running_count(IdentifiedRestrictionJob.tracking_key(1), 2)
|
494
526
|
IdentifiedRestrictionJob.set_running_count(IdentifiedRestrictionJob.tracking_key(2), 3)
|
495
527
|
ConcurrentRestrictionJob.set_running_count(ConcurrentRestrictionJob.tracking_key, 4)
|
496
|
-
stats = IdentifiedRestrictionJob.stats
|
497
|
-
stats[:
|
528
|
+
stats = IdentifiedRestrictionJob.stats(true)
|
529
|
+
stats[:identifiers].should == {"IdentifiedRestrictionJob.1"=>{"running"=>2}, "IdentifiedRestrictionJob.2"=>{"running"=>3}, "ConcurrentRestrictionJob"=>{"running"=>4}}
|
498
530
|
end
|
499
531
|
|
500
532
|
it "should track lock_count" do
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: resque-concurrent-restriction
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.5.
|
5
|
+
version: 0.5.2
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Matt Conway
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-04-
|
13
|
+
date: 2011-04-11 00:00:00 -04:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|