module Eye::Group::Chain

Constants

DEFAULT_CHAIN

with such delay will chained processes by default

Private Instance Methods

chain_options(command) click to toggle source
# File lib/eye/group/chain.rb, line 71
def chain_options(command)
  command = :start if command == :monitor # HACK: for monitor command, work as start

  if @config[:chain] && @config[:chain][command]
    type = @config[:chain][command].try :[], :type
    type = [:async, :sync].include?(type) ? type : :async

    grace = @config[:chain][command].try :[], :grace
    grace = (grace || DEFAULT_CHAIN).to_f rescue DEFAULT_CHAIN

    [type, grace]
  else
    # default chain case
    [:async, DEFAULT_CHAIN]
  end
end
chain_schedule(type, grace, call) click to toggle source
# File lib/eye/group/chain.rb, line 10
def chain_schedule(type, grace, call)
  command = call[:command]
  args = call[:args]
  info "starting #{type} with #{grace}s chain #{command} #{args}"

  @chain_processes_count = @processes.size
  @chain_processes_current = 0
  @chain_breaker = false

  started_at = Time.now

  @processes.each do |process|
    if process.skip_group_action?(command)
      @chain_processes_current = @chain_processes_current.to_i + 1
      next
    end

    chain_schedule_process(process, type, call)

    @chain_processes_current = @chain_processes_current.to_i + 1

    # to skip last sleep
    break if @chain_processes_current.to_i == @chain_processes_count.to_i
    break if @chain_breaker

    # wait next process
    sleep grace.to_f

    break if @chain_breaker
  end

  debug { "chain finished #{Time.now - started_at}s" }

  @chain_processes_count = nil
  @chain_processes_current = nil
end
chain_schedule_process(process, type, call) click to toggle source
# File lib/eye/group/chain.rb, line 47
def chain_schedule_process(process, type, call)
  debug { "chain_schedule_process #{process.name} #{type} #{call[:command]}" }

  if type == :sync
    # sync command, with waiting
    Eye::Utils.wait_signal(call[:signal_timeout]) do |signal|
      process.send_call(call.merge(signal: signal))
    end

  else
    # async command
    process.send_call(call)
  end
end
chain_status() click to toggle source
# File lib/eye/group/chain.rb, line 62
def chain_status
  if @config[:chain]
    [:start, :restart].map { |c| @config[:chain][c].try(:[], :grace) }
  end
end
chained_call(call) click to toggle source
# File lib/eye/group/chain.rb, line 5
def chained_call(call)
  type, grace = chain_options(call[:command])
  chain_schedule(type, grace, call)
end