resque-serial-queues 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
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
|
|