From 63be43f5e173ac73f865b2420ca30cbc4e00c95c Mon Sep 17 00:00:00 2001 From: Abdelkader Boudih Date: Mon, 28 Jul 2014 20:42:06 +0000 Subject: [PATCH] [WEB UI] Add Kill button to retriable jobs, closes #1866 --- lib/sidekiq/api.rb | 20 ++++++++++++++++++++ lib/sidekiq/middleware/server/retry_jobs.rb | 4 ++-- lib/sidekiq/web.rb | 12 +++++++----- test/test_web.rb | 11 +++++++++++ web/locales/de.yml | 1 + web/locales/en.yml | 1 + web/locales/es.yml | 1 + web/locales/fr.yml | 1 + web/locales/it.yml | 1 + web/locales/ru.yml | 1 + web/views/retries.erb | 1 + 11 files changed, 47 insertions(+), 7 deletions(-) diff --git a/lib/sidekiq/api.rb b/lib/sidekiq/api.rb index 32e8b8fe..59855143 100644 --- a/lib/sidekiq/api.rb +++ b/lib/sidekiq/api.rb @@ -316,6 +316,23 @@ module Sidekiq end end + ## + # Place job in the dead set + def kill + raise 'Kill not available on jobs which have not failed' unless item['failed_at'] + remove_job do |message| + Sidekiq.logger.info { "Killing job #{message['jid']}" } + now = Time.now.to_f + Sidekiq.redis do |conn| + conn.multi do + conn.zadd('dead', now, message) + conn.zremrangebyscore('dead', '-inf', now - DeadSet::DEAD_JOB_TIMEOUT) + conn.zremrangebyrank('dead', 0, - DeadSet::MAX_JOBS) + end + end + end + end + private def remove_job @@ -500,6 +517,9 @@ module Sidekiq end class DeadSet < JobSet + DEAD_JOB_TIMEOUT = 180 * 24 * 60 * 60 # 6 months + MAX_JOBS = 10_000 + def initialize super 'dead' end diff --git a/lib/sidekiq/middleware/server/retry_jobs.rb b/lib/sidekiq/middleware/server/retry_jobs.rb index 90da53d6..2ce2448c 100644 --- a/lib/sidekiq/middleware/server/retry_jobs.rb +++ b/lib/sidekiq/middleware/server/retry_jobs.rb @@ -135,8 +135,8 @@ module Sidekiq Sidekiq.redis do |conn| conn.multi do conn.zadd('dead', now, payload) - conn.zremrangebyscore('dead', '-inf', now - DEAD_JOB_TIMEOUT) - conn.zremrangebyrank('dead', 0, -MAX_JOBS) + conn.zremrangebyscore('dead', '-inf', now - DeadSet::DEAD_JOB_TIMEOUT) + conn.zremrangebyrank('dead', 0, -DeadSet::MAX_JOBS) end end end diff --git a/lib/sidekiq/web.rb b/lib/sidekiq/web.rb index 6a854783..d2e6158b 100644 --- a/lib/sidekiq/web.rb +++ b/lib/sidekiq/web.rb @@ -100,7 +100,7 @@ module Sidekiq params['key'].each do |key| job = Sidekiq::DeadSet.new.fetch(*parse_params(key)).first - retry_or_delete job, params if job + retry_or_delete_or_kill job, params if job end redirect_with_query("#{root_path}morgue") end @@ -118,7 +118,7 @@ module Sidekiq post "/morgue/:key" do halt 404 unless params['key'] job = Sidekiq::DeadSet.new.fetch(*parse_params(params['key'])).first - retry_or_delete job, params if job + retry_or_delete_or_kill job, params if job redirect_with_query("#{root_path}morgue") end @@ -142,7 +142,7 @@ module Sidekiq params['key'].each do |key| job = Sidekiq::RetrySet.new.fetch(*parse_params(key)).first - retry_or_delete job, params if job + retry_or_delete_or_kill job, params if job end redirect_with_query("#{root_path}retries") end @@ -160,7 +160,7 @@ module Sidekiq post "/retries/:key" do halt 404 unless params['key'] job = Sidekiq::RetrySet.new.fetch(*parse_params(params['key'])).first - retry_or_delete job, params if job + retry_or_delete_or_kill job, params if job redirect_with_query("#{root_path}retries") end @@ -227,11 +227,13 @@ module Sidekiq private - def retry_or_delete job, params + def retry_or_delete_or_kill job, params if params['retry'] job.retry elsif params['delete'] job.delete + elsif params['kill'] + job.kill end end diff --git a/test/test_web.rb b/test/test_web.rb index d910578e..f840c4a9 100644 --- a/test/test_web.rb +++ b/test/test_web.rb @@ -173,6 +173,17 @@ class TestWeb < Sidekiq::Test assert_match(/#{params.first['args'][2]}/, last_response.body) end + it 'can kill a single retry now' do + params = add_retry + post "/retries/#{job_params(*params)}", 'kill' => 'Kill' + assert_equal 302, last_response.status + assert_equal 'http://example.org/retries', last_response.header['Location'] + + get '/morgue' + assert_equal 200, last_response.status + assert_match(/#{params.first['args'][2]}/, last_response.body) + end + it 'can display scheduled' do get '/scheduled' assert_equal 200, last_response.status diff --git a/web/locales/de.yml b/web/locales/de.yml index bd1ee2d9..5383a1f7 100644 --- a/web/locales/de.yml +++ b/web/locales/de.yml @@ -33,6 +33,7 @@ de: NextRetry: Nächster Versuch RetryCount: Anzahl der Versuche RetryNow: Jetzt erneut versuchen + Kill: Töten LastRetry: Letzter Versuch OriginallyFailed: Ursprünglich fehlgeschlagen AreYouSure: Bist du sicher? diff --git a/web/locales/en.yml b/web/locales/en.yml index 0e91b037..8ee0bb4c 100644 --- a/web/locales/en.yml +++ b/web/locales/en.yml @@ -33,6 +33,7 @@ en: # <---- change this to your locale code NextRetry: Next Retry RetryCount: Retry Count RetryNow: Retry Now + Kill: Kill LastRetry: Last Retry OriginallyFailed: Originally Failed AreYouSure: Are you sure? diff --git a/web/locales/es.yml b/web/locales/es.yml index d2120656..0e46bdff 100644 --- a/web/locales/es.yml +++ b/web/locales/es.yml @@ -33,6 +33,7 @@ es: NextRetry: Siguiente Intento RetryCount: Numero de Reintentos RetryNow: Reintentar Ahora + Kill: Matar LastRetry: Último Reintento OriginallyFailed: Falló Originalmente AreYouSure: ¿Estás seguro? diff --git a/web/locales/fr.yml b/web/locales/fr.yml index dfc08f80..47f6fe82 100644 --- a/web/locales/fr.yml +++ b/web/locales/fr.yml @@ -33,6 +33,7 @@ fr: NextRetry: Prochain essai RetryCount: Nombre d'essais RetryNow: Réessayer maintenant + Kill: Tuer LastRetry: Dernier essai OriginallyFailed: Échec originel AreYouSure: Êtes-vous certain ? diff --git a/web/locales/it.yml b/web/locales/it.yml index e27b2571..a2b24d5e 100644 --- a/web/locales/it.yml +++ b/web/locales/it.yml @@ -33,6 +33,7 @@ it: NextRetry: Prossimo tentativo RetryCount: Totale tentativi RetryNow: Riprova + Kill: Uccidere LastRetry: Ultimo tentativo OriginallyFailed: Primo fallimento AreYouSure: Sei sicuro? diff --git a/web/locales/ru.yml b/web/locales/ru.yml index 475d69a7..38ce656b 100644 --- a/web/locales/ru.yml +++ b/web/locales/ru.yml @@ -32,6 +32,7 @@ ru: NextRetry: Следующая попытка RetryCount: Кол-во попыток RetryNow: Повторить сейчас + Kill: Убиваем LastRetry: Последняя попытка OriginallyFailed: Первый провал AreYouSure: Вы уверены? diff --git a/web/views/retries.erb b/web/views/retries.erb index dc708258..d264e64e 100644 --- a/web/views/retries.erb +++ b/web/views/retries.erb @@ -54,6 +54,7 @@ +