resque-concurrent-restriction 0.5.7 → 0.5.8

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG ADDED
@@ -0,0 +1,5 @@
1
+ 0.5.8 (06/07/2012)
2
+ ------------------
3
+
4
+ cut up keys and runnables into slices to prevent stack level too deep exceptions when deleting from redis <faecea7>
5
+
data/README.md CHANGED
@@ -5,6 +5,8 @@ Resque Concurrent Restriction is a plugin for the [Resque][0] queueing system (h
5
5
 
6
6
  Resque Concurrent Restriction requires Resque 1.10 and redis 2.2
7
7
 
8
+ [![Build Status](https://secure.travis-ci.org/wr0ngway/resque-concurrent-restriction.png)](http://travis-ci.org/wr0ngway/resque-concurrent-restriction)
9
+
8
10
  Install
9
11
  -------
10
12
 
@@ -15,18 +17,31 @@ To use
15
17
 
16
18
  It is especially useful when a system has intensive jobs for which you should only run a few at a time. What you should do for the IntensiveJob is to make it extend Resque::Plugins::ConcurrentRestriction and specify the concurrent limit (defaults to 1). For example:
17
19
 
18
- class IntensiveJob
19
- extend Resque::Plugins::ConcurrentRestriction
20
- concurrent 4
21
-
22
- #rest of your class here
23
- end
20
+ class IntensiveJob
21
+ extend Resque::Plugins::ConcurrentRestriction
22
+ concurrent 4
23
+
24
+ #rest of your class here
25
+ end
24
26
 
25
27
  That means the IntensiveJob can not have more than 4 jobs running simultaneously
26
28
 
29
+ One can also make the concurrency limit depend on the parameters of a job, for example, if you always pass a user_id as the first param, you can restrict the job to run N concurrent jobs per user:
30
+
31
+ class IntensiveJob
32
+ extend Resque::Plugins::ConcurrentRestriction
33
+ concurrent 4
34
+
35
+ def self.concurrent_identifier(*args)
36
+ args.first.to_s
37
+ end
38
+
39
+ #rest of your class here
40
+ end
41
+
27
42
  Author
28
43
  ------
29
- Code was originally forkd from the [resque-restriction][1] plugin (Richard Huang :: flyerhzm@gmail.com :: @flyerhzm), but diverged enough that it warranted being its own plugin to keep the code simple.
44
+ Code was originally forked from the [resque-restriction][1] plugin (Richard Huang :: flyerhzm@gmail.com :: @flyerhzm), but diverged enough that it warranted being its own plugin to keep the code simple.
30
45
 
31
46
  Matt Conway :: matt@conwaysplace.com :: @mattconway
32
47
 
@@ -442,10 +442,18 @@ module Resque
442
442
 
443
443
  counts_reset = 0
444
444
  count_keys = Resque.redis.keys("concurrent.count.*")
445
- counts_reset = Resque.redis.del(*count_keys) if count_keys.size > 0
445
+ if count_keys.size > 0
446
+ count_keys.each_slice(100000) do |key_slice|
447
+ counts_reset += Resque.redis.del(*key_slice)
448
+ end
449
+ end
446
450
 
447
451
  runnable_keys = Resque.redis.keys("concurrent.runnable*")
448
- Resque.redis.del(*runnable_keys) if runnable_keys.size > 0
452
+ if runnable_keys.size > 0
453
+ runnable_keys.each_slice(100000) do |runnable_slice|
454
+ Resque.redis.del(*runnable_slice)
455
+ end
456
+ end
449
457
 
450
458
  Resque.redis.del(queue_count_key)
451
459
  queues_enabled = 0
@@ -1,7 +1,7 @@
1
1
  module Resque
2
2
  module Plugins
3
3
  module ConcurrentRestriction
4
- VERSION = "0.5.7"
4
+ VERSION = "0.5.8"
5
5
  end
6
6
  end
7
7
  end
@@ -586,6 +586,28 @@ describe Resque::Plugins::ConcurrentRestriction do
586
586
 
587
587
  end
588
588
 
589
+ it "should handle a large amount of concurrent keys" do
590
+ # the ruby splat operator will choke on an arguments list greater than a couple hundred thousand objects. make sure this case is handled correctly
591
+ # It might be better to actually populate redis with a bunch keys but that makes the test pretty slow
592
+
593
+ # we have to keep this splat limitation in mind when populating test data, too
594
+ concurrent_count_keys = 200001.times.collect{ |i| ["concurrent.count.#{i}", "#{i}"] }.flatten
595
+ concurrent_count_keys.each_slice(100000) do |slice|
596
+ Resque.redis.mset *slice
597
+ end
598
+
599
+ concurrent_runnable_keys = 200001.times.collect{ |i| ["concurrent.runnable.#{i}", "#{i}"] }.flatten
600
+ concurrent_runnable_keys.each_slice(100000) do |slice|
601
+ Resque.redis.mset *slice
602
+ end
603
+
604
+ return_value = nil
605
+
606
+ lambda{ return_value = ConcurrentRestrictionJob.reset_restrictions }.should_not raise_exception
607
+
608
+ return_value.should == [200001, 0]
609
+ end
610
+
589
611
  end
590
612
 
591
613
  context "#stats" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: resque-concurrent-restriction
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.7
4
+ version: 0.5.8
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-24 00:00:00.000000000 Z
12
+ date: 2012-06-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: resque
@@ -100,6 +100,7 @@ extra_rdoc_files: []
100
100
  files:
101
101
  - .gitignore
102
102
  - .travis.yml
103
+ - CHANGELOG
103
104
  - Gemfile
104
105
  - LICENSE
105
106
  - README.md