Skip to content

Commit afaa497

Browse files
alindemansteveklabnik
authored andcommitted
Workers started with QUEUE=* do not cause error when there are no queues
* This should rarely happen (if at all) in production, but in development, we ran into annoying situations if Redis were cleared and we tried to start a catch-all Resque worker (via Foreman). * The worker that is started will not process jobs, but at least it will not die immediately with a bad exit code (which would stop all processes in Foreman, for instance).
1 parent 5f3b39c commit afaa497

File tree

2 files changed

+31
-10
lines changed

2 files changed

+31
-10
lines changed

lib/resque/multi_queue.rb

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,15 @@ def pop(non_block = false)
4646
end
4747
else
4848
queue_names = @queues.map {|queue| queue.redis_name }
49-
synchronize do
50-
value = @redis.blpop(*(queue_names + [1])) until value
51-
queue_name, payload = value
49+
if queue_names.any?
50+
synchronize do
51+
value = @redis.blpop(*(queue_names + [1])) until value
52+
queue_name, payload = value
5253
queue = @queue_hash["#{@redis.namespace}:#{queue_name}"]
53-
[queue, queue.decode(payload)]
54+
[queue, queue.decode(payload)]
55+
end
56+
else
57+
Kernel.sleep # forever
5458
end
5559
end
5660
end
@@ -61,12 +65,17 @@ def pop(non_block = false)
6165
# the timeout expires.
6266
def poll(timeout)
6367
queue_names = @queues.map {|queue| queue.redis_name }
64-
queue_name, payload = @redis.blpop(*(queue_names + [timeout]))
65-
return unless payload
68+
if queue_names.any?
69+
queue_name, payload = @redis.blpop(*(queue_names + [timeout]))
70+
return unless payload
6671

67-
synchronize do
68-
queue = @queue_hash["#{@redis.namespace}:#{queue_name}"]
69-
[queue, queue.decode(payload)]
72+
synchronize do
73+
queue = @queue_hash["#{@redis.namespace}:#{queue_name}"]
74+
[queue, queue.decode(payload)]
75+
end
76+
else
77+
Kernel.sleep(timeout)
78+
nil
7079
end
7180
end
7281
end

test/multi_queue_test.rb

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
require "test_helper"
22

3-
describe "Resque::MulitQueue" do
3+
describe "Resque::MultiQueue" do
44
let(:redis) { Resque.redis }
55
let(:coder) { Resque::MultiJsonCoder.new }
66

@@ -15,6 +15,11 @@
1515
assert_nil queue.poll(1)
1616
end
1717

18+
it "poll is a no-op when queues are empty" do
19+
queue = Resque::MultiQueue.new([], redis)
20+
assert_nil queue.poll(1)
21+
end
22+
1823
it "blocks on pop" do
1924
foo = Resque::Queue.new 'foo', redis, coder
2025
bar = Resque::Queue.new 'bar', redis, coder
@@ -92,4 +97,11 @@
9297

9398
assert_equal processed_queues, queues
9499
end
100+
101+
it "blocking pop is a no-op if queues are empty" do
102+
queue = Resque::MultiQueue.new([], redis)
103+
assert_raises Timeout::Error do
104+
Timeout.timeout(2) { queue.pop }
105+
end
106+
end
95107
end

0 commit comments

Comments
 (0)