mongo 2.7.2 → 2.8.0.rc0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +1 -3
- data/lib/mongo/address.rb +17 -20
- data/lib/mongo/address/ipv4.rb +6 -3
- data/lib/mongo/address/ipv6.rb +6 -3
- data/lib/mongo/address/unix.rb +5 -2
- data/lib/mongo/auth.rb +15 -2
- data/lib/mongo/auth/cr/conversation.rb +4 -2
- data/lib/mongo/auth/ldap/conversation.rb +4 -2
- data/lib/mongo/auth/scram.rb +3 -7
- data/lib/mongo/auth/scram/conversation.rb +28 -19
- data/lib/mongo/auth/user.rb +45 -10
- data/lib/mongo/auth/x509/conversation.rb +4 -2
- data/lib/mongo/cluster.rb +9 -17
- data/lib/mongo/error.rb +2 -0
- data/lib/mongo/error/missing_password.rb +29 -0
- data/lib/mongo/error/operation_failure.rb +7 -3
- data/lib/mongo/error/parser.rb +2 -1
- data/lib/mongo/error/sdam_error_detection.rb +54 -0
- data/lib/mongo/operation/aggregate/command.rb +1 -16
- data/lib/mongo/operation/aggregate/op_msg.rb +1 -1
- data/lib/mongo/operation/collections_info.rb +2 -3
- data/lib/mongo/operation/delete/command.rb +2 -15
- data/lib/mongo/operation/delete/legacy.rb +1 -16
- data/lib/mongo/operation/explain/command.rb +1 -16
- data/lib/mongo/operation/explain/legacy.rb +1 -16
- data/lib/mongo/operation/find/command.rb +1 -16
- data/lib/mongo/operation/find/legacy.rb +1 -16
- data/lib/mongo/operation/get_more/command.rb +1 -16
- data/lib/mongo/operation/indexes/command.rb +1 -16
- data/lib/mongo/operation/indexes/legacy.rb +4 -16
- data/lib/mongo/operation/list_collections/command.rb +1 -16
- data/lib/mongo/operation/map_reduce/command.rb +1 -16
- data/lib/mongo/operation/parallel_scan/command.rb +1 -16
- data/lib/mongo/operation/result.rb +3 -0
- data/lib/mongo/operation/shared/executable.rb +4 -0
- data/lib/mongo/operation/shared/polymorphic_lookup.rb +1 -1
- data/lib/mongo/operation/shared/polymorphic_result.rb +8 -1
- data/lib/mongo/operation/shared/result/aggregatable.rb +0 -5
- data/lib/mongo/operation/update/command.rb +2 -15
- data/lib/mongo/operation/update/legacy.rb +1 -16
- data/lib/mongo/operation/users_info/command.rb +1 -16
- data/lib/mongo/retryable.rb +22 -10
- data/lib/mongo/server.rb +10 -1
- data/lib/mongo/server/app_metadata.rb +7 -2
- data/lib/mongo/server/connectable.rb +0 -6
- data/lib/mongo/server/connection.rb +86 -135
- data/lib/mongo/server/connection_base.rb +133 -0
- data/lib/mongo/server/connection_pool.rb +11 -24
- data/lib/mongo/server/connection_pool/queue.rb +41 -41
- data/lib/mongo/server/description.rb +1 -1
- data/lib/mongo/server/monitor.rb +4 -4
- data/lib/mongo/server/monitor/connection.rb +26 -7
- data/lib/mongo/server/pending_connection.rb +36 -0
- data/lib/mongo/server_selector/selectable.rb +9 -1
- data/lib/mongo/session.rb +0 -1
- data/lib/mongo/socket.rb +23 -6
- data/lib/mongo/socket/ssl.rb +11 -18
- data/lib/mongo/socket/tcp.rb +13 -14
- data/lib/mongo/socket/unix.rb +9 -27
- data/lib/mongo/uri.rb +1 -1
- data/lib/mongo/version.rb +1 -1
- data/spec/integration/auth_spec.rb +160 -0
- data/spec/integration/retryable_writes_spec.rb +55 -58
- data/spec/integration/sdam_error_handling_spec.rb +115 -0
- data/spec/mongo/address/ipv4_spec.rb +4 -0
- data/spec/mongo/address/ipv6_spec.rb +4 -0
- data/spec/mongo/auth/scram/conversation_spec.rb +6 -5
- data/spec/mongo/auth/scram/negotiation_spec.rb +25 -36
- data/spec/mongo/auth/scram_spec.rb +2 -2
- data/spec/mongo/auth/user_spec.rb +97 -0
- data/spec/mongo/client_construction_spec.rb +1 -1
- data/spec/mongo/error/operation_failure_spec.rb +125 -1
- data/spec/mongo/retryable_spec.rb +17 -8
- data/spec/mongo/server/connection_pool/queue_spec.rb +24 -10
- data/spec/mongo/server/connection_pool_spec.rb +30 -117
- data/spec/mongo/server/connection_spec.rb +147 -25
- data/spec/mongo/server/description_spec.rb +0 -14
- data/spec/mongo/server/monitor/connection_spec.rb +22 -0
- data/spec/mongo/server_selector_spec.rb +1 -0
- data/spec/mongo/server_spec.rb +6 -6
- data/spec/mongo/socket/ssl_spec.rb +48 -116
- data/spec/mongo/socket/tcp_spec.rb +22 -0
- data/spec/mongo/socket/unix_spec.rb +9 -9
- data/spec/mongo/socket_spec.rb +15 -3
- data/spec/spec_tests/server_selection_spec.rb +2 -0
- data/spec/support/client_registry.rb +8 -2
- data/spec/support/common_shortcuts.rb +20 -1
- data/spec/support/constraints.rb +10 -2
- data/spec/support/lite_constraints.rb +8 -0
- data/spec/support/spec_config.rb +9 -1
- metadata +14 -4
- metadata.gz.sig +0 -0
@@ -92,7 +92,10 @@ module Mongo
|
|
92
92
|
# @return [ Array ] queue The underlying array of connections.
|
93
93
|
attr_reader :queue
|
94
94
|
|
95
|
-
# @return [ Mutex ] mutex The mutex used for synchronization
|
95
|
+
# @return [ Mutex ] mutex The mutex used for synchronization of
|
96
|
+
# access to #queue.
|
97
|
+
#
|
98
|
+
# @api private
|
96
99
|
attr_reader :mutex
|
97
100
|
|
98
101
|
# @return [ Hash ] options The options.
|
@@ -104,7 +107,11 @@ module Mongo
|
|
104
107
|
# Number of connections that the pool has which are ready to be
|
105
108
|
# checked out. This is NOT the size of the connection pool (total
|
106
109
|
# number of active connections created by the pool).
|
107
|
-
|
110
|
+
def size
|
111
|
+
mutex.synchronize do
|
112
|
+
queue.size
|
113
|
+
end
|
114
|
+
end
|
108
115
|
|
109
116
|
# Number of connections that the pool has which are ready to be
|
110
117
|
# checked out.
|
@@ -133,14 +140,15 @@ module Mongo
|
|
133
140
|
# @since 2.0.0
|
134
141
|
def dequeue
|
135
142
|
check_count_invariants
|
136
|
-
|
137
|
-
dequeue_connection
|
138
|
-
end
|
143
|
+
dequeue_connection
|
139
144
|
ensure
|
140
145
|
check_count_invariants
|
141
146
|
end
|
142
147
|
|
143
|
-
#
|
148
|
+
# Closes all idle connections in the queue and schedules currently
|
149
|
+
# dequeued connections to be closed when they are enqueued back into
|
150
|
+
# the queue. The queue remains operational and can create new
|
151
|
+
# connections when requested.
|
144
152
|
#
|
145
153
|
# @example Disconnect all connections.
|
146
154
|
# queue.disconnect!
|
@@ -151,19 +159,16 @@ module Mongo
|
|
151
159
|
def disconnect!
|
152
160
|
check_count_invariants
|
153
161
|
mutex.synchronize do
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
162
|
+
while connection = queue.pop
|
163
|
+
connection.disconnect!
|
164
|
+
@pool_size -= 1
|
165
|
+
if @pool_size < 0
|
166
|
+
# This should never happen
|
167
|
+
log_warn("ConnectionPool::Queue: connection accounting problem")
|
168
|
+
@pool_size = 0
|
169
|
+
end
|
160
170
|
end
|
161
|
-
queue.clear
|
162
171
|
@generation += 1
|
163
|
-
while @pool_size < min_size
|
164
|
-
@pool_size += 1
|
165
|
-
queue.unshift(@block.call(@generation))
|
166
|
-
end
|
167
172
|
true
|
168
173
|
end
|
169
174
|
ensure
|
@@ -290,26 +295,19 @@ module Mongo
|
|
290
295
|
check_count_invariants
|
291
296
|
return unless max_idle_time
|
292
297
|
|
293
|
-
to_refresh = []
|
294
|
-
queue.each do |connection|
|
295
|
-
if last_checkin = connection.last_checkin
|
296
|
-
if (Time.now - last_checkin) > max_idle_time
|
297
|
-
to_refresh << connection
|
298
|
-
end
|
299
|
-
end
|
300
|
-
end
|
301
|
-
|
302
298
|
mutex.synchronize do
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
299
|
+
i = 0
|
300
|
+
while i < queue.length
|
301
|
+
connection = queue[i]
|
302
|
+
if last_checkin = connection.last_checkin
|
303
|
+
if (Time.now - last_checkin) > max_idle_time
|
304
|
+
connection.disconnect!
|
305
|
+
queue.delete_at(i)
|
306
|
+
@pool_size -= 1
|
307
|
+
next
|
311
308
|
end
|
312
309
|
end
|
310
|
+
i += 1
|
313
311
|
end
|
314
312
|
end
|
315
313
|
ensure
|
@@ -319,12 +317,14 @@ module Mongo
|
|
319
317
|
private
|
320
318
|
|
321
319
|
def dequeue_connection
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
320
|
+
mutex.synchronize do
|
321
|
+
deadline = Time.now + wait_timeout
|
322
|
+
loop do
|
323
|
+
return queue.shift unless queue.empty?
|
324
|
+
connection = create_connection
|
325
|
+
return connection if connection
|
326
|
+
wait_for_next!(deadline)
|
327
|
+
end
|
328
328
|
end
|
329
329
|
end
|
330
330
|
|
@@ -345,7 +345,7 @@ module Mongo
|
|
345
345
|
|
346
346
|
def check_count_invariants
|
347
347
|
if Mongo::Lint.enabled?
|
348
|
-
if pool_size <
|
348
|
+
if pool_size < 0
|
349
349
|
raise Error::LintError, 'connection pool queue: underflow'
|
350
350
|
end
|
351
351
|
if pool_size > max_size
|
@@ -196,7 +196,7 @@ module Mongo
|
|
196
196
|
@features = Features.new(wire_versions, me || @address.to_s)
|
197
197
|
end
|
198
198
|
@average_round_trip_time = average_round_trip_time
|
199
|
-
@last_update_time = Time.now.
|
199
|
+
@last_update_time = Time.now.freeze
|
200
200
|
|
201
201
|
if Mongo::Lint.enabled?
|
202
202
|
# prepopulate cache instance variables
|
data/lib/mongo/server/monitor.rb
CHANGED
@@ -227,7 +227,7 @@ module Mongo
|
|
227
227
|
if monitoring.monitoring?
|
228
228
|
monitoring.started(
|
229
229
|
Monitoring::SERVER_HEARTBEAT,
|
230
|
-
Monitoring::Event::ServerHeartbeatStarted.new(
|
230
|
+
Monitoring::Event::ServerHeartbeatStarted.new(description.address)
|
231
231
|
)
|
232
232
|
end
|
233
233
|
|
@@ -235,11 +235,11 @@ module Mongo
|
|
235
235
|
connection.ismaster
|
236
236
|
end
|
237
237
|
if exc
|
238
|
-
log_debug("Error running ismaster on #{
|
238
|
+
log_debug("Error running ismaster on #{description.address}: #{exc.message}")
|
239
239
|
if monitoring.monitoring?
|
240
240
|
monitoring.failed(
|
241
241
|
Monitoring::SERVER_HEARTBEAT,
|
242
|
-
Monitoring::Event::ServerHeartbeatFailed.new(
|
242
|
+
Monitoring::Event::ServerHeartbeatFailed.new(description.address, rtt, exc)
|
243
243
|
)
|
244
244
|
end
|
245
245
|
result = {}
|
@@ -247,7 +247,7 @@ module Mongo
|
|
247
247
|
if monitoring.monitoring?
|
248
248
|
monitoring.succeeded(
|
249
249
|
Monitoring::SERVER_HEARTBEAT,
|
250
|
-
Monitoring::Event::ServerHeartbeatSucceeded.new(
|
250
|
+
Monitoring::Event::ServerHeartbeatSucceeded.new(description.address, rtt)
|
251
251
|
)
|
252
252
|
end
|
253
253
|
end
|
@@ -73,7 +73,14 @@ module Mongo
|
|
73
73
|
COMPRESSION_WARNING = 'The server has no compression algorithms in common with those requested. ' +
|
74
74
|
'Compression will not be used.'.freeze
|
75
75
|
|
76
|
-
#
|
76
|
+
# Creates a new connection object to the specified target address
|
77
|
+
# with the specified options.
|
78
|
+
#
|
79
|
+
# The constructor does not perform any I/O (and thus does not create
|
80
|
+
# sockets nor handshakes); call connect! method on the connection
|
81
|
+
# object to create the network connection.
|
82
|
+
#
|
83
|
+
# @note Monitoring connections do not authenticate.
|
77
84
|
#
|
78
85
|
# @api private
|
79
86
|
#
|
@@ -113,6 +120,12 @@ module Mongo
|
|
113
120
|
@compressor = nil
|
114
121
|
end
|
115
122
|
|
123
|
+
# @return [ Hash ] options The passed in options.
|
124
|
+
attr_reader :options
|
125
|
+
|
126
|
+
# @return [ Mongo::Address ] address The address to connect to.
|
127
|
+
attr_reader :address
|
128
|
+
|
116
129
|
# The compressor, which is determined during the handshake.
|
117
130
|
#
|
118
131
|
# @since 2.5.0
|
@@ -135,7 +148,9 @@ module Mongo
|
|
135
148
|
end
|
136
149
|
end
|
137
150
|
|
138
|
-
#
|
151
|
+
# Establishes a network connection to the target address.
|
152
|
+
#
|
153
|
+
# If the connection is already established, this method does nothing.
|
139
154
|
#
|
140
155
|
# @example Connect to the host.
|
141
156
|
# connection.connect!
|
@@ -147,10 +162,11 @@ module Mongo
|
|
147
162
|
#
|
148
163
|
# @since 2.0.0
|
149
164
|
def connect!
|
150
|
-
unless socket
|
151
|
-
|
152
|
-
|
153
|
-
handshake!
|
165
|
+
unless @socket
|
166
|
+
socket = address.socket(socket_timeout, ssl_options,
|
167
|
+
connect_timeout: address.connect_timeout)
|
168
|
+
handshake!(socket)
|
169
|
+
@socket = socket
|
154
170
|
end
|
155
171
|
true
|
156
172
|
end
|
@@ -204,13 +220,16 @@ module Mongo
|
|
204
220
|
end
|
205
221
|
end
|
206
222
|
|
207
|
-
def handshake!
|
223
|
+
def handshake!(socket)
|
208
224
|
if @app_metadata
|
209
225
|
socket.write(@app_metadata.ismaster_bytes)
|
210
226
|
reply = Protocol::Message.deserialize(socket, Mongo::Protocol::Message::MAX_MESSAGE_SIZE).documents[0]
|
211
227
|
set_compressor!(reply)
|
212
228
|
reply
|
213
229
|
end
|
230
|
+
rescue => e
|
231
|
+
log_warn("Failed to handshake with #{address}: #{e.class}: #{e}")
|
232
|
+
raise
|
214
233
|
end
|
215
234
|
|
216
235
|
def retry_message
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# Copyright (C) 2019 MongoDB, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module Mongo
|
16
|
+
class Server
|
17
|
+
|
18
|
+
# This class encapsulates connections during handshake and authentication.
|
19
|
+
#
|
20
|
+
# @api private
|
21
|
+
class PendingConnection < ConnectionBase
|
22
|
+
extend Forwardable
|
23
|
+
|
24
|
+
def initialize(socket, server, monitoring, options = {})
|
25
|
+
@socket = socket
|
26
|
+
@options = options
|
27
|
+
@server = server
|
28
|
+
@monitoring = monitoring
|
29
|
+
end
|
30
|
+
|
31
|
+
def ensure_connected
|
32
|
+
yield @socket
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -124,7 +124,7 @@ module Mongo
|
|
124
124
|
@local_threshold = cluster.options[:local_threshold] || LOCAL_THRESHOLD
|
125
125
|
@server_selection_timeout = cluster.options[:server_selection_timeout] || SERVER_SELECTION_TIMEOUT
|
126
126
|
deadline = Time.now + server_selection_timeout
|
127
|
-
while (deadline - Time.now) > 0
|
127
|
+
while (time_remaining = deadline - Time.now) > 0
|
128
128
|
servers = candidates(cluster)
|
129
129
|
if Lint.enabled?
|
130
130
|
servers.each do |server|
|
@@ -155,6 +155,14 @@ module Mongo
|
|
155
155
|
return server
|
156
156
|
end
|
157
157
|
cluster.scan!(false)
|
158
|
+
if cluster.server_selection_semaphore
|
159
|
+
cluster.server_selection_semaphore.wait(time_remaining)
|
160
|
+
else
|
161
|
+
if Lint.enabled?
|
162
|
+
raise Error::LintError, 'Waiting for server selection without having a server selection semaphore'
|
163
|
+
end
|
164
|
+
sleep 0.25
|
165
|
+
end
|
158
166
|
end
|
159
167
|
|
160
168
|
msg = "No #{name} server is available in cluster: #{cluster.summary} " +
|
data/lib/mongo/session.rb
CHANGED
@@ -812,7 +812,6 @@ module Mongo
|
|
812
812
|
if e.label?(Mongo::Error::UNKNOWN_TRANSACTION_COMMIT_RESULT_LABEL)
|
813
813
|
# WriteConcernFailed
|
814
814
|
if e.is_a?(Mongo::Error::OperationFailure) && e.code == 64 && e.wtimeout?
|
815
|
-
transaction_in_progress = false
|
816
815
|
raise
|
817
816
|
end
|
818
817
|
if Time.now >= deadline
|
data/lib/mongo/socket.rb
CHANGED
@@ -34,6 +34,7 @@ module Mongo
|
|
34
34
|
# Error message for timeouts on socket calls.
|
35
35
|
#
|
36
36
|
# @since 2.0.0
|
37
|
+
# @deprecated
|
37
38
|
TIMEOUT_ERROR = 'Socket request timed out'.freeze
|
38
39
|
|
39
40
|
# The pack directive for timeouts.
|
@@ -47,6 +48,9 @@ module Mongo
|
|
47
48
|
# @return [ Socket ] socket The wrapped socket.
|
48
49
|
attr_reader :socket
|
49
50
|
|
51
|
+
# @return [ Hash ] The options.
|
52
|
+
attr_reader :options
|
53
|
+
|
50
54
|
# Is the socket connection alive?
|
51
55
|
#
|
52
56
|
# @example Is the socket alive?
|
@@ -162,7 +166,16 @@ module Mongo
|
|
162
166
|
# @since 2.0.5
|
163
167
|
def eof?
|
164
168
|
@socket.eof?
|
165
|
-
rescue IOError, SystemCallError
|
169
|
+
rescue IOError, SystemCallError
|
170
|
+
true
|
171
|
+
end
|
172
|
+
|
173
|
+
# For backwards compatibilty only, do not use.
|
174
|
+
#
|
175
|
+
# @return [ true ] Always true.
|
176
|
+
#
|
177
|
+
# @deprecated
|
178
|
+
def connectable?
|
166
179
|
true
|
167
180
|
end
|
168
181
|
|
@@ -189,7 +202,7 @@ module Mongo
|
|
189
202
|
buf_size = length
|
190
203
|
end
|
191
204
|
|
192
|
-
# The binary encoding is important, otherwise
|
205
|
+
# The binary encoding is important, otherwise Ruby performs encoding
|
193
206
|
# conversions of some sort during the write into the buffer which
|
194
207
|
# kills performance
|
195
208
|
buf = allocate_string(buf_size)
|
@@ -281,13 +294,17 @@ module Mongo
|
|
281
294
|
def handle_errors
|
282
295
|
begin
|
283
296
|
yield
|
284
|
-
rescue Errno::ETIMEDOUT
|
285
|
-
raise Error::SocketTimeoutError,
|
297
|
+
rescue Errno::ETIMEDOUT => e
|
298
|
+
raise Error::SocketTimeoutError, "#{e.class}: #{e} (for #{address})"
|
286
299
|
rescue IOError, SystemCallError => e
|
287
|
-
raise Error::SocketError, "#{e.class}: #{e}"
|
300
|
+
raise Error::SocketError, "#{e.class}: #{e} (for #{address})"
|
288
301
|
rescue OpenSSL::SSL::SSLError => e
|
289
|
-
raise Error::SocketError, "#{e.class}: #{e} (#{SSL_ERROR})"
|
302
|
+
raise Error::SocketError, "#{e.class}: #{e} (for #{address}) (#{SSL_ERROR})"
|
290
303
|
end
|
291
304
|
end
|
305
|
+
|
306
|
+
def address
|
307
|
+
raise NotImplementedError
|
308
|
+
end
|
292
309
|
end
|
293
310
|
end
|
data/lib/mongo/socket/ssl.rb
CHANGED
@@ -32,9 +32,6 @@ module Mongo
|
|
32
32
|
# @return [ String ] host_name The original host name.
|
33
33
|
attr_reader :host_name
|
34
34
|
|
35
|
-
# @return [ Hash ] The ssl options.
|
36
|
-
attr_reader :options
|
37
|
-
|
38
35
|
# @return [ Integer ] port The port to connect to.
|
39
36
|
attr_reader :port
|
40
37
|
|
@@ -52,8 +49,8 @@ module Mongo
|
|
52
49
|
# @return [ SSL ] The connected socket instance.
|
53
50
|
#
|
54
51
|
# @since 2.0.0
|
55
|
-
def connect!
|
56
|
-
Timeout.timeout(connect_timeout, Error::SocketTimeoutError) do
|
52
|
+
def connect!
|
53
|
+
Timeout.timeout(options[:connect_timeout], Error::SocketTimeoutError) do
|
57
54
|
handle_errors { @tcp_socket.connect(::Socket.pack_sockaddr_in(port, host)) }
|
58
55
|
@socket = OpenSSL::SSL::SSLSocket.new(@tcp_socket, context)
|
59
56
|
@socket.hostname = @host_name
|
@@ -63,6 +60,7 @@ module Mongo
|
|
63
60
|
self
|
64
61
|
end
|
65
62
|
end
|
63
|
+
private :connect!
|
66
64
|
|
67
65
|
# Initializes a new SSL socket.
|
68
66
|
#
|
@@ -73,7 +71,9 @@ module Mongo
|
|
73
71
|
# @param [ Integer ] port The port number.
|
74
72
|
# @param [ Float ] timeout The socket timeout value.
|
75
73
|
# @param [ Integer ] family The socket family.
|
76
|
-
# @param [ Hash ] options The
|
74
|
+
# @param [ Hash ] options The options.
|
75
|
+
#
|
76
|
+
# @option options [ Float ] :connect_timeout Connect timeout.
|
77
77
|
#
|
78
78
|
# @since 2.0.0
|
79
79
|
def initialize(host, port, host_name, timeout, family, options = {})
|
@@ -83,6 +83,7 @@ module Mongo
|
|
83
83
|
@tcp_socket = ::Socket.new(family, SOCK_STREAM, 0)
|
84
84
|
@tcp_socket.setsockopt(IPPROTO_TCP, TCP_NODELAY, 1)
|
85
85
|
set_socket_options(@tcp_socket)
|
86
|
+
connect!
|
86
87
|
end
|
87
88
|
|
88
89
|
# Read a single byte from the socket.
|
@@ -100,18 +101,6 @@ module Mongo
|
|
100
101
|
end
|
101
102
|
end
|
102
103
|
|
103
|
-
# This socket can only be used if the ssl socket (@socket) has been created.
|
104
|
-
#
|
105
|
-
# @example Is the socket connectable?
|
106
|
-
# socket.connectable?
|
107
|
-
#
|
108
|
-
# @return [ true, false ] If the socket is connectable.
|
109
|
-
#
|
110
|
-
# @since 2.2.5
|
111
|
-
def connectable?
|
112
|
-
!!@socket
|
113
|
-
end
|
114
|
-
|
115
104
|
private
|
116
105
|
|
117
106
|
def verify_certificate?
|
@@ -213,6 +202,10 @@ module Mongo
|
|
213
202
|
# Capped at 16k due to https://linux.die.net/man/3/ssl_read
|
214
203
|
16384
|
215
204
|
end
|
205
|
+
|
206
|
+
def address
|
207
|
+
"#{host}:#{port} (#{host_name}:#{port}, TLS)"
|
208
|
+
end
|
216
209
|
end
|
217
210
|
end
|
218
211
|
end
|