mongo 2.10.5 → 2.11.0.rc0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/CONTRIBUTING.md +1 -1
- data/lib/mongo.rb +2 -0
- data/lib/mongo/address.rb +4 -0
- data/lib/mongo/address/validator.rb +99 -0
- data/lib/mongo/auth.rb +7 -2
- data/lib/mongo/auth/user.rb +1 -7
- data/lib/mongo/background_thread.rb +135 -0
- data/lib/mongo/bulk_write/transformable.rb +3 -3
- data/lib/mongo/client.rb +74 -16
- data/lib/mongo/cluster.rb +193 -41
- data/lib/mongo/cluster/periodic_executor.rb +31 -43
- data/lib/mongo/cluster/sdam_flow.rb +26 -3
- data/lib/mongo/cluster/srv_monitor.rb +127 -0
- data/lib/mongo/collection/view/readable.rb +3 -5
- data/lib/mongo/collection/view/writable.rb +3 -3
- data/lib/mongo/cursor/builder/get_more_command.rb +1 -4
- data/lib/mongo/cursor/builder/kill_cursors_command.rb +5 -23
- data/lib/mongo/cursor/builder/op_get_more.rb +2 -2
- data/lib/mongo/cursor/builder/op_kill_cursors.rb +5 -24
- data/lib/mongo/error.rb +1 -0
- data/lib/mongo/error/auth_error.rb +1 -1
- data/lib/mongo/error/connection_check_out_timeout.rb +7 -8
- data/lib/mongo/error/invalid_address.rb +24 -0
- data/lib/mongo/error/notable.rb +2 -2
- data/lib/mongo/error/operation_failure.rb +3 -3
- data/lib/mongo/error/pool_closed_error.rb +11 -4
- data/lib/mongo/event.rb +1 -1
- data/lib/mongo/grid/file.rb +0 -5
- data/lib/mongo/grid/file/chunk.rb +0 -2
- data/lib/mongo/grid/fs_bucket.rb +13 -15
- data/lib/mongo/grid/stream/write.rb +3 -9
- data/lib/mongo/loggable.rb +5 -1
- data/lib/mongo/monitoring.rb +1 -0
- data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +7 -0
- data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +11 -3
- data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +11 -3
- data/lib/mongo/monitoring/event/cmap/pool_closed.rb +11 -3
- data/lib/mongo/monitoring/event/cmap/pool_created.rb +12 -3
- data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +62 -0
- data/lib/mongo/operation/shared/executable.rb +5 -10
- data/lib/mongo/operation/shared/sessions_supported.rb +1 -5
- data/lib/mongo/protocol/get_more.rb +1 -2
- data/lib/mongo/protocol/kill_cursors.rb +13 -6
- data/lib/mongo/protocol/serializers.rb +4 -20
- data/lib/mongo/retryable.rb +9 -34
- data/lib/mongo/semaphore.rb +1 -1
- data/lib/mongo/server.rb +113 -42
- data/lib/mongo/server/connection.rb +12 -5
- data/lib/mongo/server/connection_pool.rb +250 -40
- data/lib/mongo/server/connection_pool/populator.rb +58 -0
- data/lib/mongo/server/description.rb +9 -2
- data/lib/mongo/server/monitor.rb +68 -93
- data/lib/mongo/server/monitor/connection.rb +2 -0
- data/lib/mongo/server_selector/selectable.rb +13 -5
- data/lib/mongo/session.rb +0 -13
- data/lib/mongo/srv.rb +17 -0
- data/lib/mongo/srv/monitor.rb +96 -0
- data/lib/mongo/srv/resolver.rb +130 -0
- data/lib/mongo/srv/result.rb +126 -0
- data/lib/mongo/srv/warning_result.rb +35 -0
- data/lib/mongo/uri.rb +45 -55
- data/lib/mongo/uri/srv_protocol.rb +89 -42
- data/lib/mongo/version.rb +1 -1
- data/mongo.gemspec +3 -4
- data/spec/README.md +6 -1
- data/spec/enterprise_auth/kerberos_spec.rb +7 -6
- data/spec/integration/change_stream_examples_spec.rb +0 -4
- data/spec/integration/client_construction_spec.rb +14 -2
- data/spec/integration/connect_single_rs_name_spec.rb +2 -2
- data/spec/integration/connection_pool_populator_spec.rb +296 -0
- data/spec/integration/connection_spec.rb +31 -22
- data/spec/integration/cursor_reaping_spec.rb +1 -2
- data/spec/integration/docs_examples_spec.rb +0 -4
- data/spec/integration/heartbeat_events_spec.rb +17 -15
- data/spec/integration/reconnect_spec.rb +144 -1
- data/spec/integration/retryable_writes_errors_spec.rb +0 -4
- data/spec/integration/retryable_writes_spec.rb +36 -36
- data/spec/integration/sdam_error_handling_spec.rb +31 -25
- data/spec/integration/sdam_events_spec.rb +2 -6
- data/spec/integration/server_monitor_spec.rb +28 -0
- data/spec/integration/server_selector_spec.rb +7 -5
- data/spec/integration/srv_monitoring_spec.rb +360 -0
- data/spec/integration/step_down_spec.rb +4 -6
- data/spec/lite_spec_helper.rb +22 -0
- data/spec/mongo/address/validator_spec.rb +51 -0
- data/spec/mongo/auth/cr_spec.rb +1 -29
- data/spec/mongo/auth/ldap_spec.rb +1 -29
- data/spec/mongo/auth/scram/conversation_spec.rb +0 -2
- data/spec/mongo/auth/scram/negotiation_spec.rb +1 -1
- data/spec/mongo/auth/scram_spec.rb +1 -29
- data/spec/mongo/auth/user/view_spec.rb +1 -36
- data/spec/mongo/auth/user_spec.rb +0 -12
- data/spec/mongo/auth/x509_spec.rb +1 -29
- data/spec/mongo/bulk_write_spec.rb +2 -2
- data/spec/mongo/client_construction_spec.rb +56 -15
- data/spec/mongo/client_spec.rb +31 -27
- data/spec/mongo/cluster/periodic_executor_spec.rb +16 -0
- data/spec/mongo/cluster/srv_monitor_spec.rb +214 -0
- data/spec/mongo/cluster/topology/replica_set_spec.rb +16 -11
- data/spec/mongo/cluster/topology/sharded_spec.rb +12 -9
- data/spec/mongo/cluster/topology/single_spec.rb +20 -11
- data/spec/mongo/cluster_spec.rb +45 -29
- data/spec/mongo/collection/view/map_reduce_spec.rb +14 -9
- data/spec/mongo/collection/view/readable_spec.rb +0 -16
- data/spec/mongo/collection_spec.rb +0 -44
- data/spec/mongo/cursor/builder/get_more_command_spec.rb +2 -4
- data/spec/mongo/cursor/builder/op_get_more_spec.rb +2 -4
- data/spec/mongo/cursor_spec.rb +27 -7
- data/spec/mongo/monitoring/event/cmap/connection_checked_in_spec.rb +10 -3
- data/spec/mongo/monitoring/event/cmap/connection_checked_out_spec.rb +10 -3
- data/spec/mongo/monitoring/event/cmap/pool_closed_spec.rb +10 -3
- data/spec/mongo/monitoring/event/cmap/pool_created_spec.rb +10 -3
- data/spec/mongo/operation/delete/op_msg_spec.rb +17 -8
- data/spec/mongo/operation/insert/op_msg_spec.rb +50 -35
- data/spec/mongo/operation/update/op_msg_spec.rb +14 -7
- data/spec/mongo/retryable_spec.rb +52 -31
- data/spec/mongo/server/app_metadata_spec.rb +0 -8
- data/spec/mongo/server/connection_auth_spec.rb +5 -2
- data/spec/mongo/server/connection_pool/populator_spec.rb +101 -0
- data/spec/mongo/server/connection_pool_spec.rb +256 -107
- data/spec/mongo/server/connection_spec.rb +22 -33
- data/spec/mongo/server/description_spec.rb +42 -4
- data/spec/mongo/server/monitor/connection_spec.rb +22 -11
- data/spec/mongo/server/monitor_spec.rb +66 -107
- data/spec/mongo/server_spec.rb +82 -60
- data/spec/mongo/session/session_pool_spec.rb +1 -5
- data/spec/mongo/session_spec.rb +0 -4
- data/spec/mongo/socket/ssl_spec.rb +2 -2
- data/spec/mongo/srv/monitor_spec.rb +211 -0
- data/spec/mongo/srv/result_spec.rb +54 -0
- data/spec/mongo/uri/srv_protocol_spec.rb +30 -15
- data/spec/mongo/uri_spec.rb +125 -4
- data/spec/spec_helper.rb +6 -0
- data/spec/spec_tests/auth_spec.rb +39 -0
- data/spec/spec_tests/cmap_spec.rb +55 -8
- data/spec/spec_tests/connection_string_spec.rb +6 -31
- data/spec/spec_tests/data/auth/connection-string.yml +297 -0
- data/spec/spec_tests/data/cmap/pool-checkout-error-closed.yml +4 -1
- data/spec/spec_tests/data/cmap/pool-create-with-options.yml +1 -0
- data/spec/spec_tests/data/command_monitoring/insertMany.yml +1 -1
- data/spec/spec_tests/data/connection_string/invalid-uris.yml +20 -0
- data/spec/spec_tests/data/connection_string/valid-auth.yml +16 -0
- data/spec/spec_tests/data/connection_string/valid-warnings.yml +26 -30
- data/spec/spec_tests/data/transactions/abort.yml +3 -3
- data/spec/spec_tests/data/transactions/error-labels.yml +3 -3
- data/spec/spec_tests/data/transactions_api/callback-retry.yml +3 -3
- data/spec/spec_tests/data/uri_options/auth-options.yml +1 -1
- data/spec/spec_tests/max_staleness_spec.rb +7 -2
- data/spec/spec_tests/retryable_reads_spec.rb +0 -31
- data/spec/spec_tests/sdam_monitoring_spec.rb +12 -12
- data/spec/spec_tests/sdam_spec.rb +4 -7
- data/spec/spec_tests/server_selection_spec.rb +6 -2
- data/spec/spec_tests/transactions_spec.rb +0 -2
- data/spec/spec_tests/uri_options_spec.rb +4 -2
- data/spec/stress/connection_pool_stress_spec.rb +203 -0
- data/spec/stress/connection_pool_timing_spec.rb +181 -0
- data/spec/support/auth.rb +113 -0
- data/spec/support/background_thread_registry.rb +63 -0
- data/spec/support/client_registry.rb +11 -2
- data/spec/support/cluster_config.rb +65 -46
- data/spec/support/cluster_tools.rb +2 -2
- data/spec/support/cmap.rb +13 -14
- data/spec/support/cmap/verifier.rb +4 -5
- data/spec/support/command_monitoring.rb +0 -5
- data/spec/support/common_shortcuts.rb +101 -1
- data/spec/support/constraints.rb +25 -0
- data/spec/support/dns.rb +13 -0
- data/spec/support/event_subscriber.rb +0 -7
- data/spec/support/json_ext_formatter.rb +5 -1
- data/spec/support/lite_constraints.rb +22 -6
- data/spec/support/local_resource_registry.rb +34 -0
- data/spec/support/sdam_monitoring.rb +115 -0
- data/spec/support/spec_config.rb +20 -6
- data/spec/support/spec_setup.rb +2 -2
- data/spec/support/transactions.rb +1 -1
- data/spec/support/transactions/test.rb +1 -1
- data/spec/support/utils.rb +1 -16
- metadata +685 -659
- metadata.gz.sig +0 -0
- data/lib/mongo/event/description_changed.rb +0 -52
- data/spec/integration/bson_symbol_spec.rb +0 -34
- data/spec/integration/crud_spec.rb +0 -45
- data/spec/integration/get_more_spec.rb +0 -32
- data/spec/integration/grid_fs_bucket_spec.rb +0 -48
- data/spec/integration/retryable_errors_spec.rb +0 -265
- data/spec/integration/size_limit_spec.rb~12e1e9c4f... RUBY-2242 Fix zlib compression (#2021) +0 -98
- data/spec/mongo/cursor/builder/op_kill_cursors_spec.rb +0 -56
- data/spec/runners/sdam/verifier.rb +0 -88
@@ -66,20 +66,15 @@ module Mongo
|
|
66
66
|
|
67
67
|
if result.not_master? || result.node_recovering?
|
68
68
|
if result.node_shutting_down?
|
69
|
-
|
69
|
+
keep_pool = false
|
70
70
|
else
|
71
|
-
# Max wire version needs to be
|
72
|
-
|
73
|
-
disconnect_pool = !server.description.server_version_gte?('4.2')
|
71
|
+
# Max wire version needs to be examined while the server is known
|
72
|
+
keep_pool = server.description.server_version_gte?('4.2')
|
74
73
|
end
|
75
74
|
|
76
|
-
server.unknown!
|
75
|
+
server.unknown!(keep_connection_pool: keep_pool)
|
77
76
|
|
78
|
-
|
79
|
-
server.pool.disconnect!
|
80
|
-
end
|
81
|
-
|
82
|
-
server.monitor.scan_semaphore.signal
|
77
|
+
server.scan_semaphore.signal
|
83
78
|
end
|
84
79
|
|
85
80
|
session.process(result) if session
|
@@ -95,10 +95,6 @@ module Mongo
|
|
95
95
|
session.add_autocommit!(selector)
|
96
96
|
end
|
97
97
|
|
98
|
-
def apply_session_id!(selector)
|
99
|
-
session.add_id!(selector)
|
100
|
-
end
|
101
|
-
|
102
98
|
def apply_start_transaction!(selector)
|
103
99
|
session.add_start_transaction!(selector)
|
104
100
|
end
|
@@ -146,7 +142,7 @@ module Mongo
|
|
146
142
|
def apply_session_options(sel, server)
|
147
143
|
apply_cluster_time!(sel, server)
|
148
144
|
sel[:txnNumber] = BSON::Int64.new(txn_num) if txn_num
|
149
|
-
|
145
|
+
sel.merge!(lsid: session.session_id)
|
150
146
|
apply_start_transaction!(sel)
|
151
147
|
apply_causal_consistency!(sel, server)
|
152
148
|
apply_autocommit!(sel)
|
@@ -110,7 +110,6 @@ module Mongo
|
|
110
110
|
# The get more constant.
|
111
111
|
#
|
112
112
|
# @since 2.2.0
|
113
|
-
# @deprecated
|
114
113
|
GET_MORE = 'getMore'.freeze
|
115
114
|
|
116
115
|
# @return [ String ] collection The name of the collection.
|
@@ -149,7 +148,7 @@ module Mongo
|
|
149
148
|
# @since 2.1.0
|
150
149
|
def command
|
151
150
|
document = BSON::Document.new
|
152
|
-
document.store(
|
151
|
+
document.store(GET_MORE, cursor_id)
|
153
152
|
document.store(Message::BATCH_SIZE, number_to_return)
|
154
153
|
document.store(Message::COLLECTION, collection)
|
155
154
|
document
|
@@ -52,7 +52,7 @@ module Mongo
|
|
52
52
|
command_name: 'killCursors',
|
53
53
|
database_name: @database,
|
54
54
|
command: upconverter.command,
|
55
|
-
request_id: request_id
|
55
|
+
request_id: request_id
|
56
56
|
)
|
57
57
|
end
|
58
58
|
|
@@ -85,6 +85,16 @@ module Mongo
|
|
85
85
|
# @since 2.1.0
|
86
86
|
class Upconverter
|
87
87
|
|
88
|
+
# The kill cursors constant.
|
89
|
+
#
|
90
|
+
# @since 2.2.0
|
91
|
+
KILL_CURSORS = 'killCursors'.freeze
|
92
|
+
|
93
|
+
# The cursors constant.
|
94
|
+
#
|
95
|
+
# @since 2.2.0
|
96
|
+
CURSORS = 'cursors'.freeze
|
97
|
+
|
88
98
|
# @return [ String ] collection The name of the collection.
|
89
99
|
attr_reader :collection
|
90
100
|
|
@@ -115,11 +125,8 @@ module Mongo
|
|
115
125
|
# @since 2.1.0
|
116
126
|
def command
|
117
127
|
document = BSON::Document.new
|
118
|
-
document.store(
|
119
|
-
|
120
|
-
BSON::Int64.new(cursor_id)
|
121
|
-
end
|
122
|
-
document.store('cursors', store_ids)
|
128
|
+
document.store(KILL_CURSORS, collection)
|
129
|
+
document.store(CURSORS, cursor_ids)
|
123
130
|
document
|
124
131
|
end
|
125
132
|
end
|
@@ -102,21 +102,13 @@ module Mongo
|
|
102
102
|
# Serializes and de-serializes one 32-bit integer.
|
103
103
|
module Int32
|
104
104
|
|
105
|
-
# Serializes a
|
105
|
+
# Serializes a fixnum to a 4-byte 32-bit integer
|
106
106
|
#
|
107
107
|
# @param buffer [ String ] Buffer to receive the serialized Int32.
|
108
|
-
# @param value [
|
108
|
+
# @param value [ Fixnum ] 32-bit integer to be serialized.
|
109
109
|
#
|
110
110
|
# @return [String] Buffer with serialized value.
|
111
111
|
def self.serialize(buffer, value, validating_keys = BSON::Config.validating_keys?)
|
112
|
-
if value.is_a?(BSON::Int32)
|
113
|
-
if value.respond_to?(:value)
|
114
|
-
# bson-ruby >= 4.6.0
|
115
|
-
value = value.value
|
116
|
-
else
|
117
|
-
value = value.instance_variable_get('@integer')
|
118
|
-
end
|
119
|
-
end
|
120
112
|
buffer.put_int32(value)
|
121
113
|
end
|
122
114
|
|
@@ -135,21 +127,13 @@ module Mongo
|
|
135
127
|
# Serializes and de-serializes one 64-bit integer.
|
136
128
|
module Int64
|
137
129
|
|
138
|
-
# Serializes a
|
130
|
+
# Serializes a fixnum to an 8-byte 64-bit integer
|
139
131
|
#
|
140
132
|
# @param buffer [ String ] Buffer to receive the serialized Int64.
|
141
|
-
# @param value [
|
133
|
+
# @param value [ Fixnum ] 64-bit integer to be serialized.
|
142
134
|
#
|
143
135
|
# @return [ String ] Buffer with serialized value.
|
144
136
|
def self.serialize(buffer, value, validating_keys = BSON::Config.validating_keys?)
|
145
|
-
if value.is_a?(BSON::Int64)
|
146
|
-
if value.respond_to?(:value)
|
147
|
-
# bson-ruby >= 4.6.0
|
148
|
-
value = value.value
|
149
|
-
else
|
150
|
-
value = value.instance_variable_get('@integer')
|
151
|
-
end
|
152
|
-
end
|
153
137
|
buffer.put_int64(value)
|
154
138
|
end
|
155
139
|
|
data/lib/mongo/retryable.rb
CHANGED
@@ -119,12 +119,7 @@ module Mongo
|
|
119
119
|
legacy_read_with_retry(session, server_selector, &block)
|
120
120
|
else
|
121
121
|
server = select_server(cluster, server_selector, session)
|
122
|
-
|
123
|
-
yield server
|
124
|
-
rescue Error::SocketError, Error::SocketTimeoutError, Error::OperationFailure => e
|
125
|
-
e.add_note('retries disabled')
|
126
|
-
raise e
|
127
|
-
end
|
122
|
+
yield server
|
128
123
|
end
|
129
124
|
end
|
130
125
|
|
@@ -219,14 +214,12 @@ module Mongo
|
|
219
214
|
begin
|
220
215
|
yield(server, txn_num, false)
|
221
216
|
rescue Error::SocketError, Error::SocketTimeoutError => e
|
222
|
-
e.add_note('modern retry')
|
223
217
|
e.add_note("attempt 1")
|
224
218
|
if session.in_transaction? && !ending_transaction
|
225
219
|
raise e
|
226
220
|
end
|
227
221
|
retry_write(e, session, txn_num, &block)
|
228
222
|
rescue Error::OperationFailure => e
|
229
|
-
e.add_note('modern retry')
|
230
223
|
e.add_note("attempt 1")
|
231
224
|
if e.unsupported_retryable_write?
|
232
225
|
raise_unsupported_error(e)
|
@@ -257,12 +250,7 @@ module Mongo
|
|
257
250
|
def nro_write_with_retry(session, write_concern, &block)
|
258
251
|
if session && session.client.options[:retry_writes]
|
259
252
|
server = select_server(cluster, ServerSelector.primary, session)
|
260
|
-
|
261
|
-
yield server
|
262
|
-
rescue Error::SocketError, Error::SocketTimeoutError, Error::OperationFailure => e
|
263
|
-
e.add_note('retries disabled')
|
264
|
-
raise e
|
265
|
-
end
|
253
|
+
yield server
|
266
254
|
else
|
267
255
|
legacy_write_with_retry(nil, session, &block)
|
268
256
|
end
|
@@ -292,8 +280,7 @@ module Mongo
|
|
292
280
|
server ||= select_server(cluster, ServerSelector.primary, session)
|
293
281
|
yield server
|
294
282
|
rescue Error::OperationFailure => e
|
295
|
-
e.add_note(
|
296
|
-
e.add_note("attempt #{attempt}")
|
283
|
+
e.add_note("attempt #{attempt + 1}")
|
297
284
|
server = nil
|
298
285
|
if attempt > client.max_write_retries
|
299
286
|
raise e
|
@@ -311,19 +298,18 @@ module Mongo
|
|
311
298
|
private
|
312
299
|
|
313
300
|
def modern_read_with_retry(session, server_selector, &block)
|
301
|
+
attempt = 0
|
314
302
|
server = select_server(cluster, server_selector, session)
|
315
303
|
begin
|
316
304
|
yield server
|
317
305
|
rescue Error::SocketError, Error::SocketTimeoutError => e
|
318
|
-
e.add_note(
|
319
|
-
e.add_note("attempt 1")
|
306
|
+
e.add_note("attempt #{attempt + 1}")
|
320
307
|
if session.in_transaction?
|
321
308
|
raise e
|
322
309
|
end
|
323
310
|
retry_read(e, server_selector, session, &block)
|
324
311
|
rescue Error::OperationFailure => e
|
325
|
-
e.add_note(
|
326
|
-
e.add_note("attempt 1")
|
312
|
+
e.add_note("attempt #{attempt + 1}")
|
327
313
|
if session.in_transaction? || !e.write_retryable?
|
328
314
|
raise e
|
329
315
|
end
|
@@ -338,8 +324,7 @@ module Mongo
|
|
338
324
|
attempt += 1
|
339
325
|
yield server
|
340
326
|
rescue Error::SocketError, Error::SocketTimeoutError => e
|
341
|
-
e.add_note(
|
342
|
-
e.add_note("attempt #{attempt}")
|
327
|
+
e.add_note("attempt #{attempt + 1}")
|
343
328
|
if attempt > client.max_read_retries || (session && session.in_transaction?)
|
344
329
|
raise e
|
345
330
|
end
|
@@ -347,9 +332,8 @@ module Mongo
|
|
347
332
|
server = select_server(cluster, server_selector, session)
|
348
333
|
retry
|
349
334
|
rescue Error::OperationFailure => e
|
350
|
-
e.add_note(
|
351
|
-
e.
|
352
|
-
if e.retryable? && !(session && session.in_transaction?)
|
335
|
+
e.add_note("attempt #{attempt + 1}")
|
336
|
+
if cluster.sharded? && e.retryable? && !(session && session.in_transaction?)
|
353
337
|
if attempt > client.max_read_retries
|
354
338
|
raise e
|
355
339
|
end
|
@@ -391,11 +375,9 @@ module Mongo
|
|
391
375
|
begin
|
392
376
|
yield server, true
|
393
377
|
rescue Error::SocketError, Error::SocketTimeoutError => e
|
394
|
-
e.add_note('modern retry')
|
395
378
|
e.add_note("attempt 2")
|
396
379
|
raise e
|
397
380
|
rescue Error::OperationFailure => e
|
398
|
-
e.add_note('modern retry')
|
399
381
|
unless e.write_retryable?
|
400
382
|
original_error.add_note("later retry failed: #{e.class}: #{e}")
|
401
383
|
raise original_error
|
@@ -403,7 +385,6 @@ module Mongo
|
|
403
385
|
e.add_note("attempt 2")
|
404
386
|
raise e
|
405
387
|
rescue => e
|
406
|
-
e.add_note('modern retry')
|
407
388
|
original_error.add_note("later retry failed: #{e.class}: #{e}")
|
408
389
|
raise original_error
|
409
390
|
end
|
@@ -417,19 +398,15 @@ module Mongo
|
|
417
398
|
# server unknown). Here we just need to wait for server selection.
|
418
399
|
server = select_server(cluster, ServerSelector.primary, session)
|
419
400
|
unless server.retry_writes?
|
420
|
-
# Do not need to add "modern retry" here, it should already be on
|
421
|
-
# the first exception.
|
422
401
|
original_error.add_note('did not retry because server selected for retry does not supoprt retryable writes')
|
423
402
|
raise original_error
|
424
403
|
end
|
425
404
|
log_retry(original_error, message: 'Write retry')
|
426
405
|
yield(server, txn_num, true)
|
427
406
|
rescue Error::SocketError, Error::SocketTimeoutError => e
|
428
|
-
e.add_note('modern retry')
|
429
407
|
e.add_note('attempt 2')
|
430
408
|
raise e
|
431
409
|
rescue Error::OperationFailure => e
|
432
|
-
e.add_note('modern retry')
|
433
410
|
if e.write_retryable?
|
434
411
|
e.add_note('attempt 2')
|
435
412
|
raise e
|
@@ -438,8 +415,6 @@ module Mongo
|
|
438
415
|
raise original_error
|
439
416
|
end
|
440
417
|
rescue => e
|
441
|
-
# Do not need to add "modern retry" here, it should already be on
|
442
|
-
# the first exception.
|
443
418
|
original_error.add_note("later retry failed: #{e.class}: #{e}")
|
444
419
|
raise original_error
|
445
420
|
end
|
data/lib/mongo/semaphore.rb
CHANGED
data/lib/mongo/server.rb
CHANGED
@@ -58,16 +58,24 @@ module Mongo
|
|
58
58
|
@cluster = cluster
|
59
59
|
@monitoring = monitoring
|
60
60
|
options = options.dup
|
61
|
-
|
61
|
+
_monitor = options.delete(:monitor)
|
62
62
|
@options = options.freeze
|
63
63
|
@event_listeners = event_listeners
|
64
64
|
@connection_id_gen = Class.new do
|
65
65
|
include Id
|
66
66
|
end
|
67
|
-
@
|
68
|
-
|
69
|
-
|
70
|
-
|
67
|
+
@scan_semaphore = Semaphore.new
|
68
|
+
@round_trip_time_averager = RoundTripTimeAverager.new
|
69
|
+
@description = Description.new(address, {})
|
70
|
+
@last_scan = nil
|
71
|
+
unless options[:monitoring_io] == false
|
72
|
+
@monitor = Monitor.new(self, event_listeners, monitoring,
|
73
|
+
options.merge(
|
74
|
+
app_metadata: Monitor::AppMetadata.new(cluster.options),
|
75
|
+
))
|
76
|
+
unless _monitor == false
|
77
|
+
start_monitoring
|
78
|
+
end
|
71
79
|
end
|
72
80
|
@connected = true
|
73
81
|
@pool_lock = Mutex.new
|
@@ -79,7 +87,8 @@ module Mongo
|
|
79
87
|
# @return [ Cluster ] cluster The server cluster.
|
80
88
|
attr_reader :cluster
|
81
89
|
|
82
|
-
# @return [ Monitor ] monitor The server monitor.
|
90
|
+
# @return [ nil | Monitor ] monitor The server monitor. nil if the servenr
|
91
|
+
# was created with monitoring_io: false option.
|
83
92
|
attr_reader :monitor
|
84
93
|
|
85
94
|
# @return [ Hash ] The options hash.
|
@@ -88,15 +97,46 @@ module Mongo
|
|
88
97
|
# @return [ Monitoring ] monitoring The monitoring.
|
89
98
|
attr_reader :monitoring
|
90
99
|
|
91
|
-
#
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
100
|
+
# @return [ Server::Description ] description The server
|
101
|
+
# description the monitor refreshes.
|
102
|
+
attr_reader :description
|
103
|
+
|
104
|
+
# @return [ Time | nil ] last_scan The time when the last server scan
|
105
|
+
# completed, or nil if the server has not been scanned yet.
|
106
|
+
#
|
107
|
+
# @since 2.4.0
|
108
|
+
def last_scan
|
109
|
+
if description && !description.config.empty?
|
110
|
+
description.last_update_time
|
111
|
+
else
|
112
|
+
@last_scan
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
# @deprecated
|
117
|
+
def heartbeat_frequency
|
118
|
+
cluster.heartbeat_interval
|
119
|
+
end
|
120
|
+
|
121
|
+
# @deprecated
|
98
122
|
alias :heartbeat_frequency_seconds :heartbeat_frequency
|
99
123
|
|
124
|
+
# @deprecated
|
125
|
+
def_delegators :monitor, :scan!
|
126
|
+
|
127
|
+
# The last compressor discovered by the server monitor.
|
128
|
+
#
|
129
|
+
# The compressor state should be determined for each individual
|
130
|
+
# connection rather than kept per server. A future version of the
|
131
|
+
# driver will change how compressors are tracked and used.
|
132
|
+
def compressor
|
133
|
+
if monitor
|
134
|
+
monitor.compressor
|
135
|
+
else
|
136
|
+
nil
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
100
140
|
# Delegate convenience methods to the monitor description.
|
101
141
|
def_delegators :description,
|
102
142
|
:arbiter?,
|
@@ -127,6 +167,16 @@ module Mongo
|
|
127
167
|
def_delegators :features,
|
128
168
|
:check_driver_support!
|
129
169
|
|
170
|
+
# @return [ Semaphore ] Semaphore to signal to request an immediate scan
|
171
|
+
# of this server by its monitor, if one is running.
|
172
|
+
#
|
173
|
+
# @api private
|
174
|
+
attr_reader :scan_semaphore
|
175
|
+
|
176
|
+
# @return [ RoundTripTimeAverager ] Round trip time averager object.
|
177
|
+
# @api private
|
178
|
+
attr_reader :round_trip_time_averager
|
179
|
+
|
130
180
|
# Is this server equal to another?
|
131
181
|
#
|
132
182
|
# @example Is the server equal to the other?
|
@@ -169,26 +219,37 @@ module Mongo
|
|
169
219
|
# @deprecated No longer necessary with Server Selection specification.
|
170
220
|
def connectable?; end
|
171
221
|
|
172
|
-
# Disconnect the
|
173
|
-
#
|
174
|
-
# @example Disconnect the server.
|
175
|
-
# server.disconnect!
|
222
|
+
# Disconnect the driver from this server.
|
176
223
|
#
|
177
|
-
#
|
178
|
-
#
|
224
|
+
# Disconnects all idle connections to this server in its connection pool,
|
225
|
+
# if any exist. Stops the populator of the connection pool, if it is
|
226
|
+
# running. Does not immediately close connections which are presently
|
227
|
+
# checked out (i.e. in use) - such connections will be closed when they
|
228
|
+
# are returned to their respective connection pools. Stop the server's
|
229
|
+
# background monitor.
|
179
230
|
#
|
180
|
-
# @return [ true ] Always true
|
231
|
+
# @return [ true ] Always true.
|
181
232
|
#
|
182
233
|
# @since 2.0.0
|
183
|
-
def disconnect!
|
184
|
-
|
234
|
+
def disconnect!
|
235
|
+
if monitor
|
236
|
+
monitor.stop!
|
237
|
+
end
|
238
|
+
_pool = @pool_lock.synchronize do
|
239
|
+
@pool
|
240
|
+
end
|
241
|
+
if _pool
|
185
242
|
# For backwards compatibility we disconnect/clear the pool rather
|
186
|
-
# than close it here.
|
187
|
-
pool
|
188
|
-
|
189
|
-
#
|
243
|
+
# than close it here. We also stop the populator which allows the
|
244
|
+
# the pool to continue providing connections but stops it from
|
245
|
+
# connecting in background on clients/servers that are in fact
|
246
|
+
# intended to be closed and no longer used.
|
247
|
+
begin
|
248
|
+
_pool.disconnect!(stop_populator: true)
|
249
|
+
rescue Error::PoolClosedError
|
250
|
+
# If the pool was already closed, we don't need to do anything here.
|
251
|
+
end
|
190
252
|
end
|
191
|
-
monitor.stop!(wait)
|
192
253
|
@connected = false
|
193
254
|
true
|
194
255
|
end
|
@@ -228,8 +289,8 @@ module Mongo
|
|
228
289
|
Monitoring::Event::ServerOpening.new(address, cluster.topology)
|
229
290
|
)
|
230
291
|
if options[:monitoring_io] != false
|
231
|
-
monitor.run!
|
232
292
|
ObjectSpace.define_finalizer(self, self.class.finalize(monitor))
|
293
|
+
monitor.run!
|
233
294
|
end
|
234
295
|
end
|
235
296
|
|
@@ -275,11 +336,17 @@ module Mongo
|
|
275
336
|
if replica_set_name
|
276
337
|
status += " replica_set=#{replica_set_name}"
|
277
338
|
end
|
339
|
+
|
340
|
+
if @pool
|
341
|
+
status += " pool=#{@pool.summary}"
|
342
|
+
end
|
343
|
+
|
278
344
|
address_bit = if address
|
279
345
|
"#{address.host}:#{address.port}"
|
280
346
|
else
|
281
347
|
'nil'
|
282
348
|
end
|
349
|
+
|
283
350
|
"#<Server address=#{address_bit} #{status}>"
|
284
351
|
end
|
285
352
|
|
@@ -374,7 +441,6 @@ module Mongo
|
|
374
441
|
rescue Mongo::Error::SocketError
|
375
442
|
# non-timeout network error
|
376
443
|
unknown!
|
377
|
-
pool.disconnect!
|
378
444
|
raise
|
379
445
|
rescue Auth::Unauthorized
|
380
446
|
# auth error, keep server description and topology as they are
|
@@ -407,24 +473,24 @@ module Mongo
|
|
407
473
|
# Marks server unknown and publishes the associated SDAM event
|
408
474
|
# (server description changed).
|
409
475
|
#
|
476
|
+
# @param [ Hash ] options Options.
|
477
|
+
#
|
478
|
+
# @option options [ true | false ] :keep_connection_pool Usually when the
|
479
|
+
# new server description is unknown, the connection pool on the
|
480
|
+
# respective server is cleared. Set this option to true to keep the
|
481
|
+
# existing connection pool (required when handling not master errors
|
482
|
+
# on 4.2+ servers).
|
483
|
+
#
|
410
484
|
# @since 2.4.0, SDAM events are sent as of version 2.7.0
|
411
|
-
def unknown!
|
412
|
-
#
|
413
|
-
#
|
414
|
-
|
415
|
-
publish(Event::DESCRIPTION_CHANGED, description, Description.new(address))
|
485
|
+
def unknown!(options = {})
|
486
|
+
# SDAM flow will update description on the server without in-place
|
487
|
+
# mutations and invoke SDAM transitions as needed.
|
488
|
+
cluster.run_sdam_flow(description, Description.new(address), options)
|
416
489
|
end
|
417
490
|
|
418
491
|
# @api private
|
419
492
|
def update_description(description)
|
420
|
-
|
421
|
-
monitor.instance_variable_set('@description', description)
|
422
|
-
if description.unknown? && !prev_description.unknown?
|
423
|
-
# This clears redundantly sometimes and also clears the pool on
|
424
|
-
# 4.2+ servers after not master errors which should not be done.
|
425
|
-
# Driver version 2.11+ has the correct implementation.
|
426
|
-
clear_connection_pool
|
427
|
-
end
|
493
|
+
@description = description
|
428
494
|
end
|
429
495
|
|
430
496
|
# @api private
|
@@ -440,6 +506,11 @@ module Mongo
|
|
440
506
|
def next_connection_id
|
441
507
|
@connection_id_gen.next_id
|
442
508
|
end
|
509
|
+
|
510
|
+
# @api private
|
511
|
+
def update_last_scan
|
512
|
+
@last_scan = Time.now
|
513
|
+
end
|
443
514
|
end
|
444
515
|
end
|
445
516
|
|