resque-serial-queues 0.0.2 → 0.0.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
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e19304f340b143c7376d8cc03dd7d81bec8b74c3
|
4
|
+
data.tar.gz: 86ed33dcccfcafb040c117666699765858190960
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d668ba3a3707d79e788f555a996e04e89ca3c5529062e8be643d0315d658bbe5cbc811b69d7c64c083e2ca8df2bae9388368fbd05d755940c9ac60a14fa9e904
|
7
|
+
data.tar.gz: 0a57e248988a019a1f717a06eae19c1b29f32da4ac70a60bba38da0da0446423c110045fd63967f448a05c2d38f21e381ba7723ff53d7ea659f210b3682d6509
|
@@ -17,6 +17,10 @@ module Resque
|
|
17
17
|
config.serial_queues.include?(queue.to_s)
|
18
18
|
end
|
19
19
|
|
20
|
+
def self.is_queue_locked?(queue)
|
21
|
+
redis.exists("queue-lock:#{queue}")
|
22
|
+
end
|
23
|
+
|
20
24
|
def self.lock_queue(queue)
|
21
25
|
if redis.setnx("queue-lock:#{queue}", 1)
|
22
26
|
redis.expire("queue-lock:#{queue}", config.lock_timeout)
|
@@ -26,10 +30,6 @@ module Resque
|
|
26
30
|
end
|
27
31
|
end
|
28
32
|
|
29
|
-
def self.is_queue_locked?(queue)
|
30
|
-
redis.exists("queue-lock:#{queue}")
|
31
|
-
end
|
32
|
-
|
33
33
|
def self.unlock_queue(queue)
|
34
34
|
redis.del("queue-lock:#{queue}")
|
35
35
|
end
|
@@ -3,10 +3,18 @@ require 'resque/job'
|
|
3
3
|
|
4
4
|
class Resque::Job
|
5
5
|
def self.reserve(queue)
|
6
|
+
return if queue=="*"
|
6
7
|
return if is_serial_queue?(queue) and is_queue_locked?(queue)
|
7
|
-
return
|
8
|
-
|
9
|
-
|
8
|
+
return if is_serial_queue?(queue) and Resque.peek(queue) and not lock_queue(queue)
|
9
|
+
if payload = Resque.pop(queue)
|
10
|
+
new(queue, payload)
|
11
|
+
else
|
12
|
+
unlock_queue(queue)
|
13
|
+
nil
|
14
|
+
end
|
15
|
+
rescue Exception => e
|
16
|
+
unlock_queue(queue)
|
17
|
+
nil
|
10
18
|
end
|
11
19
|
|
12
20
|
protected
|
@@ -21,6 +29,10 @@ class Resque::Job
|
|
21
29
|
def self.lock_queue(queue)
|
22
30
|
Resque::Plugins::SerialQueues.lock_queue(queue)
|
23
31
|
end
|
32
|
+
|
33
|
+
def self.unlock_queue(queue)
|
34
|
+
Resque::Plugins::SerialQueues.unlock_queue(queue)
|
35
|
+
end
|
24
36
|
end
|
25
37
|
|
26
38
|
class Object
|
data/test/cases/locking_test.rb
CHANGED
@@ -39,37 +39,34 @@ class LockingTest < ResqueSerialQueuesTest
|
|
39
39
|
def test_a_queue_is_not_locked_after_running
|
40
40
|
self.class.start_redis_workers 1
|
41
41
|
Resque.enqueue SleepingJob, 0.1
|
42
|
-
sleep
|
42
|
+
sleep 1
|
43
43
|
assert_queue_unlocked :serial_jobs
|
44
44
|
end
|
45
45
|
|
46
46
|
def test_a_queue_is_not_locked_after_a_job_fails
|
47
47
|
self.class.start_redis_workers 1
|
48
48
|
Resque.enqueue DelayedFailingJob, 0.1
|
49
|
-
sleep
|
49
|
+
sleep 1
|
50
50
|
assert_queue_unlocked :serial_jobs
|
51
51
|
end
|
52
52
|
|
53
53
|
def test_running_many_concurrent_jobs
|
54
|
-
jobs =
|
55
|
-
max_sleep = 0.
|
56
|
-
workers =
|
54
|
+
jobs = 5000
|
55
|
+
max_sleep = 0.5
|
56
|
+
workers = 5
|
57
57
|
self.class.start_redis_workers workers
|
58
58
|
jobs.times do
|
59
59
|
Resque.enqueue BenchmarkJob, max_sleep
|
60
60
|
end
|
61
|
-
assert_queue_locked :serial_jobs
|
62
61
|
while Resque.info[:pending]>0
|
63
|
-
sleep
|
64
|
-
assert Resque.info[:working]<=1, "Should not have more than one working worker"
|
62
|
+
sleep 1
|
65
63
|
end
|
66
|
-
assert_queue_unlocked :serial_jobs
|
67
64
|
results = []
|
68
65
|
while row = Resque::Plugins::SerialQueues.redis.lpop("benchmark-results")
|
69
66
|
results << row.split("-").map(&:to_f)
|
70
67
|
end
|
71
68
|
results.flatten!
|
72
|
-
assert_equal results, results.sort
|
69
|
+
assert_equal results, results.sort, "Workers times seems to overlap"
|
73
70
|
end
|
74
71
|
|
75
72
|
end
|
data/test/minitest_helper.rb
CHANGED
@@ -70,14 +70,23 @@ class ResqueSerialQueuesTest < Minitest::Test
|
|
70
70
|
raise "Failed to start worker"
|
71
71
|
end
|
72
72
|
else
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
73
|
+
begin
|
74
|
+
Resque.redis.client.reconnect
|
75
|
+
# we need to prevent against querying for jobs in "*"
|
76
|
+
Resque.watch_queue :test_queue
|
77
|
+
# Resque.logger = MonoLogger.new(File.open(File.expand_path('../../log', __FILE__) << "/resque-#{Process.pid}.log", "w+"))
|
78
|
+
# Resque.logger.level = Logger::DEBUG
|
79
|
+
# Resque.logger.formatter = Resque::VerboseFormatter.new
|
80
|
+
worker = Resque::Worker.new("*")
|
81
|
+
worker.term_timeout = 4.0
|
82
|
+
worker.term_child = true
|
83
|
+
log "Worker will start working"
|
84
|
+
worker.work 0.1
|
85
|
+
Kernel.exit!
|
86
|
+
rescue Exception => e
|
87
|
+
log "Failed to start worker: #{e.inspect}"
|
88
|
+
Kernel.exit!
|
89
|
+
end
|
81
90
|
end
|
82
91
|
end
|
83
92
|
|