Class: Mongo::Server::Monitor::Connection Private
- Inherits:
-
ConnectionCommon
- Object
- ConnectionCommon
- Mongo::Server::Monitor::Connection
- Includes:
- Loggable
- Defined in:
- lib/mongo/server/monitor/connection.rb
Overview
This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.
This class models the monitor connections and their behavior.
Direct Known Subclasses
Constant Summary collapse
- ISMASTER =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
The command used for determining server status.
The case matters here for fail points.
{ isMaster: 1 }.freeze
- ISMASTER_OP_MSG =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
The command used for determining server status formatted for an OP_MSG (server versions >= 3.6).
The case matters here for fail points.
{ isMaster: 1, '$db' => Database::ADMIN, }.freeze
- ISMASTER_MESSAGE =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
The constant for the ismaster command.
Protocol::Query.new(Database::ADMIN, Database::COMMAND, ISMASTER, :limit => -1)
- ISMASTER_OP_MSG_MESSAGE =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
The constant for the ismaster command as an OP_MSG (server versions >= 3.6).
Protocol::Msg.new([], {}, ISMASTER_OP_MSG)
- ISMASTER_BYTES =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
The raw bytes for the ismaster message.
ISMASTER_MESSAGE.serialize.to_s.freeze
- ISMASTER_OP_MSG_BYTES =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
The raw bytes for the ismaster OP_MSG message (server versions >= 3.6).
ISMASTER_OP_MSG_MESSAGE.serialize.to_s.freeze
Constants included from Loggable
Instance Attribute Summary collapse
-
#address ⇒ Mongo::Address
readonly
private
Address The address to connect to.
-
#options ⇒ Hash
readonly
private
Options The passed in options.
- #server_connection_id ⇒ Object readonly private
Attributes inherited from ConnectionCommon
Instance Method Summary collapse
-
#connect! ⇒ true
private
Establishes a network connection to the target address.
-
#disconnect!(options = nil) ⇒ true
private
Disconnect the connection.
-
#dispatch(message) ⇒ Protocol::Message
private
Sends a message and returns the result.
-
#dispatch_bytes(bytes, **opts) ⇒ Protocol::Message
private
Sends a preserialized message and returns the result.
- #handshake! ⇒ Object private
-
#initialize(address, options = {}) ⇒ Connection
constructor
private
Creates a new connection object to the specified target address with the specified options.
- #read_response(**opts) ⇒ Object private
-
#socket_timeout ⇒ Float
private
Returns the monitoring socket timeout.
- #write_bytes(bytes) ⇒ Object private
Methods included from Loggable
#log_debug, #log_error, #log_fatal, #log_info, #log_warn, #logger
Methods inherited from ConnectionCommon
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.
Monitoring connections do not authenticate.
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 nor handshakes); call connect! method on the connection object to create the network connection.
93 94 95 96 97 98 99 100 |
# File 'lib/mongo/server/monitor/connection.rb', line 93 def initialize(address, = {}) @address = address @options = .dup.freeze @app_metadata = [:app_metadata] @socket = nil @pid = Process.pid @compressor = nil end |
Instance Attribute Details
#address ⇒ Mongo::Address (readonly)
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.
Returns address The address to connect to.
106 107 108 |
# File 'lib/mongo/server/monitor/connection.rb', line 106 def address @address end |
#options ⇒ Hash (readonly)
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.
Returns options The passed in options.
103 104 105 |
# File 'lib/mongo/server/monitor/connection.rb', line 103 def @options end |
#server_connection_id ⇒ Object (readonly)
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.
121 122 123 |
# File 'lib/mongo/server/monitor/connection.rb', line 121 def server_connection_id @server_connection_id end |
Instance Method Details
#connect! ⇒ true
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.
This method mutates the connection class 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.
189 190 191 192 193 194 195 196 197 198 199 |
# File 'lib/mongo/server/monitor/connection.rb', line 189 def connect! if @socket raise ArgumentError, 'Monitoring connection already connected' end @socket = add_server_diagnostics do address.socket(socket_timeout, .merge( connection_address: address, monitor: true)) end true end |
#disconnect!(options = nil) ⇒ true
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.
This method mutates the connection by setting the socket to nil if the closing succeeded.
This method accepts an options argument for compatibility with Server::Connections. However, all options are ignored.
Disconnect the connection.
215 216 217 218 219 220 221 |
# File 'lib/mongo/server/monitor/connection.rb', line 215 def disconnect!( = nil) if socket socket.close rescue nil @socket = nil end true end |
#dispatch(message) ⇒ Protocol::Message
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.
Sends a message and returns the result.
128 129 130 |
# File 'lib/mongo/server/monitor/connection.rb', line 128 def dispatch() dispatch_bytes(.serialize.to_s) end |
#dispatch_bytes(bytes, **opts) ⇒ Protocol::Message
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.
Sends a preserialized message and returns the result.
140 141 142 143 144 145 |
# File 'lib/mongo/server/monitor/connection.rb', line 140 def dispatch_bytes(bytes, **opts) write_bytes(bytes) read_response( socket_timeout: opts[:read_socket_timeout], ) end |
#handshake! ⇒ 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.
223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 |
# File 'lib/mongo/server/monitor/connection.rb', line 223 def handshake! payload = if @app_metadata @app_metadata.ismaster_bytes else log_warn("No app metadata provided for handshake with #{address}") ISMASTER_BYTES end = dispatch_bytes(payload) reply = .documents.first set_compressor!(reply) @server_connection_id = reply['connectionId'] reply rescue => exc msg = "Failed to handshake with #{address}" Utils.warn_monitor_exception(msg, exc, logger: [:logger], log_prefix: [:log_prefix], bg_error_backtrace: [:bg_error_backtrace], ) raise end |
#read_response(**opts) ⇒ 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.
161 162 163 164 165 166 167 168 169 170 171 172 173 174 |
# File 'lib/mongo/server/monitor/connection.rb', line 161 def read_response(**opts) unless connected? raise ArgumentError, "Trying to read on an unconnected connection #{self}" end add_server_connection_id do add_server_diagnostics do Protocol::Message.deserialize(socket, Protocol::Message::MAX_MESSAGE_SIZE, nil, **opts) end end end |
#socket_timeout ⇒ Float
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.
Returns the monitoring socket timeout.
Note that monitoring connections use the connect timeout value as the socket timeout value. See the Server Discovery and Monitoring specification for details.
117 118 119 |
# File 'lib/mongo/server/monitor/connection.rb', line 117 def socket_timeout [:connect_timeout] || Server::CONNECT_TIMEOUT end |
#write_bytes(bytes) ⇒ 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.
147 148 149 150 151 152 153 154 155 156 157 |
# File 'lib/mongo/server/monitor/connection.rb', line 147 def write_bytes(bytes) unless connected? raise ArgumentError, "Trying to dispatch on an unconnected connection #{self}" end add_server_connection_id do add_server_diagnostics do socket.write(bytes) end end end |