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