class Mongo::Server::Monitor::Connection

This class models the monitor connections and their behavior.

@since 2.0.0

Constants

COMPRESSION

Key for compression algorithms in the response from the server during handshake.

@since 2.5.0

COMPRESSION_WARNING

Warning message that the server has no compression algorithms in common with those requested

by the client.

@since 2.5.0

CONNECT_TIMEOUT

The default time in seconds to timeout a connection attempt.

@since 2.1.2

@deprecated Please use Server::CONNECT_TIMEOUT instead. Will be removed in 3.0.0

ISMASTER

The command used for determining server status.

@since 2.2.0

ISMASTER_BYTES

The raw bytes for the ismaster message.

@since 2.2.0

ISMASTER_MESSAGE

The constant for the ismaster command.

@since 2.2.0

ISMASTER_OP_MSG

The command used for determining server status formatted for an OP_MSG (server versions >= 3.6).

@since 2.5.0

ISMASTER_OP_MSG_BYTES

The raw bytes for the ismaster OP_MSG message (server versions >= 3.6).

@since 2.5.0

ISMASTER_OP_MSG_MESSAGE

The constant for the ismaster command as an OP_MSG (server versions >= 3.6).

@since 2.5.0

Attributes

compressor[R]

The compressor, which is determined during the handshake.

@since 2.5.0

Public Class Methods

new(address, options = {}) click to toggle source

Initialize a new socket connection from the client to the server.

@api private

@example Create the connection.

Connection.new(address)

@note Connection must never be directly instantiated outside of a

Monitor.

@param [ Mongo::Address ] address The address the connection is for. @param [ Hash ] options The connection options.

@since 2.0.0

# File lib/mongo/server/monitor/connection.rb, line 151
def initialize(address, options = {})
  @address = address
  @options = options.freeze
  @app_metadata = options[:app_metadata]
  @ssl_options = options.reject { |k, v| !k.to_s.start_with?(SSL) }
  @socket = nil
  @pid = Process.pid
  @compressor = nil
end

Public Instance Methods

connect!() click to toggle source

Tell the underlying socket to establish a connection to the host.

@example Connect to the host.

connection.connect!

@note This method mutates the connection class by setting a socket if

one previously did not exist.

@return [ true ] If the connection succeeded.

@since 2.0.0

# File lib/mongo/server/monitor/connection.rb, line 109
def connect!
  unless socket && socket.connectable?
    @socket = address.socket(socket_timeout, ssl_options)
    address.connect_socket!(socket)
    handshake!
  end
  true
end
disconnect!() click to toggle source

Disconnect the connection.

@example Disconnect from the host.

connection.disconnect!

@note This method mutates the connection by setting the socket to nil

if the closing succeeded.

@return [ true ] If the disconnect succeeded.

@since 2.0.0

# File lib/mongo/server/monitor/connection.rb, line 129
def disconnect!
  if socket
    socket.close
    @socket = nil
  end
  true
end
ismaster() click to toggle source

Send the preserialized ismaster call.

@example Send a preserialized ismaster message.

connection.ismaster

@return [ BSON::Document ] The ismaster result.

@since 2.2.0

# File lib/mongo/server/monitor/connection.rb, line 89
def ismaster
  ensure_connected do |socket|
    read_with_one_retry do
      socket.write(ISMASTER_BYTES)
      Protocol::Message.deserialize(socket).documents[0]
    end
  end
end
socket_timeout() click to toggle source

Get the socket timeout.

@example Get the socket timeout.

connection.socket_timeout

@return [ Float ] The socket timeout in seconds. Note that the Monitor's connection

uses the connect timeout value for calling ismaster. See the Server Discovery and
Monitoring specification for details.

@since 2.4.3

# File lib/mongo/server/monitor/connection.rb, line 171
def socket_timeout
  @timeout ||= options[:connect_timeout] || Server::CONNECT_TIMEOUT
end
Also aliased as: timeout
timeout()

@deprecated Please use :socket_timeout instead. Will be removed in 3.0.0

Alias for: socket_timeout

Private Instance Methods

handshake!() click to toggle source
# File lib/mongo/server/monitor/connection.rb, line 191
def handshake!
  if @app_metadata
    socket.write(@app_metadata.ismaster_bytes)
    reply = Protocol::Message.deserialize(socket, Mongo::Protocol::Message::MAX_MESSAGE_SIZE).documents[0]
    set_compressor!(reply)
    reply
  end
end
set_compressor!(reply) click to toggle source
# File lib/mongo/server/monitor/connection.rb, line 179
def set_compressor!(reply)
  server_compressors = reply[COMPRESSION]

  if options[:compressors]
    if intersection = (server_compressors & options[:compressors])
      @compressor = intersection[0]
    else
      log_warn(COMPRESSION_WARNING)
    end
  end
end