Class: Mongo::Server::Connection

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Includes:
Monitoring::Publishable, Connectable
Defined in:
lib/mongo/server/connection.rb

Overview

This class models the socket connections for servers and their behavior.

Since:

  • 2.0.0

Constant Summary collapse

PING =

The ping command.

Since:

  • 2.1.0

{ :ping => 1 }.freeze
PING_MESSAGE =

Ping message.

Since:

  • 2.1.0

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

The ping message as raw bytes.

Since:

  • 2.1.0

PING_MESSAGE.serialize.to_s.freeze

Constants included from Connectable

Mongo::Server::Connectable::SSL, Mongo::Server::Connectable::TIMEOUT

Instance Attribute Summary collapse

Attributes included from Monitoring::Publishable

#monitoring

Attributes included from Connectable

#address, #options, #pid

Instance Method Summary collapse

Methods included from Monitoring::Publishable

#publish_command

Methods included from Connectable

#connectable?, #connected?, #timeout

Constructor Details

#initialize(server, 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 Server.

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

Examples:

Create the connection.

Connection.new(server)

Parameters:

  • server (Mongo::Server)

    The server the connection is for.

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

    The connection options.

Since:

  • 2.0.0



146
147
148
149
150
151
152
153
154
155
# File 'lib/mongo/server/connection.rb', line 146

def initialize(server, options = {})
  @address = server.address
  @monitoring = server.monitoring
  @options = options.freeze
  @server = server
  @ssl_options = options.reject { |k, v| !k.to_s.start_with?(SSL) }
  @socket = nil
  @pid = Process.pid
  setup_authentication!
end

Instance Attribute Details

#authenticatorMongo::Auth::CR, ... (readonly)

Returns authenticator The authentication strategy.

Returns:

Since:

  • 2.0.0



43
44
45
# File 'lib/mongo/server/connection.rb', line 43

def authenticator
  @authenticator
end

Instance Method Details

#authenticated?true, false

Is this connection authenticated. Will return true if authorization details were provided and authentication passed.

Examples:

Is the connection authenticated?

connection.authenticated?

Returns:

  • (true, false)

    If the connection is authenticated.

Since:

  • 2.0.0



60
61
62
# File 'lib/mongo/server/connection.rb', line 60

def authenticated?
  !!@authenticated
end

#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



75
76
77
78
79
80
81
82
83
84
85
# File 'lib/mongo/server/connection.rb', line 75

def connect!
  unless socket
    @socket = address.socket(timeout, ssl_options)
    socket.connect!
    if authenticator
      authenticator.(self)
      @authenticated = true
    end
  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



98
99
100
101
102
103
104
105
# File 'lib/mongo/server/connection.rb', line 98

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

#dispatch(messages, operation_id = nil) ⇒ Protocol::Reply

Note:

This method is named dispatch since ‘send’ is a core Ruby method on all objects.

Dispatch the provided messages to the connection. If the last message requires a response a reply will be returned.

Examples:

Dispatch the messages.

connection.dispatch([ insert, command ])

Parameters:

  • messages (Array<Message>)

    The messages to dispatch.

  • operation_id (Integer) (defaults to: nil)

    The operation id to link messages.

Returns:

Since:

  • 2.0.0



122
123
124
125
126
127
128
129
130
# File 'lib/mongo/server/connection.rb', line 122

def dispatch(messages, operation_id = nil)
  if monitoring.subscribers?(Monitoring::COMMAND)
    publish_command(messages, operation_id || Monitoring.next_operation_id) do |msgs|
      deliver(msgs)
    end
  else
    deliver(messages)
  end
end

#pingtrue, false

Note:

This uses a pre-serialized ping message for optimization.

Ping the connection to see if the server is responding to commands. This is non-blocking on the server side.

Examples:

Ping the connection.

connection.ping

Returns:

  • (true, false)

    If the server is accepting connections.

Since:

  • 2.1.0



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

def ping
  ensure_connected do |socket|
    socket.write(PING_BYTES)
    reply = Protocol::Reply.deserialize(socket, max_message_size)
    reply.documents[0][Operation::Result::OK] == 1
  end
end