class RSwim::ProtocolState

Public Class Methods

new(node_member_id, seed_member_ids, t_ms, r_ms) click to toggle source
# File lib/rswim/protocol_state.rb, line 5
def initialize(node_member_id, seed_member_ids, t_ms, r_ms)
  @t_ms = t_ms
  @r_ms = r_ms
  @member_pool = MemberPool.new(node_member_id, seed_member_ids)
  @node_member_id = node_member_id
  @t = @r = 1
end

Public Instance Methods

advance(input_messages, elapsed_seconds) click to toggle source
# File lib/rswim/protocol_state.rb, line 17
def advance(input_messages, elapsed_seconds)
  @t += elapsed_seconds * 1000
  @t = 0 if @t >= @t_ms

  @r += elapsed_seconds * 1000
  @r = 0 if @r >= @r_ms

  input_messages.each do |message|
    raise 'message must be of type Message' unless message.is_a? Message

    update_member(message)
  end

  @member_pool.update_members(elapsed_seconds)
  output_messages = @member_pool.prepare_output

  # TODO: more deterministic steady state mechanism,
  # e.g. output_messages = @member_pool.next_steady_state(elapsed_seconds)
  # using a flag set by member state
  3.times do
    @member_pool.update_members(0)
    output_messages.concat(@member_pool.prepare_output)
  end

  @member_pool.send_ping_to_random_healthy_member if @t == 0

  3.times do
    @member_pool.update_members(0)
    output_messages.concat(@member_pool.prepare_output)
  end

  @member_pool.status_report if @r == 0

  output_messages
end
subscribe(&block) click to toggle source
# File lib/rswim/protocol_state.rb, line 13
def subscribe(&block)
  @member_pool.subscribe(&block)
end

Private Instance Methods

logger() click to toggle source
# File lib/rswim/protocol_state.rb, line 55
def logger
  @_logger ||= Logger.new(self.class, STDERR)
end
update_member(message) click to toggle source
# File lib/rswim/protocol_state.rb, line 59
def update_member(message)
  @member_pool.update_member(message)
# rescue StandardError => e
#   logger.error(e)
end