From fe57069fdc856e3ae23e3e76fe3bd245a9e876c3 Mon Sep 17 00:00:00 2001 From: Kim Burgestrand Date: Wed, 11 Apr 2012 22:17:44 +0200 Subject: [PATCH] Have Redis tell us if perform_async succeeded If (for whatever reason) redis fails to add our work to the queue, make sure we reflect that in the return value. --- lib/sidekiq/client.rb | 5 ++--- test/test_client.rb | 9 ++++++++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/sidekiq/client.rb b/lib/sidekiq/client.rb index 04ec3af8..4a126632 100644 --- a/lib/sidekiq/client.rb +++ b/lib/sidekiq/client.rb @@ -41,14 +41,13 @@ module Sidekiq Sidekiq.client_middleware.invoke(worker_class, item, queue) do payload = MultiJson.encode(item) Sidekiq.redis do |conn| - conn.multi do + _, pushed = conn.multi do conn.sadd('queues', queue) conn.rpush("queue:#{queue}", payload) end end - pushed = true end - pushed + !! pushed end # Redis compatibility helper. Example usage: diff --git a/test/test_client.rb b/test/test_client.rb index 9cea8740..49813076 100644 --- a/test/test_client.rb +++ b/test/test_client.rb @@ -30,7 +30,7 @@ class TestClient < MiniTest::Unit::TestCase describe 'with mock redis' do before do @redis = MiniTest::Mock.new - def @redis.multi; yield if block_given?; end + def @redis.multi; [yield] * 2 if block_given?; end def @redis.set(*); true; end def @redis.sadd(*); true; end def @redis.srem(*); true; end @@ -74,6 +74,13 @@ class TestClient < MiniTest::Unit::TestCase @redis.verify end + it 'handles perform_async on failure' do + @redis.expect :rpush, nil, ['queue:default', String] + pushed = MyWorker.perform_async(1, 2) + refute pushed + @redis.verify + end + it 'enqueues messages to redis' do @redis.expect :rpush, 1, ['queue:default', String] pushed = Sidekiq::Client.enqueue(MyWorker, 1, 2)