class Geary::Manager

Constants

UnexpectedRestart

Attributes

configuration[R]
performers[R]

Public Class Methods

new(options = {}) click to toggle source
# File lib/geary/manager.rb, line 15
def initialize(options = {})
  @configuration = options.fetch(:configuration)
  @performer_type = options.fetch(:performer_type, Performer)
  @performers = []
  @crashes = []
  @server_addresses_by_performer = {}
end

Public Instance Methods

start() click to toggle source
# File lib/geary/manager.rb, line 23
def start
  async.monitor_crashes

  configuration.server_addresses.each do |server_address|
    configuration.concurrency.times do
      start_performer(server_address)
    end
  end
end
stop() click to toggle source
# File lib/geary/manager.rb, line 33
def stop
  @performers.select(&:alive?).each(&:terminate)

  after(0) { signal(:done) }
end

Private Instance Methods

forget_performer(performer, &wants_server_address) click to toggle source
# File lib/geary/manager.rb, line 57
def forget_performer(performer, &wants_server_address)
  _id = performer.object_id

  @performers.delete(performer) do
    raise UnexpectedRestart, "we don't know about Performer #{_id}"
  end

  server_address = @server_addresses_by_performer.delete(_id)

  wants_server_address.call(server_address)
end
momentarily(&action) click to toggle source
# File lib/geary/manager.rb, line 78
def momentarily(&action)
  after(rand + configuration.jitter, &action)
  true
end
monitor_crashes() click to toggle source
# File lib/geary/manager.rb, line 41
def monitor_crashes
  every(configuration.failure_monitor_interval) do 
    @crashes.reject! do |server_address|
      momentarily { start_performer(server_address) }
    end
  end
end
performer_crashed(performer, reason) click to toggle source
# File lib/geary/manager.rb, line 49
def performer_crashed(performer, reason)
  if String(reason).size > 0
    forget_performer(performer) do |server_address|
      @crashes.unshift(server_address)
    end
  end
end
start_performer(server_address) click to toggle source
# File lib/geary/manager.rb, line 69
def start_performer(server_address)
  performer = @performer_type.new_link(server_address)

  @performers << performer
  @server_addresses_by_performer[performer.object_id] = server_address

  performer.async.start
end