class Sidekiq::Cluster::WorkerPool

Constants

MONITORS

Attributes

cli[RW]
config[RW]
monitors[RW]
process_count[RW]
workers[RW]

Public Class Methods

new(cli, config) click to toggle source
# File lib/sidekiq/cluster/worker_pool.rb, line 48
def initialize(cli, config)
  self.cli           = cli
  self.config        = config
  self.process_count = config.process_count
  self.workers       = []
  self.monitors      = []
  self.state         = :idle

  @signal_received = false
end

Public Instance Methods

operational?() click to toggle source
# File lib/sidekiq/cluster/worker_pool.rb, line 82
def operational?
  shutdown! if stopping?
  stop! if @signal_received
  state_name == :running
end
spawn() click to toggle source
# File lib/sidekiq/cluster/worker_pool.rb, line 59
def spawn
  start!

  create_workers

  info "spawning #{workers.size} workers..."
  workers.each(&:spawn)

  info "worker pids: #{workers.map(&:pid)}"

  setup_signal_traps
  started!

  start_monitors

  info 'startup successful'

  Process.waitall
  monitors.each(&:join)

  info 'all children exited, shutting down'
end

Private Instance Methods

create_workers() click to toggle source
# File lib/sidekiq/cluster/worker_pool.rb, line 90
def create_workers
  process_count.times { |index| self.workers << Worker.new(index, cli) }
end
handle_signal(sig) click to toggle source
# File lib/sidekiq/cluster/worker_pool.rb, line 106
def handle_signal(sig)
  cli.stderr.puts "received OS signal #{sig}"
  @signal_received = true if (sig == 'INT' || sig == 'TERM' || sig == 'STOP')
  workers.each { |w| w.handle_signal(sig) }
end
setup_signal_traps() click to toggle source
# File lib/sidekiq/cluster/worker_pool.rb, line 98
def setup_signal_traps
  %w(INT USR1 TERM).each do |sig|
    Signal.trap(sig) do
      handle_signal(sig)
    end
  end
end
start_monitors() click to toggle source
# File lib/sidekiq/cluster/worker_pool.rb, line 94
def start_monitors
  self.monitors = MONITORS.map { |monitor| monitor.new(self).start }
end