Class: Mongo::Server::Connection
- Inherits:
-
Object
- Object
- Mongo::Server::Connection
- Extended by:
- Forwardable
- Includes:
- Monitoring::Publishable, Retryable, Connectable
- Defined in:
- lib/mongo/server/connection.rb
Overview
This class models the socket connections for servers and their behavior.
Constant Summary collapse
- PING =
The ping command.
{ :ping => 1 }.freeze
- PING_MESSAGE =
Ping message.
Protocol::Query.new(Database::ADMIN, Database::COMMAND, PING, :limit => -1)
- PING_BYTES =
The ping message as raw bytes.
PING_MESSAGE.serialize.to_s.freeze
Constants included from Connectable
Mongo::Server::Connectable::SSL, Mongo::Server::Connectable::TIMEOUT
Instance Attribute Summary
Attributes included from Monitoring::Publishable
Attributes included from Connectable
Instance Method Summary collapse
-
#connect! ⇒ true
Tell the underlying socket to establish a connection to the host.
-
#disconnect! ⇒ true
Disconnect the connection.
-
#dispatch(messages, operation_id = nil) ⇒ Protocol::Reply
Dispatch the provided messages to the connection.
-
#initialize(server, options = {}) ⇒ Connection
constructor
private
Initialize a new socket connection from the client to the server.
-
#ping ⇒ true, false
Ping the connection to see if the server is responding to commands.
Methods included from Retryable
#read_with_one_retry, #read_with_retry, #write_with_retry
Methods included from Monitoring::Publishable
#publish_command, #publish_event, #publish_sdam_event
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.
Connection must never be directly instantiated outside of a Server.
Initialize a new socket connection from the client to the server.
129 130 131 132 133 134 135 136 137 138 |
# File 'lib/mongo/server/connection.rb', line 129 def initialize(server, = {}) @address = server.address @monitoring = server.monitoring @options = .freeze @server = server @ssl_options = .reject { |k, v| !k.to_s.start_with?(SSL) } @socket = nil @auth_mechanism = nil @pid = Process.pid end |
Instance Method Details
#connect! ⇒ true
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.
60 61 62 63 64 65 66 67 68 |
# File 'lib/mongo/server/connection.rb', line 60 def connect! unless socket && socket.connectable? @socket = address.socket(timeout, ) socket.connect! handshake! authenticate! end true end |
#disconnect! ⇒ true
This method mutates the connection by setting the socket to nil if the closing succeeded.
Disconnect the connection.
81 82 83 84 85 86 87 88 |
# File 'lib/mongo/server/connection.rb', line 81 def disconnect! if socket socket.close @auth_mechanism = nil @socket = nil end true end |
#dispatch(messages, operation_id = nil) ⇒ Protocol::Reply
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.
105 106 107 108 109 110 111 112 113 |
# File 'lib/mongo/server/connection.rb', line 105 def dispatch(, operation_id = nil) if monitoring.subscribers?(Monitoring::COMMAND) publish_command(, operation_id || Monitoring.next_operation_id) do |msgs| deliver(msgs) end else deliver() end end |
#ping ⇒ true, false
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.
151 152 153 154 155 156 157 |
# File 'lib/mongo/server/connection.rb', line 151 def ping ensure_connected do |socket| socket.write(PING_BYTES) reply = Protocol::Reply.deserialize(socket, ) reply.documents[0][Operation::Result::OK] == 1 end end |