Class: Mongo::Server::Connection
- Inherits:
-
ConnectionBase
- Object
- ConnectionCommon
- ConnectionBase
- Mongo::Server::Connection
- Extended by:
- Forwardable
- Includes:
- Id, Monitoring::Publishable, Retryable
- Defined in:
- lib/mongo/server/connection.rb
Overview
This class models the socket connections for servers and their behavior.
Constant Summary collapse
- PING =
Deprecated.
No longer necessary with Server Selection specification.
The ping command.
{ ping: 1 }.freeze
- PING_OP_MSG =
Deprecated.
No longer necessary with Server Selection specification.
The ping command for an OP_MSG
{ :ping => 1, '$db' => Database::ADMIN }.freeze
- PING_OP_MSG_MESSAGE =
Deprecated.
No longer necessary with Server Selection specification.
Ping message as an OP_MSG
Protocol::Msg.new([], {}, PING_OP_MSG)
- PING_OP_MSG_BYTES =
Deprecated.
No longer necessary with Server Selection specification.
The ping OP_MSG message as raw bytes
PING_OP_MSG_MESSAGE.serialize.to_s.freeze
Constants included from Loggable
Constants inherited from ConnectionBase
Mongo::Server::ConnectionBase::DEFAULT_MAX_BSON_OBJECT_SIZE, Mongo::Server::ConnectionBase::MAX_BSON_COMMAND_OVERHEAD, Mongo::Server::ConnectionBase::REDUCED_MAX_BSON_SIZE
Instance Attribute Summary collapse
-
#global_id ⇒ Integer
readonly
across all connections.
-
#id ⇒ Integer
readonly
across connections to the same server object.
-
#last_checkin ⇒ Time
readonly
The last time the connection was checked back into a pool.
Attributes included from Monitoring::Publishable
Attributes inherited from ConnectionBase
#description, #options, #server
Attributes inherited from ConnectionCommon
Instance Method Summary collapse
-
#closed? ⇒ true | false
Whether the connection was closed.
-
#connect!(context = nil) ⇒ true
Establishes a network connection to the target address.
-
#connected? ⇒ true | false
Whether the connection was connected and was not interrupted, closed, or had an error raised.
-
#connection_pool ⇒ Object
private
The connection pool from which this connection was created.
-
#disconnect!(options = nil) ⇒ true
Disconnect the connection.
- #error? ⇒ Boolean private
-
#initialize(server, options = {}) ⇒ Connection
constructor
private
Creates a new connection object to the specified target address with the specified options.
-
#interrupted! ⇒ Object
Mark the connection as interrupted.
-
#interrupted? ⇒ true | false
Whether the connection was interrupted.
-
#pin(reason = :cursor) ⇒ Object
private
Mark the connection as pinned for the given reason.
-
#ping ⇒ true, false
deprecated
Deprecated.
No longer necessary with Server Selection specification.
-
#pinned? ⇒ Boolean
private
Whether the connection is used by a transaction or cursor operations.
-
#record_checkin! ⇒ self
Record the last checkin time.
-
#socket_timeout ⇒ Float
(also: #timeout)
Get the timeout to execute an operation on a socket.
-
#transport ⇒ Symbol | nil
private
Get the transport type for this connection.
-
#unpin(reason = :cursor) ⇒ Object
private
Remove a pin from the connection for the given reason.
-
#unpin_all ⇒ Object
private
Remove all pins from the connection.
Methods included from Id
Methods included from Retryable
#read_worker, #select_server, #with_overload_retry, #write_worker
Methods included from Monitoring::Publishable
#publish_cmap_event, #publish_event, #publish_sdam_event
Methods included from Loggable
#log_debug, #log_error, #log_fatal, #log_info, #log_warn, #logger
Methods inherited from ConnectionBase
#app_metadata, #dispatch, #generation, #service_id
Methods inherited from ConnectionCommon
#handshake_command, #handshake_document
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.
Creates a new connection object to the specified target address with the specified options.
The constructor does not perform any I/O (and thus does not create sockets, handshakes nor authenticates); call connect! method on the connection object to create the network connection.
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
# File 'lib/mongo/server/connection.rb', line 90 def initialize(server, = {}) if server.load_balancer? && [:generation] raise ArgumentError, 'Generation cannot be set when server is a load balancer' end @id = server.next_connection_id @global_id = self.class.next_id @monitoring = server.monitoring @options = .freeze @server = server @socket = nil @last_checkin = nil @auth_mechanism = nil @pid = Process.pid @pin_reasons = Set.new publish_cmap_event( Monitoring::Event::Cmap::ConnectionCreated.new(address, id) ) end |
Instance Attribute Details
#global_id ⇒ Integer (readonly)
across all connections.
124 125 126 |
# File 'lib/mongo/server/connection.rb', line 124 def global_id @global_id end |
#id ⇒ Integer (readonly)
across connections to the same server object.
120 121 122 |
# File 'lib/mongo/server/connection.rb', line 120 def id @id end |
#last_checkin ⇒ Time (readonly)
Returns The last time the connection was checked back into a pool.
114 115 116 |
# File 'lib/mongo/server/connection.rb', line 114 def last_checkin @last_checkin end |
Instance Method Details
#closed? ⇒ true | false
Whether the connection was closed.
Closed connections should no longer be used. Instead obtain a new connection from the connection pool.
152 153 154 |
# File 'lib/mongo/server/connection.rb', line 152 def closed? !!@closed end |
#connect!(context = nil) ⇒ true
This method mutates the connection object by setting a socket if one previously did not exist.
Establishes a network connection to the target address.
If the connection is already established, this method does nothing.
228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 |
# File 'lib/mongo/server/connection.rb', line 228 def connect!(context = nil) raise_if_closed! unless @socket @socket = create_socket(context) @description, @compressor = do_connect if server.load_balancer? if Lint.enabled? && !service_id raise Error::InternalDriverError, 'The connection is to a load balancer and it must have service_id set here, but does not' end @generation = connection_pool.generation_manager.generation(service_id: service_id) end publish_cmap_event( Monitoring::Event::Cmap::ConnectionReady.new(address, id) ) @close_event_published = false end true end |
#connected? ⇒ true | false
Whether the connection was connected and was not interrupted, closed, or had an error raised.
140 141 142 |
# File 'lib/mongo/server/connection.rb', line 140 def connected? !closed? && !error? && !interrupted? && !!@socket end |
#connection_pool ⇒ Object
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.
The connection pool from which this connection was created. May be nil.
132 133 134 |
# File 'lib/mongo/server/connection.rb', line 132 def connection_pool [:connection_pool] end |
#disconnect!(options = nil) ⇒ true
Once a connection is disconnected, it should no longer be used. A new connection should be obtained from the connection pool which will either return a ready connection or create a new connection. If linting is enabled, reusing a disconnected connection will raise Error::LintError. If linting is not enabled, a warning will be logged.
This method mutates the connection object by setting the socket to nil if the closing succeeded.
Disconnect the connection.
310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 |
# File 'lib/mongo/server/connection.rb', line 310 def disconnect!( = nil) # NOTE: @closed may be true here but we also may have a socket. # Check the socket and not @closed flag. @auth_mechanism = nil @last_checkin = nil if socket begin socket.close rescue StandardError nil end @socket = nil end @closed = true interrupted! if && [:interrupted] # To satisfy CMAP spec tests, publish close events even if the # socket was never connected (and thus the ready event was never # published). But track whether we published close event and do not # publish it multiple times, unless the socket was reconnected - # in that case publish the close event once per socket close. unless @close_event_published reason = && [:reason] publish_cmap_event( Monitoring::Event::Cmap::ConnectionClosed.new( address, id, reason ) ) @close_event_published = true end true end |
#error? ⇒ Boolean
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.
172 173 174 |
# File 'lib/mongo/server/connection.rb', line 172 def error? !!@error end |
#interrupted! ⇒ Object
Mark the connection as interrupted.
167 168 169 |
# File 'lib/mongo/server/connection.rb', line 167 def interrupted! @interrupted = true end |
#interrupted? ⇒ true | false
Whether the connection was interrupted.
Interrupted connections were already removed from the pool and should not be checked back into the pool.
162 163 164 |
# File 'lib/mongo/server/connection.rb', line 162 def interrupted? !!@interrupted end |
#pin(reason = :cursor) ⇒ Object
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.
Mark the connection as pinned for the given reason.
194 195 196 |
# File 'lib/mongo/server/connection.rb', line 194 def pin(reason = :cursor) @pin_reasons << reason end |
#ping ⇒ true, false
No longer necessary with Server Selection specification.
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.
359 360 361 362 363 364 365 366 367 |
# File 'lib/mongo/server/connection.rb', line 359 def ping ensure_connected do |socket| reply = add_server_diagnostics do socket.write(PING_OP_MSG_BYTES) Protocol::Message.deserialize(socket, ) end reply.documents[0][Operation::Result::OK] == 1 end end |
#pinned? ⇒ Boolean
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.
Whether the connection is used by a transaction or cursor operations.
Pinned connections should not be disconnected and removed from a connection pool if they are idle or stale.
# @return [ true | false ] Whether connection is pinned.
184 185 186 |
# File 'lib/mongo/server/connection.rb', line 184 def pinned? !@pin_reasons.empty? end |
#record_checkin! ⇒ self
Record the last checkin time.
388 389 390 391 |
# File 'lib/mongo/server/connection.rb', line 388 def record_checkin! @last_checkin = Time.now self end |
#socket_timeout ⇒ Float Also known as: timeout
Get the timeout to execute an operation on a socket.
374 375 376 |
# File 'lib/mongo/server/connection.rb', line 374 def socket_timeout @timeout ||= [:socket_timeout] end |
#transport ⇒ Symbol | nil
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.
Get the transport type for this connection.
398 399 400 401 402 403 404 405 406 407 |
# File 'lib/mongo/server/connection.rb', line 398 def transport return nil if @socket.nil? case @socket when Mongo::Socket::Unix :unix else :tcp end end |
#unpin(reason = :cursor) ⇒ Object
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.
Remove a pin from the connection for the given reason.
204 205 206 |
# File 'lib/mongo/server/connection.rb', line 204 def unpin(reason = :cursor) @pin_reasons.delete(reason) end |
#unpin_all ⇒ Object
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.
Remove all pins from the connection.
211 212 213 |
# File 'lib/mongo/server/connection.rb', line 211 def unpin_all @pin_reasons.clear end |