mongo 2.14.0 → 2.15.0.alpha
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/README.md +4 -1
- data/Rakefile +8 -15
- data/lib/mongo.rb +23 -0
- data/lib/mongo/auth/aws/conversation.rb +1 -4
- data/lib/mongo/auth/base.rb +13 -7
- data/lib/mongo/auth/conversation_base.rb +32 -0
- data/lib/mongo/auth/cr/conversation.rb +6 -29
- data/lib/mongo/auth/gssapi/conversation.rb +4 -15
- data/lib/mongo/auth/ldap/conversation.rb +3 -14
- data/lib/mongo/auth/sasl_conversation_base.rb +1 -13
- data/lib/mongo/auth/scram_conversation_base.rb +7 -34
- data/lib/mongo/auth/user/view.rb +16 -9
- data/lib/mongo/auth/x509/conversation.rb +4 -25
- data/lib/mongo/background_thread.rb +11 -0
- data/lib/mongo/bulk_write.rb +21 -18
- data/lib/mongo/client.rb +82 -6
- data/lib/mongo/cluster.rb +19 -28
- data/lib/mongo/cluster/reapers/cursor_reaper.rb +6 -2
- data/lib/mongo/cluster/sdam_flow.rb +14 -0
- data/lib/mongo/collection.rb +8 -6
- data/lib/mongo/collection/view/aggregation.rb +1 -1
- data/lib/mongo/collection/view/change_stream.rb +1 -1
- data/lib/mongo/collection/view/iterable.rb +1 -1
- data/lib/mongo/collection/view/map_reduce.rb +2 -2
- data/lib/mongo/collection/view/readable.rb +42 -20
- data/lib/mongo/collection/view/writable.rb +14 -14
- data/lib/mongo/cursor.rb +2 -2
- data/lib/mongo/database.rb +22 -5
- data/lib/mongo/database/view.rb +1 -1
- data/lib/mongo/error.rb +9 -1
- data/lib/mongo/error/bulk_write_error.rb +17 -3
- data/lib/mongo/error/internal_driver_error.rb +22 -0
- data/lib/mongo/error/operation_failure.rb +21 -2
- data/lib/mongo/error/parser.rb +65 -12
- data/lib/mongo/error/server_api_conflict.rb +23 -0
- data/lib/mongo/error/server_api_not_supported.rb +24 -0
- data/lib/mongo/error/unmet_dependency.rb +21 -0
- data/lib/mongo/grid/fs_bucket.rb +37 -37
- data/lib/mongo/index/view.rb +21 -11
- data/lib/mongo/monitoring.rb +13 -4
- data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +27 -16
- data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +26 -15
- data/lib/mongo/operation.rb +2 -2
- data/lib/mongo/operation/collections_info.rb +18 -1
- data/lib/mongo/operation/collections_info/command.rb +2 -2
- data/lib/mongo/operation/context.rb +99 -0
- data/lib/mongo/operation/indexes.rb +15 -1
- data/lib/mongo/operation/insert/command.rb +2 -2
- data/lib/mongo/operation/insert/legacy.rb +2 -2
- data/lib/mongo/operation/insert/op_msg.rb +2 -2
- data/lib/mongo/operation/list_collections/result.rb +4 -1
- data/lib/mongo/operation/result.rb +2 -0
- data/lib/mongo/operation/shared/executable.rb +24 -14
- data/lib/mongo/operation/shared/executable_no_validate.rb +2 -2
- data/lib/mongo/operation/shared/op_msg_or_command.rb +1 -7
- data/lib/mongo/operation/shared/op_msg_or_find_command.rb +1 -7
- data/lib/mongo/operation/shared/polymorphic_operation.rb +39 -0
- data/lib/mongo/operation/shared/response_handling.rb +23 -23
- data/lib/mongo/operation/shared/sessions_supported.rb +13 -2
- data/lib/mongo/operation/shared/write.rb +8 -18
- data/lib/mongo/protocol/compressed.rb +51 -5
- data/lib/mongo/protocol/message.rb +20 -2
- data/lib/mongo/protocol/msg.rb +36 -11
- data/lib/mongo/query_cache.rb +30 -0
- data/lib/mongo/retryable.rb +1 -1
- data/lib/mongo/server.rb +7 -15
- data/lib/mongo/server/app_metadata.rb +52 -18
- data/lib/mongo/server/connection.rb +5 -0
- data/lib/mongo/server/connection_base.rb +13 -10
- data/lib/mongo/server/connection_pool.rb +6 -4
- data/lib/mongo/server/description.rb +4 -0
- data/lib/mongo/server/description/features.rb +9 -8
- data/lib/mongo/server/monitor.rb +20 -1
- data/lib/mongo/server/monitor/app_metadata.rb +1 -1
- data/lib/mongo/server/monitor/connection.rb +9 -10
- data/lib/mongo/server/pending_connection.rb +24 -6
- data/lib/mongo/server/push_monitor.rb +11 -1
- data/lib/mongo/session.rb +2 -2
- data/lib/mongo/session/session_pool.rb +4 -2
- data/lib/mongo/socket.rb +29 -4
- data/lib/mongo/socket/ssl.rb +8 -0
- data/lib/mongo/srv/monitor.rb +0 -11
- data/lib/mongo/uri/options_mapper.rb +38 -0
- data/lib/mongo/utils.rb +15 -0
- data/lib/mongo/version.rb +1 -1
- data/spec/README.md +24 -1
- data/spec/integration/auth_spec.rb +25 -15
- data/spec/integration/bulk_write_error_message_spec.rb +41 -0
- data/spec/integration/change_stream_spec.rb +4 -4
- data/spec/integration/command_monitoring_spec.rb +2 -2
- data/spec/integration/connection_spec.rb +2 -0
- data/spec/integration/docs_examples_spec.rb +8 -1
- data/spec/integration/fork_reconnect_spec.rb +4 -1
- data/spec/integration/ocsp_verifier_spec.rb +13 -7
- data/spec/integration/operation_failure_code_spec.rb +1 -1
- data/spec/integration/operation_failure_message_spec.rb +90 -0
- data/spec/integration/reconnect_spec.rb +1 -1
- data/spec/integration/sdam_error_handling_spec.rb +1 -1
- data/spec/integration/sdam_events_spec.rb +3 -5
- data/spec/integration/snappy_compression_spec.rb +25 -0
- data/spec/integration/srv_monitoring_spec.rb +1 -1
- data/spec/integration/transactions_examples_spec.rb +6 -0
- data/spec/integration/zlib_compression_spec.rb +1 -1
- data/spec/integration/zstd_compression_spec.rb +26 -0
- data/spec/lite_spec_helper.rb +7 -1
- data/spec/mongo/address_spec.rb +15 -11
- data/spec/mongo/auth/ldap/conversation_spec.rb +1 -1
- data/spec/mongo/auth/ldap_spec.rb +5 -1
- data/spec/mongo/auth/scram_negotiation_spec.rb +1 -1
- data/spec/mongo/auth/scram_spec.rb +1 -1
- data/spec/mongo/auth/x509/conversation_spec.rb +3 -3
- data/spec/mongo/client_construction_spec.rb +207 -33
- data/spec/mongo/client_spec.rb +17 -0
- data/spec/mongo/cluster_spec.rb +3 -18
- data/spec/mongo/collection/view/explainable_spec.rb +1 -1
- data/spec/mongo/collection/view/readable_spec.rb +33 -19
- data/spec/mongo/collection_crud_spec.rb +4357 -0
- data/spec/mongo/collection_ddl_spec.rb +534 -0
- data/spec/mongo/collection_spec.rb +5 -4859
- data/spec/mongo/database_spec.rb +66 -4
- data/spec/mongo/error/bulk_write_error_spec.rb +3 -3
- data/spec/mongo/error/parser_spec.rb +37 -6
- data/spec/mongo/index/view_spec.rb +8 -2
- data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +1 -1
- data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +1 -1
- data/spec/mongo/operation/aggregate_spec.rb +2 -1
- data/spec/mongo/operation/collections_info_spec.rb +4 -1
- data/spec/mongo/operation/command_spec.rb +6 -3
- data/spec/mongo/operation/create_index_spec.rb +6 -3
- data/spec/mongo/operation/create_user_spec.rb +6 -3
- data/spec/mongo/operation/delete/bulk_spec.rb +9 -6
- data/spec/mongo/operation/delete_spec.rb +11 -7
- data/spec/mongo/operation/drop_index_spec.rb +6 -2
- data/spec/mongo/operation/find/legacy_spec.rb +3 -1
- data/spec/mongo/operation/get_more_spec.rb +3 -1
- data/spec/mongo/operation/indexes_spec.rb +5 -1
- data/spec/mongo/operation/insert/bulk_spec.rb +10 -7
- data/spec/mongo/operation/insert_spec.rb +15 -12
- data/spec/mongo/operation/map_reduce_spec.rb +5 -2
- data/spec/mongo/operation/remove_user_spec.rb +6 -3
- data/spec/mongo/operation/result_spec.rb +1 -1
- data/spec/mongo/operation/update/bulk_spec.rb +9 -6
- data/spec/mongo/operation/update_spec.rb +10 -7
- data/spec/mongo/operation/update_user_spec.rb +4 -1
- data/spec/mongo/protocol/compressed_spec.rb +26 -12
- data/spec/mongo/query_cache_middleware_spec.rb +55 -0
- data/spec/mongo/retryable_spec.rb +3 -2
- data/spec/mongo/server/app_metadata_spec.rb +2 -0
- data/spec/mongo/server/connection_pool/populator_spec.rb +3 -1
- data/spec/mongo/server/connection_pool_spec.rb +1 -1
- data/spec/mongo/server/connection_spec.rb +24 -17
- data/spec/mongo/server/monitor/connection_spec.rb +17 -7
- data/spec/mongo/server/monitor_spec.rb +9 -1
- data/spec/mongo/server_spec.rb +15 -2
- data/spec/mongo/socket/ssl_spec.rb +40 -0
- data/spec/mongo/socket_spec.rb +2 -2
- data/spec/mongo/tls_context_hooks_spec.rb +37 -0
- data/spec/runners/connection_string.rb +0 -4
- data/spec/runners/crud/requirement.rb +40 -3
- data/spec/runners/crud/verifier.rb +8 -0
- data/spec/runners/transactions/operation.rb +13 -2
- data/spec/runners/transactions/test.rb +1 -0
- data/spec/runners/unified.rb +96 -0
- data/spec/runners/unified/assertions.rb +249 -0
- data/spec/runners/unified/change_stream_operations.rb +26 -0
- data/spec/runners/unified/crud_operations.rb +199 -0
- data/spec/runners/unified/ddl_operations.rb +96 -0
- data/spec/runners/unified/entity_map.rb +39 -0
- data/spec/runners/unified/error.rb +25 -0
- data/spec/runners/unified/event_subscriber.rb +91 -0
- data/spec/runners/unified/exceptions.rb +21 -0
- data/spec/runners/unified/grid_fs_operations.rb +55 -0
- data/spec/runners/unified/support_operations.rb +250 -0
- data/spec/runners/unified/test.rb +393 -0
- data/spec/runners/unified/test_group.rb +28 -0
- data/spec/runners/unified/using_hash.rb +31 -0
- data/spec/shared/bin/get-mongodb-download-url +17 -0
- data/spec/shared/lib/mrss/cluster_config.rb +218 -0
- data/spec/shared/lib/mrss/constraints.rb +43 -0
- data/spec/shared/lib/mrss/docker_runner.rb +262 -0
- data/spec/shared/lib/mrss/server_version_registry.rb +112 -0
- data/spec/shared/lib/mrss/utils.rb +15 -0
- data/spec/shared/share/Dockerfile.erb +231 -0
- data/spec/shared/shlib/distro.sh +73 -0
- data/spec/shared/shlib/server.sh +290 -0
- data/spec/shared/shlib/set_env.sh +128 -0
- data/spec/solo/clean_exit_spec.rb +21 -0
- data/spec/spec_helper.rb +4 -1
- data/spec/spec_tests/crud_unified_spec.rb +10 -0
- data/spec/spec_tests/data/change_streams/change-streams.yml +0 -1
- data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +267 -0
- data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +60 -0
- data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount.yml → estimatedDocumentCount-pre4.9.yml} +2 -0
- data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +146 -0
- data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-serverErrors.yml → estimatedDocumentCount-serverErrors-pre4.9.yml} +2 -0
- data/spec/spec_tests/data/retryable_reads/listIndexNames.yml +1 -1
- data/spec/spec_tests/data/unified/valid-fail/operation-failure.yml +31 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +220 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +102 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +184 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-gridfs.yml +155 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +193 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +210 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +215 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +235 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +169 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +170 -0
- data/spec/spec_tests/data/uri_options/compression-options.yml +1 -1
- data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +416 -0
- data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +409 -0
- data/spec/spec_tests/data/versioned_api/runcommand-helper-no-api-version-declared.yml +67 -0
- data/spec/spec_tests/data/versioned_api/test-commands-deprecation-errors.yml +47 -0
- data/spec/spec_tests/data/versioned_api/test-commands-strict-mode.yml +44 -0
- data/spec/spec_tests/data/versioned_api/transaction-handling.yml +180 -0
- data/spec/spec_tests/unified_spec.rb +15 -0
- data/spec/spec_tests/uri_options_spec.rb +16 -0
- data/spec/spec_tests/versioned_api_spec.rb +10 -0
- data/spec/support/common_shortcuts.rb +15 -1
- data/spec/support/shared/session.rb +2 -2
- data/spec/support/spec_config.rb +46 -3
- data/spec/support/spec_setup.rb +48 -38
- data/spec/support/utils.rb +64 -3
- metadata +1104 -992
- metadata.gz.sig +0 -0
- data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +0 -58
- data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +0 -47
- data/spec/support/cluster_config.rb +0 -207
@@ -34,34 +34,13 @@ module Mongo
|
|
34
34
|
# @param [ Server::Connection ] connection The connection being
|
35
35
|
# authenticated.
|
36
36
|
#
|
37
|
-
# @return [ Protocol::
|
37
|
+
# @return [ Protocol::Message ] The first X.509 conversation message.
|
38
38
|
#
|
39
39
|
# @since 2.0.0
|
40
40
|
def start(connection)
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
# The only valid database for X.509 authentication is $external.
|
45
|
-
if user.auth_source != '$external'
|
46
|
-
user_name_msg = if user.name
|
47
|
-
" #{user.name}"
|
48
|
-
else
|
49
|
-
''
|
50
|
-
end
|
51
|
-
raise Auth::InvalidConfiguration, "User#{user_name_msg} specifies auth source '#{user.auth_source}', but the only valid auth source for X.509 is '$external'"
|
52
|
-
end
|
53
|
-
selector[Protocol::Msg::DATABASE_IDENTIFIER] = '$external'
|
54
|
-
cluster_time = connection.mongos? && connection.cluster_time
|
55
|
-
selector[Operation::CLUSTER_TIME] = cluster_time if cluster_time
|
56
|
-
Protocol::Msg.new([], {}, selector)
|
57
|
-
else
|
58
|
-
Protocol::Query.new(
|
59
|
-
Auth::EXTERNAL,
|
60
|
-
Database::COMMAND,
|
61
|
-
login,
|
62
|
-
limit: -1
|
63
|
-
)
|
64
|
-
end
|
41
|
+
validate_external_auth_source
|
42
|
+
selector = client_first_document
|
43
|
+
build_message(connection, '$external', selector)
|
65
44
|
end
|
66
45
|
|
67
46
|
# Returns the hash to provide to the server in the handshake
|
@@ -20,6 +20,17 @@ module Mongo
|
|
20
20
|
# compatibility reasons. However using these methods outside of the driver
|
21
21
|
# is deprecated.
|
22
22
|
#
|
23
|
+
# @note Do not start or stop background threads in finalizers. See
|
24
|
+
# https://jira.mongodb.org/browse/RUBY-2453 and
|
25
|
+
# https://bugs.ruby-lang.org/issues/16288. When interpreter exits,
|
26
|
+
# background threads are stopped first and finalizers are invoked next,
|
27
|
+
# and MRI's internal data structures are basically corrupt at this point
|
28
|
+
# if threads are being referenced. Prior to interpreter shutdown this
|
29
|
+
# means threads cannot be stopped by objects going out of scope, but
|
30
|
+
# most likely the threads hold references to said objects anyway if
|
31
|
+
# work is being performed thus the objects wouldn't go out of scope in
|
32
|
+
# the first place.
|
33
|
+
#
|
23
34
|
# @api private
|
24
35
|
module BackgroundThread
|
25
36
|
include Loggable
|
data/lib/mongo/bulk_write.rb
CHANGED
@@ -58,6 +58,7 @@ module Mongo
|
|
58
58
|
operations = op_combiner.combine
|
59
59
|
|
60
60
|
client.send(:with_session, @options) do |session|
|
61
|
+
context = Operation::Context.new(client: client, session: session)
|
61
62
|
operations.each do |operation|
|
62
63
|
if single_statement?(operation)
|
63
64
|
write_concern = write_concern(session)
|
@@ -67,6 +68,7 @@ module Mongo
|
|
67
68
|
operation.keys.first,
|
68
69
|
operation.values.flatten,
|
69
70
|
connection,
|
71
|
+
context,
|
70
72
|
operation_id,
|
71
73
|
result_combiner,
|
72
74
|
session,
|
@@ -80,6 +82,7 @@ module Mongo
|
|
80
82
|
operation.keys.first,
|
81
83
|
operation.values.flatten,
|
82
84
|
connection,
|
85
|
+
context,
|
83
86
|
operation_id,
|
84
87
|
result_combiner,
|
85
88
|
session)
|
@@ -177,19 +180,19 @@ module Mongo
|
|
177
180
|
}
|
178
181
|
end
|
179
182
|
|
180
|
-
def execute_operation(name, values, connection, operation_id, result_combiner, session, txn_num = nil)
|
183
|
+
def execute_operation(name, values, connection, context, operation_id, result_combiner, session, txn_num = nil)
|
181
184
|
validate_collation!(connection)
|
182
185
|
validate_array_filters!(connection)
|
183
186
|
validate_hint!(connection)
|
184
187
|
|
185
188
|
unpin_maybe(session) do
|
186
189
|
if values.size > connection.description.max_write_batch_size
|
187
|
-
split_execute(name, values, connection, operation_id, result_combiner, session, txn_num)
|
190
|
+
split_execute(name, values, connection, context, operation_id, result_combiner, session, txn_num)
|
188
191
|
else
|
189
|
-
result = send(name, values, connection, operation_id, session, txn_num)
|
192
|
+
result = send(name, values, connection, context, operation_id, session, txn_num)
|
190
193
|
|
191
194
|
add_server_diagnostics(connection) do
|
192
|
-
add_error_labels(
|
195
|
+
add_error_labels(connection, context) do
|
193
196
|
result_combiner.combine!(result, values.size)
|
194
197
|
end
|
195
198
|
end
|
@@ -205,7 +208,7 @@ module Mongo
|
|
205
208
|
rescue Error::MaxBSONSize, Error::MaxMessageSize => e
|
206
209
|
raise e if values.size <= 1
|
207
210
|
unpin_maybe(session) do
|
208
|
-
split_execute(name, values, connection, operation_id, result_combiner, session, txn_num)
|
211
|
+
split_execute(name, values, connection, context, operation_id, result_combiner, session, txn_num)
|
209
212
|
end
|
210
213
|
end
|
211
214
|
|
@@ -213,47 +216,47 @@ module Mongo
|
|
213
216
|
@op_combiner ||= ordered? ? OrderedCombiner.new(requests) : UnorderedCombiner.new(requests)
|
214
217
|
end
|
215
218
|
|
216
|
-
def split_execute(name, values, connection, operation_id, result_combiner, session, txn_num)
|
217
|
-
execute_operation(name, values.shift(values.size / 2), connection, operation_id, result_combiner, session, txn_num)
|
219
|
+
def split_execute(name, values, connection, context, operation_id, result_combiner, session, txn_num)
|
220
|
+
execute_operation(name, values.shift(values.size / 2), connection, context, operation_id, result_combiner, session, txn_num)
|
218
221
|
|
219
222
|
txn_num = session.next_txn_num if txn_num
|
220
|
-
execute_operation(name, values, connection, operation_id, result_combiner, session, txn_num)
|
223
|
+
execute_operation(name, values, connection, context, operation_id, result_combiner, session, txn_num)
|
221
224
|
end
|
222
225
|
|
223
|
-
def delete_one(documents, connection, operation_id, session, txn_num)
|
226
|
+
def delete_one(documents, connection, context, operation_id, session, txn_num)
|
224
227
|
QueryCache.clear_namespace(collection.namespace)
|
225
228
|
|
226
229
|
spec = base_spec(operation_id, session).merge(:deletes => documents, :txn_num => txn_num)
|
227
|
-
Operation::Delete.new(spec).bulk_execute(connection,
|
230
|
+
Operation::Delete.new(spec).bulk_execute(connection, context: context)
|
228
231
|
end
|
229
232
|
|
230
|
-
def delete_many(documents, connection, operation_id, session, txn_num)
|
233
|
+
def delete_many(documents, connection, context, operation_id, session, txn_num)
|
231
234
|
QueryCache.clear_namespace(collection.namespace)
|
232
235
|
|
233
236
|
spec = base_spec(operation_id, session).merge(:deletes => documents)
|
234
|
-
Operation::Delete.new(spec).bulk_execute(connection,
|
237
|
+
Operation::Delete.new(spec).bulk_execute(connection, context: context)
|
235
238
|
end
|
236
239
|
|
237
|
-
def insert_one(documents, connection, operation_id, session, txn_num)
|
240
|
+
def insert_one(documents, connection, context, operation_id, session, txn_num)
|
238
241
|
QueryCache.clear_namespace(collection.namespace)
|
239
242
|
|
240
243
|
spec = base_spec(operation_id, session).merge(:documents => documents, :txn_num => txn_num)
|
241
|
-
Operation::Insert.new(spec).bulk_execute(connection,
|
244
|
+
Operation::Insert.new(spec).bulk_execute(connection, context: context)
|
242
245
|
end
|
243
246
|
|
244
|
-
def update_one(documents, connection, operation_id, session, txn_num)
|
247
|
+
def update_one(documents, connection, context, operation_id, session, txn_num)
|
245
248
|
QueryCache.clear_namespace(collection.namespace)
|
246
249
|
|
247
250
|
spec = base_spec(operation_id, session).merge(:updates => documents, :txn_num => txn_num)
|
248
|
-
Operation::Update.new(spec).bulk_execute(connection,
|
251
|
+
Operation::Update.new(spec).bulk_execute(connection, context: context)
|
249
252
|
end
|
250
253
|
alias :replace_one :update_one
|
251
254
|
|
252
|
-
def update_many(documents, connection, operation_id, session, txn_num)
|
255
|
+
def update_many(documents, connection, context, operation_id, session, txn_num)
|
253
256
|
QueryCache.clear_namespace(collection.namespace)
|
254
257
|
|
255
258
|
spec = base_spec(operation_id, session).merge(:updates => documents)
|
256
|
-
Operation::Update.new(spec).bulk_execute(connection,
|
259
|
+
Operation::Update.new(spec).bulk_execute(connection, context: context)
|
257
260
|
end
|
258
261
|
|
259
262
|
private
|
data/lib/mongo/client.rb
CHANGED
@@ -85,6 +85,7 @@ module Mongo
|
|
85
85
|
:retry_writes,
|
86
86
|
:scan,
|
87
87
|
:sdam_proc,
|
88
|
+
:server_api,
|
88
89
|
:server_selection_timeout,
|
89
90
|
:socket_timeout,
|
90
91
|
:ssl,
|
@@ -114,7 +115,16 @@ module Mongo
|
|
114
115
|
# The compression algorithms supported by the driver.
|
115
116
|
#
|
116
117
|
# @since 2.5.0
|
117
|
-
VALID_COMPRESSORS = [
|
118
|
+
VALID_COMPRESSORS = [
|
119
|
+
Mongo::Protocol::Compressed::ZSTD,
|
120
|
+
Mongo::Protocol::Compressed::SNAPPY,
|
121
|
+
Mongo::Protocol::Compressed::ZLIB
|
122
|
+
].freeze
|
123
|
+
|
124
|
+
# The known server API versions.
|
125
|
+
VALID_SERVER_API_VERSIONS = %w(
|
126
|
+
1
|
127
|
+
).freeze
|
118
128
|
|
119
129
|
# @return [ Mongo::Cluster ] cluster The cluster of servers for the client.
|
120
130
|
attr_reader :cluster
|
@@ -223,7 +233,7 @@ module Mongo
|
|
223
233
|
# @option options [ Array<String> ] :compressors A list of potential
|
224
234
|
# compressors to use, in order of preference. The driver chooses the
|
225
235
|
# first compressor that is also supported by the server. Currently the
|
226
|
-
# driver only supports 'zlib'.
|
236
|
+
# driver only supports 'zstd, 'snappy' and 'zlib'.
|
227
237
|
# @option options [ true | false ] :direct_connection Whether to connect
|
228
238
|
# directly to the specified seed, bypassing topology discovery. Exactly
|
229
239
|
# one seed must be provided.
|
@@ -312,6 +322,11 @@ module Mongo
|
|
312
322
|
# in particular the cluster is nil at this time. sdam_proc should
|
313
323
|
# limit itself to calling #subscribe and #unsubscribe methods on the
|
314
324
|
# client only.
|
325
|
+
# @option options [ Hash ] :server_api The requested server API version.
|
326
|
+
# This hash can have the following items:
|
327
|
+
# - *:version* -- string
|
328
|
+
# - *:strict* -- boolean
|
329
|
+
# - *:deprecation_errors* -- boolean
|
315
330
|
# @option options [ Integer ] :server_selection_timeout The timeout in seconds
|
316
331
|
# for selecting a server for an operation.
|
317
332
|
# @option options [ Float ] :socket_timeout The timeout, in seconds, to
|
@@ -465,6 +480,18 @@ module Mongo
|
|
465
480
|
|
466
481
|
options = self.class.canonicalize_ruby_options(options)
|
467
482
|
|
483
|
+
# The server API version is specified to be a string.
|
484
|
+
# However, it is very annoying to always provide the number 1 as a string,
|
485
|
+
# therefore cast to the string type here.
|
486
|
+
if server_api = options[:server_api]
|
487
|
+
if server_api.is_a?(Hash)
|
488
|
+
server_api = Options::Redacted.new(server_api)
|
489
|
+
if (version = server_api[:version]).is_a?(Integer)
|
490
|
+
options[:server_api] = server_api.merge(version: version.to_s)
|
491
|
+
end
|
492
|
+
end
|
493
|
+
end
|
494
|
+
|
468
495
|
# Special handling for sdam_proc as it is only used during client
|
469
496
|
# construction
|
470
497
|
sdam_proc = options.delete(:sdam_proc)
|
@@ -499,7 +526,9 @@ module Mongo
|
|
499
526
|
validate_options!(addresses)
|
500
527
|
validate_authentication_options!
|
501
528
|
|
502
|
-
|
529
|
+
database_options = @options.dup
|
530
|
+
database_options.delete(:server_api)
|
531
|
+
@database = Database.new(self, @options[:database], database_options)
|
503
532
|
|
504
533
|
# Temporarily set monitoring so that event subscriptions can be
|
505
534
|
# set up without there being a cluster
|
@@ -697,9 +726,9 @@ module Mongo
|
|
697
726
|
# @return [ Mongo::Client ] A new client instance.
|
698
727
|
#
|
699
728
|
# @since 2.0.0
|
700
|
-
def with(new_options =
|
729
|
+
def with(new_options = nil)
|
701
730
|
clone.tap do |client|
|
702
|
-
opts = client.update_options(new_options)
|
731
|
+
opts = client.update_options(new_options || Options::Redacted.new)
|
703
732
|
Database.create(client)
|
704
733
|
# We can't use the same cluster if some options that would affect it
|
705
734
|
# have changed.
|
@@ -726,6 +755,8 @@ module Mongo
|
|
726
755
|
def update_options(new_options)
|
727
756
|
old_options = @options
|
728
757
|
|
758
|
+
new_options = self.class.canonicalize_ruby_options(new_options || {})
|
759
|
+
|
729
760
|
validate_new_options!(new_options).tap do |opts|
|
730
761
|
# Our options are frozen
|
731
762
|
options = @options.dup
|
@@ -1127,7 +1158,7 @@ module Mongo
|
|
1127
1158
|
# The argument may contain a subset of options that the client will
|
1128
1159
|
# eventually have; this method validates each of the provided options
|
1129
1160
|
# but does not check for interactions between combinations of options.
|
1130
|
-
def validate_new_options!(opts
|
1161
|
+
def validate_new_options!(opts)
|
1131
1162
|
return Options::Redacted.new unless opts
|
1132
1163
|
if opts[:read_concern]
|
1133
1164
|
# Raise an error for non user-settable options
|
@@ -1146,6 +1177,23 @@ module Mongo
|
|
1146
1177
|
end
|
1147
1178
|
end
|
1148
1179
|
|
1180
|
+
if server_api = opts[:server_api]
|
1181
|
+
unless server_api.is_a?(Hash)
|
1182
|
+
raise ArgumentError, ":server_api value must be a hash: #{server_api}"
|
1183
|
+
end
|
1184
|
+
|
1185
|
+
extra_keys = server_api.keys - %w(version strict deprecation_errors)
|
1186
|
+
unless extra_keys.empty?
|
1187
|
+
raise ArgumentError, "Unknown keys under :server_api: #{extra_keys.map(&:inspect).join(', ')}"
|
1188
|
+
end
|
1189
|
+
|
1190
|
+
if version = server_api[:version]
|
1191
|
+
unless VALID_SERVER_API_VERSIONS.include?(version)
|
1192
|
+
raise ArgumentError, "Unknown server API version: #{version}"
|
1193
|
+
end
|
1194
|
+
end
|
1195
|
+
end
|
1196
|
+
|
1149
1197
|
Lint.validate_underscore_read_preference(opts[:read])
|
1150
1198
|
Lint.validate_read_concern_option(opts[:read_concern])
|
1151
1199
|
opts.each.inject(Options::Redacted.new) do |_options, (k, v)|
|
@@ -1155,6 +1203,15 @@ module Mongo
|
|
1155
1203
|
validate_read!(key, opts)
|
1156
1204
|
if key == :compressors
|
1157
1205
|
compressors = valid_compressors(v)
|
1206
|
+
|
1207
|
+
if compressors.include?('snappy')
|
1208
|
+
validate_snappy_compression!
|
1209
|
+
end
|
1210
|
+
|
1211
|
+
if compressors.include?('zstd')
|
1212
|
+
validate_zstd_compression!
|
1213
|
+
end
|
1214
|
+
|
1158
1215
|
_options[key] = compressors unless compressors.empty?
|
1159
1216
|
else
|
1160
1217
|
_options[key] = v
|
@@ -1311,11 +1368,30 @@ module Mongo
|
|
1311
1368
|
"This compressor will not be used.")
|
1312
1369
|
false
|
1313
1370
|
else
|
1371
|
+
|
1314
1372
|
true
|
1315
1373
|
end
|
1316
1374
|
end
|
1317
1375
|
end
|
1318
1376
|
|
1377
|
+
def validate_snappy_compression!
|
1378
|
+
return if defined?(Snappy)
|
1379
|
+
require 'snappy'
|
1380
|
+
rescue LoadError => e
|
1381
|
+
raise Error::UnmetDependency, "Cannot enable snappy compression because the snappy gem " \
|
1382
|
+
"has not been installed. Add \"gem 'snappy'\" to your Gemfile and run " \
|
1383
|
+
"\"bundle install\" to install the gem. (#{e.class}: #{e})"
|
1384
|
+
end
|
1385
|
+
|
1386
|
+
def validate_zstd_compression!
|
1387
|
+
return if defined?(Zstd)
|
1388
|
+
require 'zstd-ruby'
|
1389
|
+
rescue LoadError => e
|
1390
|
+
raise Error::UnmetDependency, "Cannot enable zstd compression because the zstd-ruby gem " \
|
1391
|
+
"has not been installed. Add \"gem 'zstd-ruby'\" to your Gemfile and run " \
|
1392
|
+
"\"bundle install\" to install the gem. (#{e.class}: #{e})"
|
1393
|
+
end
|
1394
|
+
|
1319
1395
|
def validate_max_min_pool_size!(option, opts)
|
1320
1396
|
if option == :min_pool_size && opts[:min_pool_size]
|
1321
1397
|
max = opts[:max_pool_size] || Server::ConnectionPool::DEFAULT_MAX_SIZE
|
data/lib/mongo/cluster.rb
CHANGED
@@ -107,6 +107,11 @@ module Mongo
|
|
107
107
|
# for the server monitor to refresh its description via ismaster.
|
108
108
|
# @option options [ Hash ] :resolv_options For internal driver use only.
|
109
109
|
# Options to pass through to Resolv::DNS constructor for SRV lookups.
|
110
|
+
# @option options [ Hash ] :server_api The requested server API version.
|
111
|
+
# This hash can have the following items:
|
112
|
+
# - *:version* -- string
|
113
|
+
# - *:strict* -- boolean
|
114
|
+
# - *:deprecation_errors* -- boolean
|
110
115
|
#
|
111
116
|
# @since 2.0.0
|
112
117
|
def initialize(seeds, monitoring, options = Options::Redacted.new)
|
@@ -129,7 +134,9 @@ module Mongo
|
|
129
134
|
@servers = []
|
130
135
|
@monitoring = monitoring
|
131
136
|
@event_listeners = Event::Listeners.new
|
132
|
-
@app_metadata = Server::AppMetadata.new(@options)
|
137
|
+
@app_metadata = Server::AppMetadata.new(@options.merge(purpose: :application))
|
138
|
+
@monitor_app_metadata = Server::Monitor::AppMetadata.new(@options.merge(purpose: :monitor))
|
139
|
+
@push_monitor_app_metadata = Server::Monitor::AppMetadata.new(@options.merge(purpose: :push_monitor))
|
133
140
|
@cluster_time_lock = Mutex.new
|
134
141
|
@cluster_time = nil
|
135
142
|
@srv_monitor_lock = Mutex.new
|
@@ -199,9 +206,6 @@ module Mongo
|
|
199
206
|
@cursor_reaper, @socket_reaper,
|
200
207
|
], options)
|
201
208
|
|
202
|
-
ObjectSpace.define_finalizer(self, self.class.finalize(
|
203
|
-
{}, @periodic_executor, @session_pool))
|
204
|
-
|
205
209
|
@periodic_executor.run!
|
206
210
|
end
|
207
211
|
|
@@ -244,7 +248,11 @@ module Mongo
|
|
244
248
|
# the servers list above and the wait call below, we should not
|
245
249
|
# wait for the full remaining time - wait for up to 1 second, then
|
246
250
|
# recheck the state.
|
247
|
-
|
251
|
+
begin
|
252
|
+
server_selection_semaphore.wait([time_remaining, 1].min)
|
253
|
+
rescue ::Timeout::Error
|
254
|
+
# nothing
|
255
|
+
end
|
248
256
|
end
|
249
257
|
end
|
250
258
|
|
@@ -288,6 +296,12 @@ module Mongo
|
|
288
296
|
# @since 2.4.0
|
289
297
|
attr_reader :app_metadata
|
290
298
|
|
299
|
+
# @api private
|
300
|
+
attr_reader :monitor_app_metadata
|
301
|
+
|
302
|
+
# @api private
|
303
|
+
attr_reader :push_monitor_app_metadata
|
304
|
+
|
291
305
|
# @return [ Array<String> ] The addresses of seed servers. Contains
|
292
306
|
# addresses that were given to Cluster when it was instantiated, not
|
293
307
|
# current addresses that the cluster is using as a result of SDAM.
|
@@ -445,25 +459,6 @@ module Mongo
|
|
445
459
|
# @api private
|
446
460
|
attr_reader :server_selection_semaphore
|
447
461
|
|
448
|
-
# Finalize the cluster for garbage collection.
|
449
|
-
#
|
450
|
-
# @example Finalize the cluster.
|
451
|
-
# Cluster.finalize(pools)
|
452
|
-
#
|
453
|
-
# @param [ Hash<Address, Server::ConnectionPool> ] pools Ignored.
|
454
|
-
# @param [ PeriodicExecutor ] periodic_executor The periodic executor.
|
455
|
-
# @param [ SessionPool ] session_pool The session pool.
|
456
|
-
#
|
457
|
-
# @return [ Proc ] The Finalizer.
|
458
|
-
#
|
459
|
-
# @since 2.2.0
|
460
|
-
def self.finalize(pools, periodic_executor, session_pool)
|
461
|
-
proc do
|
462
|
-
session_pool.end_sessions
|
463
|
-
periodic_executor.stop!
|
464
|
-
end
|
465
|
-
end
|
466
|
-
|
467
462
|
# Closes the cluster.
|
468
463
|
#
|
469
464
|
# @note Applications should call Client#close to disconnect from
|
@@ -953,10 +948,6 @@ module Mongo
|
|
953
948
|
monitor_options = Utils.shallow_symbolize_keys(options.merge(
|
954
949
|
timeout: options[:connect_timeout] || Server::CONNECT_TIMEOUT))
|
955
950
|
@srv_monitor = _srv_monitor = Srv::Monitor.new(self, **monitor_options)
|
956
|
-
finalizer = lambda do
|
957
|
-
_srv_monitor.stop!
|
958
|
-
end
|
959
|
-
ObjectSpace.define_finalizer(self, finalizer)
|
960
951
|
end
|
961
952
|
@srv_monitor.run!
|
962
953
|
end
|
@@ -130,16 +130,20 @@ module Mongo
|
|
130
130
|
end
|
131
131
|
|
132
132
|
to_kill_copy.each do |server, op_specs|
|
133
|
+
options = {
|
134
|
+
server_api: server.options[:server_api],
|
135
|
+
}
|
136
|
+
context = Operation::Context.new(options: options)
|
133
137
|
op_specs.each do |op_spec|
|
134
138
|
if server.features.find_command_enabled?
|
135
139
|
Cursor::Builder::KillCursorsCommand.update_cursors(op_spec, active_cursors_copy.to_a)
|
136
140
|
if Cursor::Builder::KillCursorsCommand.get_cursors_list(op_spec).size > 0
|
137
|
-
Operation::KillCursors.new(op_spec).execute(server,
|
141
|
+
Operation::KillCursors.new(op_spec).execute(server, context: context)
|
138
142
|
end
|
139
143
|
else
|
140
144
|
Cursor::Builder::OpKillCursors.update_cursors(op_spec, active_cursors_copy.to_a)
|
141
145
|
if Cursor::Builder::OpKillCursors.get_cursors_list(op_spec).size > 0
|
142
|
-
Operation::KillCursors.new(op_spec).execute(server,
|
146
|
+
Operation::KillCursors.new(op_spec).execute(server, context: context)
|
143
147
|
end
|
144
148
|
end
|
145
149
|
end
|