Class: Mongo::Server::Monitor::Connection

Inherits:
Object
  • Object
show all
Includes:
Loggable, Retryable, Connectable
Defined in:
lib/mongo/server/monitor/connection.rb

Overview

This class models the monitor connections and their behavior.

Since:

  • 2.0.0

Constant Summary collapse

ISMASTER =

The command used for determining server status.

Since:

  • 2.2.0

{ :ismaster => 1 }.freeze
ISMASTER_OP_MSG =

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

Since:

  • 2.5.0

{ :ismaster => 1, '$db' => Database::ADMIN }.freeze
ISMASTER_MESSAGE =

The constant for the ismaster command.

Since:

  • 2.2.0

Protocol::Query.new(Database::ADMIN, Database::COMMAND, ISMASTER, :limit => -1)
ISMASTER_OP_MSG_MESSAGE =

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

Since:

  • 2.5.0

Protocol::Msg.new([], {}, ISMASTER_OP_MSG)
ISMASTER_BYTES =

The raw bytes for the ismaster message.

Since:

  • 2.2.0

ISMASTER_MESSAGE.serialize.to_s.freeze
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.serialize.to_s.freeze
CONNECT_TIMEOUT =
Deprecated.

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

The default time in seconds to timeout a connection attempt.

Since:

  • 2.1.2

10.freeze
COMPRESSION =

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

Since:

  • 2.5.0

'compression'.freeze
COMPRESSION_WARNING =

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

by the client.

Since:

  • 2.5.0

'The server has no compression algorithms in common with those requested. ' +
'Compression will not be used.'.freeze

Constants included from Loggable

Loggable::PREFIX

Constants included from Connectable

Connectable::SSL, Connectable::TIMEOUT

Instance Attribute Summary collapse

Attributes included from Connectable

#address, #options, #pid

Instance Method Summary collapse

Methods included from Loggable

#log_debug, #log_error, #log_fatal, #log_info, #log_warn, #logger

Methods included from Connectable

#connectable?, #connected?

Methods included from Retryable

#read_with_one_retry, #read_with_retry, #write_with_retry

Constructor Details

#initialize(address, options = {}) ⇒ Connection

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Note:

Connection must never be directly instantiated outside of a Monitor.

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

Examples:

Create the connection.

Connection.new(address)

Parameters:

  • address (Mongo::Address)

    The address the connection is for.

  • options (Hash) (defaults to: {})

    The connection options.

Options Hash (options):

  • :app_metadata (Mongo::Server::Monitor::AppMetadata)

    Metadata to use for handshake. If missing or nil, handshake will not be performed. Although a Mongo::Server::AppMetadata instance will also work, monitoring connections are meant to use Mongo::Server::Monitor::AppMetadata instances in order to omit performing SCRAM negotiation with the server, as monitoring sockets do not authenticate.

  • :compressors (Array<String>)

    A list of potential compressors to use, in order of preference. The driver chooses the first compressor that is also supported by the server. Currently the driver only supports ‘zlib’.

  • :connect_timeout (Float)

    The timeout, in seconds, to use for network operations. This timeout is used for all socket operations rather than connect calls only, contrary to what the name implies,

Since:

  • 2.0.0



106
107
108
109
110
111
112
113
114
# File 'lib/mongo/server/monitor/connection.rb', line 106

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

Instance Attribute Details

#compressorObject (readonly)

The compressor, which is determined during the handshake.

Since:

  • 2.5.0



119
120
121
# File 'lib/mongo/server/monitor/connection.rb', line 119

def compressor
  @compressor
end

Instance Method Details

#connect!true

Note:

This method mutates the connection class by setting a socket if one previously did not exist.

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

Examples:

Connect to the host.

connection.connect!

Returns:

  • (true)

    If the connection succeeded.

Since:

  • 2.0.0



149
150
151
152
153
154
155
156
# File 'lib/mongo/server/monitor/connection.rb', line 149

def connect!
  unless socket && socket.connectable?
    @socket = address.socket(socket_timeout, ssl_options)
    address.connect_socket!(socket)
    handshake!
  end
  true
end

#disconnect!true

Note:

This method mutates the connection by setting the socket to nil if the closing succeeded.

Disconnect the connection.

Examples:

Disconnect from the host.

connection.disconnect!

Returns:

  • (true)

    If the disconnect succeeded.

Since:

  • 2.0.0



169
170
171
172
173
174
175
# File 'lib/mongo/server/monitor/connection.rb', line 169

def disconnect!
  if socket
    socket.close
    @socket = nil
  end
  true
end

#ismasterBSON::Document

Send the preserialized ismaster call.

Examples:

Send a preserialized ismaster message.

connection.ismaster

Returns:

  • (BSON::Document)

    The ismaster result.

Since:

  • 2.2.0



129
130
131
132
133
134
135
136
# File 'lib/mongo/server/monitor/connection.rb', line 129

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_timeoutFloat Also known as: timeout

Get the socket timeout.

Examples:

Get the socket timeout.

connection.socket_timeout

Returns:

  • (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



187
188
189
# File 'lib/mongo/server/monitor/connection.rb', line 187

def socket_timeout
  @timeout ||= options[:connect_timeout] || Server::CONNECT_TIMEOUT
end