From 56b55845d8b3d9dec091f25b00d8cf1ac9ebbcea Mon Sep 17 00:00:00 2001 From: Kevin Yank Date: Fri, 27 Jun 2014 17:35:50 +1000 Subject: [PATCH] Prevent exceptions caused by Sidekiq::Shutdown from causing jobs to be retried. Jobs in progress during a Sidekiq shutdown/restart are requeued for immediate execution. They should not also be queued for retry. This is an attempt at a cleaner fix than that proposed with mperham#1354, also discussed on mperham#897. Because it depends on Exception#cause, this fix will only be effective on Ruby 2.1.0; however, the code will run on earlier Rubies. --- lib/sidekiq/middleware/server/retry_jobs.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/sidekiq/middleware/server/retry_jobs.rb b/lib/sidekiq/middleware/server/retry_jobs.rb index 2e01a8c3..e33f9881 100644 --- a/lib/sidekiq/middleware/server/retry_jobs.rb +++ b/lib/sidekiq/middleware/server/retry_jobs.rb @@ -64,6 +64,12 @@ module Sidekiq # ignore, will be pushed back onto queue during hard_shutdown raise rescue Exception => e + # In Ruby 2.1.0 only, check if exception is a result of shutdown. + # If so, will be pushed back onto queue during hard_shutdown. + if defined?(e.cause) && e.cause.class == Sidekiq::Shutdown + raise Sidekiq::Shutdown + end + raise e unless msg['retry'] max_retry_attempts = retry_attempts_from(msg['retry'], @max_retries)