Sha256: d404a12e507316eb8aa76e80bbc7ab8f37bd8ab8e3b6b4fc9fae91b716b9d560

Contents?: true

Size: 1.68 KB

Versions: 3

Compression:

Stored size: 1.68 KB

Contents

require 'drbqs/node_list'

module DRbQS
  class MessageServer
    def initialize(message, logger = nil)
      @message = message
      @node_list = NodeList.new
      @logger = logger
    end

    def get_message
      begin
        mes = @message.take([Symbol, nil], 0)
        manage_message(*mes)
      rescue Rinda::RequestExpiredError
        nil
      end
    end

    def manage_message(mes, arg)
      @logger.info("Get message") { [mes, arg] } if @logger
      case mes
      when :connect
        a = [arg, @node_list.get_new_id(arg)]
        @logger.info("New node") { a } if @logger
        @message.write(a)
      when :alive
        @node_list.set_alive(arg)
      when :exit_server
        @logger.info("Get exit message from #{arg.to_s}") if @logger
        return :exit_server
      else
        @logger.error("Invalid message from #{arg.to_s}") if @logger
        return nil
      end
    end
    private :manage_message

    def check_connection
      deleted = @node_list.delete_not_alive
      @logger.info("IDs of deleted nodes") { deleted } if @logger
      @node_list.each do |id, str|
        @message.write([id, :alive_p])
      end
      @node_list.set_check_connection
      deleted
    end

    def send_exit
      @node_list.each do |node_id, id_str|
        @message.write([node_id, :exit])
      end
    end

    def node_not_exist?
      @node_list.empty?
    end

    # If the task has already set,
    # the method overwrite old task of initialization by new task.
    def set_initialization(task)
      begin
        @message.take([:initialize, nil, Symbol, nil], 0)
      rescue Rinda::RequestExpiredError
      end
      @message.write(task.drb_args(:initialize))
    end

  end

end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
drbqs-0.0.8 lib/drbqs/message.rb
drbqs-0.0.7 lib/drbqs/message.rb
drbqs-0.0.6 lib/drbqs/message.rb