Class Mongo::Node
In: lib/mongo/util/node.rb
Parent: Object

Methods

==   active?   arbiters   close   connect   connected?   eql?   hash   host_port   host_string   inspect   new   node_list   primary?   secondary?   set_config   tags  

Attributes

address  [RW] 
config  [RW] 
connection  [RW] 
host  [RW] 
last_state  [RW] 
port  [RW] 
socket  [RW] 

Public Class methods

[Source]

# File lib/mongo/util/node.rb, line 7
    def initialize(connection, data)
      @connection = connection
      if data.is_a?(String)
        @host, @port = split_nodes(data)
      else
        @host = data[0]
        @port = data[1].nil? ? Connection::DEFAULT_PORT : data[1].to_i
      end
      @address = "#{host}:#{port}"
      @config = nil
      @socket = nil
    end

Public Instance methods

==(other)

Alias for eql?

[Source]

# File lib/mongo/util/node.rb, line 73
    def active?
      begin
        result = @connection['admin'].command({:ping => 1}, :socket => @socket)
        return result['ok'] == 1
      rescue OperationFailure, SocketError, SystemCallError, IOError => ex
        return nil
      end
    end

[Source]

# File lib/mongo/util/node.rb, line 125
    def arbiters
      connect unless connected?
      set_config unless @config
      return [] unless config['arbiters']

      config['arbiters'].map do |arbiter|
        split_nodes(arbiter)
      end
    end

[Source]

# File lib/mongo/util/node.rb, line 61
    def close
      if @socket && !@socket.closed?
        @socket.close
      end
      @socket = nil
      @config = nil
    end

Create a connection to the provided node, and, if successful, return the socket. Otherwise, return nil.

[Source]

# File lib/mongo/util/node.rb, line 36
    def connect
      begin
        socket = nil
        if @connection.connect_timeout
          Mongo::TimeoutHandler.timeout(@connection.connect_timeout, OperationTimeout) do
            socket = @connection.socket_class.new(@host, @port)
          end
        else
          socket = @connection.socket_class.new(@host, @port)
        end

        if socket.nil?
          return nil
        else
          socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
        end
      rescue OperationTimeout, OperationFailure, SocketError, SystemCallError, IOError => ex
        @connection.log(:debug, "Failed connection to #{host_string} with #{ex.class}, #{ex.message}.")
        socket.close if socket
        return nil
      end

      @socket = socket
    end

[Source]

# File lib/mongo/util/node.rb, line 69
    def connected?
      @socket != nil
    end

[Source]

# File lib/mongo/util/node.rb, line 20
    def eql?(other)
      other.is_a?(Node) && host == other.host && port == other.port
    end

[Source]

# File lib/mongo/util/node.rb, line 155
    def hash
      address.hash
    end

[Source]

# File lib/mongo/util/node.rb, line 151
    def host_port
      [@host, @port]
    end

[Source]

# File lib/mongo/util/node.rb, line 25
    def host_string
      address
    end

[Source]

# File lib/mongo/util/node.rb, line 29
    def inspect
      "<Mongo::Node:0x#{self.object_id.to_s(16)} @host=#{@host} @port=#{@port}>"
    end

Return a list of replica set nodes from the config. Note: this excludes arbiters.

[Source]

# File lib/mongo/util/node.rb, line 113
    def node_list
      connect unless connected?
      set_config unless @config

      return [] unless config

      nodes = []
      nodes += config['hosts'] if config['hosts']
      nodes += config['passives'] if config['passives']
      nodes
    end

[Source]

# File lib/mongo/util/node.rb, line 143
    def primary?
      @config['ismaster'] == true || @config['ismaster'] == 1
    end

[Source]

# File lib/mongo/util/node.rb, line 147
    def secondary?
      @config['secondary'] == true || @config['secondary'] == 1
    end

Get the configuration for the provided node as returned by the ismaster command. Additionally, check that the replica set name matches with the name provided.

[Source]

# File lib/mongo/util/node.rb, line 85
    def set_config
      begin
        if @connection.connect_timeout
          Mongo::TimeoutHandler.timeout(@connection.connect_timeout, OperationTimeout) do
            @config = @connection['admin'].command({:ismaster => 1}, :socket => @socket)
          end
        else
          @config = @connection['admin'].command({:ismaster => 1}, :socket => @socket)
        end

        if @config['msg'] && @logger
          @connection.log(:warn, "#{config['msg']}")
        end

        check_set_membership(config)
        check_set_name(config)
      rescue ConnectionFailure, OperationFailure, OperationTimeout, SocketError, SystemCallError, IOError => ex
        @connection.log(:warn, "Attempted connection to node #{host_string} raised " +
                            "#{ex.class}: #{ex.message}")
        @socket.close unless @socket.closed?
        return nil
      end

      @config
    end

[Source]

# File lib/mongo/util/node.rb, line 135
    def tags
      connect unless connected?
      set_config unless @config
      return {} unless config['tags'] && !config['tags'].empty?

      config['tags']
    end

[Validate]