class DCell::Server

Servers handle incoming 0MQ traffic

Public Class Methods

new() click to toggle source

Bind to the given 0MQ address (in URL form ala tcp://host:port)

# File lib/dcell/server.rb, line 9
def initialize
  # The gossip protocol is dependent on the node manager
  link Celluloid::Actor[:node_manager]

  @socket = PullSocket.new

  begin
    @socket.bind(DCell.addr)
    real_addr = @socket.get(::ZMQ::LAST_ENDPOINT).strip
    DCell::Directory.set DCell.id, real_addr
    DCell.addr = real_addr
  rescue IOError
    @socket.close
    raise
  end

  async.run
end

Public Instance Methods

close() click to toggle source
# File lib/dcell/server.rb, line 33
def close
  @socket.close if @socket
end
decode_message(message) click to toggle source

Decode incoming messages

# File lib/dcell/server.rb, line 56
def decode_message(message)
  if message[0..1].unpack("CC") == [Marshal::MAJOR_VERSION, Marshal::MINOR_VERSION]
    begin
      Marshal.load message
    rescue => ex
      raise InvalidMessageError, "invalid message: #{ex}"
    end
  else raise InvalidMessageError, "couldn't determine message format: #{message}"
  end
end
handle_message(message) click to toggle source

Handle incoming messages

# File lib/dcell/server.rb, line 38
def handle_message(message)
  begin
    message = decode_message message
  rescue InvalidMessageError => ex
    Logger.crash("couldn't decode message", ex)
    return
  end

  begin
    message.dispatch
  rescue => ex
    Logger.crash("DCell::Server: message dispatch failed", ex)
  end
end
run() click to toggle source

Wait for incoming 0MQ messages

# File lib/dcell/server.rb, line 29
def run
  while true; async.handle_message @socket.read; end
end
terminate() click to toggle source

Terminate this server

Calls superclass method
# File lib/dcell/server.rb, line 68
def terminate
  @socket.close
  super
end