resque-workers-lock 1.0.6 → 1.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.
- data/README.md +2 -2
- data/lib/resque/plugins/workers/lock.rb +17 -12
- data/test/lock_test.rb +43 -5
- metadata +2 -2
data/README.md
CHANGED
@@ -23,12 +23,12 @@ class Parser
|
|
23
23
|
extend Resque::Plugins::Workers::Lock
|
24
24
|
|
25
25
|
# Lock method has the same arguments as the self.perform
|
26
|
-
def self.
|
26
|
+
def self.lock_workers(domain, arg2, arg3)
|
27
27
|
return domain
|
28
28
|
end
|
29
29
|
|
30
30
|
# Turn off standard resque-lock functionality
|
31
|
-
def self.
|
31
|
+
def self.lock_enqueue(domain, arg2, arg3)
|
32
32
|
false
|
33
33
|
end
|
34
34
|
|
@@ -4,12 +4,12 @@ module Resque
|
|
4
4
|
module Lock
|
5
5
|
|
6
6
|
# Override in your job to control the queue lock key
|
7
|
-
def
|
7
|
+
def lock_enqueue(*args)
|
8
8
|
"enqueuelock:#{name}-#{args.to_s}"
|
9
9
|
end
|
10
10
|
|
11
11
|
# Override in your job to control the workers lock key.
|
12
|
-
def
|
12
|
+
def lock_workers(*args)
|
13
13
|
"workerslock:#{name}-#{args.to_s}"
|
14
14
|
end
|
15
15
|
|
@@ -18,20 +18,25 @@ module Resque
|
|
18
18
|
1.0
|
19
19
|
end
|
20
20
|
|
21
|
+
|
22
|
+
# Called with the job args before a job is placed on the queue.
|
23
|
+
# If the hook returns false, the job will not be placed on the queue.
|
21
24
|
def before_enqueue_lock(*args)
|
22
|
-
if
|
23
|
-
return Resque.redis.setnx(enqueue_lock(*args), true)
|
24
|
-
else
|
25
|
+
if lock_enqueue(*args) == false
|
25
26
|
return true
|
27
|
+
else
|
28
|
+
return Resque.redis.setnx(lock_enqueue(*args).to_s, true)
|
26
29
|
end
|
27
30
|
end
|
28
31
|
|
32
|
+
# Called with the job args before perform.
|
33
|
+
# If it raises Resque::Job::DontPerform, the job is aborted.
|
29
34
|
def before_perform_lock(*args)
|
30
|
-
if
|
31
|
-
nx = Resque.redis.setnx(
|
35
|
+
if lock_workers(*args)
|
36
|
+
nx = Resque.redis.setnx(lock_workers(*args).to_s, true)
|
32
37
|
if nx == false
|
33
38
|
sleep(requeue_perform_delay)
|
34
|
-
Resque.redis.del(
|
39
|
+
Resque.redis.del(lock_enqueue(*args).to_s)
|
35
40
|
Resque.enqueue(self, *args)
|
36
41
|
raise Resque::Job::DontPerform
|
37
42
|
end
|
@@ -43,15 +48,15 @@ module Resque
|
|
43
48
|
yield
|
44
49
|
ensure
|
45
50
|
# Clear the lock. (even with errors)
|
46
|
-
Resque.redis.del(
|
47
|
-
Resque.redis.del(
|
51
|
+
Resque.redis.del(lock_workers(*args).to_s)
|
52
|
+
Resque.redis.del(lock_enqueue(*args).to_s)
|
48
53
|
end
|
49
54
|
end
|
50
55
|
|
51
56
|
def on_failure_lock(exception, *args)
|
52
57
|
# Clear the lock on DirtyExit
|
53
|
-
Resque.redis.del(
|
54
|
-
Resque.redis.del(
|
58
|
+
Resque.redis.del(lock_workers(*args).to_s)
|
59
|
+
Resque.redis.del(lock_enqueue(*args).to_s)
|
55
60
|
end
|
56
61
|
|
57
62
|
end
|
data/test/lock_test.rb
CHANGED
@@ -5,19 +5,36 @@ require 'resque/plugins/workers/lock'
|
|
5
5
|
$counter = 0
|
6
6
|
|
7
7
|
class LockTest < Test::Unit::TestCase
|
8
|
-
class
|
8
|
+
class SimilarJob
|
9
9
|
extend Resque::Plugins::Workers::Lock
|
10
10
|
@queue = :lock_test
|
11
11
|
|
12
12
|
def self.perform
|
13
|
-
raise "
|
13
|
+
raise "Woah woah! How did this happen?"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class UniqueJob
|
18
|
+
extend Resque::Plugins::Workers::Lock
|
19
|
+
@queue = :lock_test
|
20
|
+
|
21
|
+
#def self.lock_enqueue(id)
|
22
|
+
# return id.to_s
|
23
|
+
#end
|
24
|
+
|
25
|
+
def self.lock_workers(id)
|
26
|
+
return id.to_s
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.perform(id)
|
30
|
+
raise "Woah woah! How did this happen?"
|
14
31
|
end
|
15
32
|
end
|
16
33
|
|
17
34
|
def setup
|
18
35
|
Resque.redis.del('queue:lock_test')
|
19
|
-
Resque.redis.del(
|
20
|
-
Resque.redis.del(
|
36
|
+
Resque.redis.del(SimilarJob.lock_workers)
|
37
|
+
Resque.redis.del(SimilarJob.lock_enqueue)
|
21
38
|
end
|
22
39
|
|
23
40
|
def test_lint
|
@@ -34,9 +51,30 @@ class LockTest < Test::Unit::TestCase
|
|
34
51
|
end
|
35
52
|
|
36
53
|
def test_enqueue
|
37
|
-
3.times { Resque.enqueue(
|
54
|
+
3.times { Resque.enqueue(SimilarJob) }
|
38
55
|
|
56
|
+
assert_equal "workerslock:LockTest::SimilarJob-[]", SimilarJob.lock_workers
|
57
|
+
assert_equal "enqueuelock:LockTest::SimilarJob-[]", SimilarJob.lock_enqueue
|
39
58
|
assert_equal 1, Resque.redis.llen('queue:lock_test')
|
59
|
+
|
60
|
+
3.times do |i|
|
61
|
+
Resque.enqueue(UniqueJob, (i+100).to_s)
|
62
|
+
#assert_equal i.to_s, UniqueJob.lock_enqueue(i.to_s)
|
63
|
+
assert_equal i.to_s, UniqueJob.lock_workers(i.to_s)
|
64
|
+
end
|
65
|
+
|
66
|
+
assert_equal 4, Resque.redis.llen('queue:lock_test')
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_zcleanup
|
70
|
+
Resque.redis.del(SimilarJob.lock_workers)
|
71
|
+
Resque.redis.del(SimilarJob.lock_enqueue)
|
72
|
+
|
73
|
+
3.times do |i|
|
74
|
+
Resque.redis.del(UniqueJob.lock_enqueue((i+100).to_s))
|
75
|
+
end
|
76
|
+
Resque.redis.del('queue:lock_test')
|
77
|
+
assert_equal 0, Resque.redis.llen('queue:lock_test')
|
40
78
|
end
|
41
79
|
|
42
80
|
def test_lock
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: resque-workers-lock
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.7
|
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-07-
|
12
|
+
date: 2012-07-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: resque
|