resque-workers-lock 1.3 → 1.4
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/Rakefile +2 -0
- data/lib/resque/plugins/workers/lock.rb +20 -18
- data/test/lock_test.rb +52 -27
- metadata +2 -2
data/Rakefile
CHANGED
@@ -1,42 +1,44 @@
|
|
1
|
+
require 'resque'
|
2
|
+
|
1
3
|
module Resque
|
2
4
|
alias_method :orig_remove_queue, :remove_queue
|
3
|
-
|
5
|
+
|
4
6
|
def remove_queue(queue)
|
5
7
|
Resque.redis.keys('enqueuelock:*').collect { |x| Resque.redis.del(x) }.count
|
6
8
|
Resque.redis.keys('workerslock:*').collect { |x| Resque.redis.del(x) }.count
|
7
|
-
|
9
|
+
|
8
10
|
orig_remove_queue(queue)
|
9
11
|
end
|
10
|
-
|
12
|
+
|
11
13
|
module Plugins
|
12
14
|
module Workers
|
13
15
|
module Lock
|
14
|
-
|
16
|
+
|
15
17
|
# Override in your job to control the queue lock key
|
16
18
|
def lock_enqueue(*args)
|
17
19
|
"#{name}-#{args.to_s}"
|
18
20
|
end
|
19
|
-
|
21
|
+
|
20
22
|
def get_lock_enqueue(*args)
|
21
23
|
"enqueuelock:"+lock_enqueue(*args).to_s
|
22
24
|
end
|
23
|
-
|
25
|
+
|
24
26
|
# Override in your job to control the workers lock key.
|
25
27
|
def lock_workers(*args)
|
26
28
|
"#{name}-#{args.to_s}"
|
27
29
|
end
|
28
|
-
|
30
|
+
|
29
31
|
def get_lock_workers(*args)
|
30
32
|
"workerslock:"+lock_workers(*args).to_s
|
31
33
|
end
|
32
|
-
|
34
|
+
|
33
35
|
# Override in your job to change the perform requeue delay
|
34
36
|
def requeue_perform_delay
|
35
37
|
1.0
|
36
38
|
end
|
37
|
-
|
38
|
-
|
39
|
-
# Called with the job args before a job is placed on the queue.
|
39
|
+
|
40
|
+
|
41
|
+
# Called with the job args before a job is placed on the queue.
|
40
42
|
# If the hook returns false, the job will not be placed on the queue.
|
41
43
|
def before_enqueue_lock(*args)
|
42
44
|
if lock_enqueue(*args) == false
|
@@ -45,8 +47,8 @@ module Resque
|
|
45
47
|
return Resque.redis.setnx(get_lock_enqueue(*args), true)
|
46
48
|
end
|
47
49
|
end
|
48
|
-
|
49
|
-
# Called with the job args before perform.
|
50
|
+
|
51
|
+
# Called with the job args before perform.
|
50
52
|
# If it raises Resque::Job::DontPerform, the job is aborted.
|
51
53
|
def before_perform_lock(*args)
|
52
54
|
if lock_workers(*args)
|
@@ -59,12 +61,12 @@ module Resque
|
|
59
61
|
end
|
60
62
|
end
|
61
63
|
end
|
62
|
-
|
64
|
+
|
63
65
|
def after_dequeue_lock(*args)
|
64
66
|
# Clear the lock when dequeueed
|
65
67
|
Resque.redis.del(get_lock_enqueue(*args))
|
66
68
|
end
|
67
|
-
|
69
|
+
|
68
70
|
def around_perform_lock(*args)
|
69
71
|
begin
|
70
72
|
yield
|
@@ -74,14 +76,14 @@ module Resque
|
|
74
76
|
Resque.redis.del(get_lock_enqueue(*args))
|
75
77
|
end
|
76
78
|
end
|
77
|
-
|
79
|
+
|
78
80
|
def on_failure_lock(exception, *args)
|
79
81
|
# Clear the lock on DirtyExit
|
80
82
|
Resque.redis.del(get_lock_workers(*args))
|
81
83
|
Resque.redis.del(get_lock_enqueue(*args))
|
82
84
|
end
|
83
|
-
|
85
|
+
|
84
86
|
end
|
85
87
|
end
|
86
88
|
end
|
87
|
-
end
|
89
|
+
end
|
data/test/lock_test.rb
CHANGED
@@ -1,9 +1,6 @@
|
|
1
1
|
require 'test/unit'
|
2
|
-
require 'resque'
|
3
2
|
require 'resque/plugins/workers/lock'
|
4
3
|
|
5
|
-
$counter = 0
|
6
|
-
|
7
4
|
class LockTest < Test::Unit::TestCase
|
8
5
|
class SimilarJob
|
9
6
|
extend Resque::Plugins::Workers::Lock
|
@@ -13,19 +10,19 @@ class LockTest < Test::Unit::TestCase
|
|
13
10
|
raise "Woah woah! How did this happen?"
|
14
11
|
end
|
15
12
|
end
|
16
|
-
|
13
|
+
|
17
14
|
class UniqueJob
|
18
15
|
extend Resque::Plugins::Workers::Lock
|
19
16
|
@queue = :lock_test
|
20
|
-
|
17
|
+
|
21
18
|
def self.lock_enqueue(id)
|
22
19
|
return id.to_s+"e"
|
23
20
|
end
|
24
|
-
|
21
|
+
|
25
22
|
def self.lock_workers(id)
|
26
23
|
return id.to_s+"w"
|
27
24
|
end
|
28
|
-
|
25
|
+
|
29
26
|
def self.perform(id)
|
30
27
|
raise "Woah woah! How did this happen?"
|
31
28
|
end
|
@@ -43,46 +40,74 @@ class LockTest < Test::Unit::TestCase
|
|
43
40
|
end
|
44
41
|
end
|
45
42
|
|
46
|
-
def test_version
|
47
|
-
major, minor, patch = Resque::Version.split('.')
|
48
|
-
assert_equal 1, major.to_i
|
49
|
-
assert minor.to_i >= 17
|
50
|
-
assert Resque::Plugin.respond_to?(:before_enqueue_hooks)
|
51
|
-
end
|
52
|
-
|
53
43
|
def test_enqueue
|
54
44
|
3.times { Resque.enqueue(SimilarJob) }
|
55
45
|
|
56
46
|
assert_equal "LockTest::SimilarJob-[]", SimilarJob.lock_workers
|
57
47
|
assert_equal "LockTest::SimilarJob-[]", SimilarJob.lock_enqueue
|
58
48
|
assert_equal 1, Resque.redis.llen('queue:lock_test')
|
59
|
-
|
49
|
+
|
60
50
|
3.times do |i|
|
61
51
|
Resque.enqueue(UniqueJob, i+100)
|
62
52
|
assert_equal i.to_s+"e", UniqueJob.lock_enqueue(i)
|
63
53
|
assert_equal i.to_s+"w", UniqueJob.lock_workers(i)
|
64
54
|
end
|
65
|
-
|
55
|
+
|
66
56
|
assert_equal 4, Resque.redis.llen('queue:lock_test')
|
67
|
-
|
57
|
+
|
68
58
|
# Test for complete queue wipe
|
69
59
|
Resque.remove_queue(:lock_test)
|
70
|
-
|
60
|
+
|
71
61
|
Resque.enqueue(SimilarJob)
|
72
62
|
assert_equal 1, Resque.redis.llen('queue:lock_test')
|
73
63
|
end
|
74
|
-
|
64
|
+
|
75
65
|
def test_zcleanup
|
76
66
|
Resque.remove_queue(:lock_test)
|
77
|
-
|
78
|
-
Resque.redis.keys('enqueuelock:*').collect { |x| Resque.redis.del(x) }
|
79
|
-
Resque.redis.keys('workerslock:*').collect { |x| Resque.redis.del(x) }
|
80
|
-
|
67
|
+
|
68
|
+
Resque.redis.keys('enqueuelock:*').collect { |x| Resque.redis.del(x) }
|
69
|
+
Resque.redis.keys('workerslock:*').collect { |x| Resque.redis.del(x) }
|
70
|
+
|
81
71
|
assert_equal 0, Resque.redis.llen('queue:lock_test')
|
82
72
|
end
|
83
|
-
|
73
|
+
|
74
|
+
# Sleep job, for testing that two workers are not processing two jobs with
|
75
|
+
# the same lock.
|
76
|
+
class SimilarSleepJob
|
77
|
+
extend Resque::Plugins::Workers::Lock
|
78
|
+
@queue = :lock_test_workers
|
79
|
+
|
80
|
+
def self.lock_enqueue(id)
|
81
|
+
false
|
82
|
+
end
|
83
|
+
|
84
|
+
def self.lock_workers(id)
|
85
|
+
return id.to_s
|
86
|
+
end
|
87
|
+
|
88
|
+
def self.perform(id)
|
89
|
+
File.open('test/test.txt', 'a') {|f| f.write('1') }
|
90
|
+
sleep(5)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# To test this, make sure to run `TERM_CHILD=1 COUNT=2 VVERBOSE=1 QUEUES=* rake resque:work`
|
84
95
|
def test_lock
|
85
|
-
|
86
|
-
|
96
|
+
2.times { Resque.enqueue(SimilarSleepJob, 'writing_and_sleeping') }
|
97
|
+
SimilarSleepJob.perform('abc')
|
98
|
+
|
99
|
+
# After 3 seconds only 1 job had the change of running
|
100
|
+
sleep(3)
|
101
|
+
file = File.open('test/test.txt', 'rb')
|
102
|
+
contents = file.read
|
103
|
+
file.close
|
104
|
+
assert_equal '1', contents
|
105
|
+
|
106
|
+
# After 12 seconds the 2 jobs should have been processed (not at the same time because of the lock)
|
107
|
+
sleep(12)
|
108
|
+
file = File.open('test/test.txt', 'rb')
|
109
|
+
contents = file.read
|
110
|
+
file.close
|
111
|
+
assert_equal '11', contents
|
87
112
|
end
|
88
|
-
end
|
113
|
+
end
|
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.
|
4
|
+
version: '1.4'
|
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-
|
12
|
+
date: 2012-11-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: resque
|