From a2db45bc0c57454358c728f42d49cdb18639ac44 Mon Sep 17 00:00:00 2001 From: Mike Perham Date: Mon, 15 Jan 2018 10:39:32 -0800 Subject: [PATCH] Polish job failure notification --- lib/sidekiq.rb | 1 + lib/sidekiq/api.rb | 12 +++++++++++- lib/sidekiq/job_retry.rb | 2 +- lib/sidekiq/processor.rb | 3 ++- test/test_api.rb | 4 ++-- 5 files changed, 17 insertions(+), 5 deletions(-) diff --git a/lib/sidekiq.rb b/lib/sidekiq.rb index 5dce77b7..ec03bce5 100644 --- a/lib/sidekiq.rb +++ b/lib/sidekiq.rb @@ -159,6 +159,7 @@ module Sidekiq def self.default_retries_exhausted=(prok) logger.info { "default_retries_exhausted is deprecated, please use `config.failure_handlers << -> {|job, ex| }`" } + return nil unless prok failure_handlers << prok end diff --git a/lib/sidekiq/api.rb b/lib/sidekiq/api.rb index e4c1c737..93b92cda 100644 --- a/lib/sidekiq/api.rb +++ b/lib/sidekiq/api.rb @@ -656,7 +656,7 @@ module Sidekiq super 'dead' end - def kill(message) + def kill(message, opts={}) now = Time.now.to_f Sidekiq.redis do |conn| conn.multi do @@ -665,6 +665,16 @@ module Sidekiq conn.zremrangebyrank(name, 0, - self.class.max_jobs) end end + + if opts[:notify_failure] != false + job = Sidekiq.load_json(message) + r = RuntimeError.new("Job killed by API") + r.set_backtrace(caller) + Sidekiq.failure_handlers.each do |handle| + handle.call(job, r) + end + end + true end def retry_all diff --git a/lib/sidekiq/job_retry.rb b/lib/sidekiq/job_retry.rb index 017b0cb9..1fa24969 100644 --- a/lib/sidekiq/job_retry.rb +++ b/lib/sidekiq/job_retry.rb @@ -192,7 +192,7 @@ module Sidekiq def send_to_morgue(msg) Sidekiq.logger.info { "Adding dead #{msg['class']} job #{msg['jid']}" } payload = Sidekiq.dump_json(msg) - DeadSet.new.kill(payload) + DeadSet.new.kill(payload, notify_failure: false) end def retry_attempts_from(msg_retry, default) diff --git a/lib/sidekiq/processor.rb b/lib/sidekiq/processor.rb index 9f1db552..0cfc73ed 100644 --- a/lib/sidekiq/processor.rb +++ b/lib/sidekiq/processor.rb @@ -157,7 +157,8 @@ module Sidekiq job_hash = Sidekiq.load_json(jobstr) rescue => ex handle_exception(ex, { :context => "Invalid JSON for job", :jobstr => jobstr }) - DeadSet.new.kill(jobstr) + # we can't notify because the job isn't a valid hash payload. + DeadSet.new.kill(jobstr, notify_failure: false) ack = true raise end diff --git a/test/test_api.rb b/test/test_api.rb index b983826f..7c38b816 100644 --- a/test/test_api.rb +++ b/test/test_api.rb @@ -320,11 +320,11 @@ class TestApi < Sidekiq::Test end it 'can kill a scheduled job' do - job_id = ApiWorker.perform_in(100, 1, 'jason') + job_id = ApiWorker.perform_in(100, 1, '{"foo":123}') job = Sidekiq::ScheduledSet.new.find_job(job_id) ds = Sidekiq::DeadSet.new assert_equal 0, ds.size - refute_nil job.kill + job.kill assert_equal 1, ds.size end