diff --git a/Changes.md b/Changes.md index 29be66fc..c443c9de 100644 --- a/Changes.md +++ b/Changes.md @@ -1,3 +1,20 @@ +3.1.0 +----------- + +- New remote signals feature: you can remotely trigger Sidekiq to quiet + or terminate remotely via API, without signals. This is most useful + on Heroku which does not support the USR1 'quiet' signal. Now you can + run a rake task like this at the start of your deploy to quiet your + set of Sidekiq processes. +```ruby +namespace :sidekiq do + task :quiet => :environment do + Sidekiq::ProcessSet.new.each(&:quiet!) + end +end +``` + + 3.0.2 ----------- diff --git a/lib/sidekiq/api.rb b/lib/sidekiq/api.rb index d5bf22ed..6cad59ba 100644 --- a/lib/sidekiq/api.rb +++ b/lib/sidekiq/api.rb @@ -514,6 +514,22 @@ module Sidekiq def [](key) @attribs[key] end + + def quiet! + key = "#{identity}-signals" + Sidekiq.redis do |c| + c.multi do + c.lpush(key, 'USR1') + c.expire(key, 60) + end + end + end + + private + + def identity + @id ||= "#{self['hostname']}:#{self['pid']}" + end end ## diff --git a/lib/sidekiq/cli.rb b/lib/sidekiq/cli.rb index 4a26d4c7..77c7bd89 100644 --- a/lib/sidekiq/cli.rb +++ b/lib/sidekiq/cli.rb @@ -95,16 +95,6 @@ module Sidekiq private - def fire_event(event) - Sidekiq.options[:lifecycle_events][event].each do |block| - begin - block.call - rescue => ex - handle_exception(ex, { :event => event }) - end - end - end - def handle_signal(sig) Sidekiq.logger.debug "Got #{sig} signal" case sig diff --git a/lib/sidekiq/manager.rb b/lib/sidekiq/manager.rb index 19d6afb0..5723c190 100644 --- a/lib/sidekiq/manager.rb +++ b/lib/sidekiq/manager.rb @@ -149,12 +149,15 @@ module Sidekiq def ❤(key) begin - Sidekiq.redis do |conn| + _, _, msg = Sidekiq.redis do |conn| conn.multi do conn.hmset(key, 'busy', @busy.size, 'beat', Time.now.to_f) conn.expire(key, 60) + conn.rpop("#{key}-signals") end end + + ::Process.kill(msg, $$) if msg rescue => e # ignore all redis/network issues logger.error("heartbeat: #{e.message}") diff --git a/lib/sidekiq/util.rb b/lib/sidekiq/util.rb index 4ee64608..e1fe1a9a 100644 --- a/lib/sidekiq/util.rb +++ b/lib/sidekiq/util.rb @@ -33,5 +33,16 @@ module Sidekiq def identity @@identity ||= "#{hostname}:#{$$}" end + + def fire_event(event) + Sidekiq.options[:lifecycle_events][event].each do |block| + begin + block.call + rescue => ex + handle_exception(ex, { :event => event }) + end + end + end + end end diff --git a/lib/sidekiq/version.rb b/lib/sidekiq/version.rb index 6db8f278..4ecd3423 100644 --- a/lib/sidekiq/version.rb +++ b/lib/sidekiq/version.rb @@ -1,3 +1,3 @@ module Sidekiq - VERSION = "3.0.2" + VERSION = "3.1.0" end