mongo 2.20.1 → 2.21.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +3 -0
- data/Rakefile +2 -2
- data/lib/mongo/address.rb +22 -3
- data/lib/mongo/auth/aws/credentials_retriever.rb +70 -17
- data/lib/mongo/auth/base.rb +1 -1
- data/lib/mongo/bulk_write.rb +35 -2
- data/lib/mongo/client.rb +38 -6
- data/lib/mongo/client_encryption.rb +6 -3
- data/lib/mongo/cluster/reapers/cursor_reaper.rb +6 -1
- data/lib/mongo/cluster/sdam_flow.rb +20 -7
- data/lib/mongo/cluster.rb +14 -4
- data/lib/mongo/collection/helpers.rb +1 -1
- data/lib/mongo/collection/view/aggregation/behavior.rb +131 -0
- data/lib/mongo/collection/view/aggregation.rb +33 -99
- data/lib/mongo/collection/view/builder/aggregation.rb +1 -7
- data/lib/mongo/collection/view/change_stream.rb +80 -27
- data/lib/mongo/collection/view/iterable.rb +76 -60
- data/lib/mongo/collection/view/map_reduce.rb +25 -8
- data/lib/mongo/collection/view/readable.rb +79 -30
- data/lib/mongo/collection/view/writable.rb +109 -48
- data/lib/mongo/collection/view.rb +43 -3
- data/lib/mongo/collection.rb +158 -23
- data/lib/mongo/crypt/auto_encrypter.rb +4 -6
- data/lib/mongo/crypt/binding.rb +4 -4
- data/lib/mongo/crypt/context.rb +20 -14
- data/lib/mongo/crypt/encryption_io.rb +56 -26
- data/lib/mongo/crypt/explicit_encrypter.rb +49 -20
- data/lib/mongo/crypt/explicit_encryption_context.rb +17 -11
- data/lib/mongo/crypt/kms/azure/credentials_retriever.rb +22 -6
- data/lib/mongo/crypt/kms/gcp/credentials_retriever.rb +29 -4
- data/lib/mongo/csot_timeout_holder.rb +119 -0
- data/lib/mongo/cursor/kill_spec.rb +5 -2
- data/lib/mongo/cursor/nontailable.rb +27 -0
- data/lib/mongo/cursor.rb +86 -24
- data/lib/mongo/cursor_host.rb +82 -0
- data/lib/mongo/database/view.rb +81 -14
- data/lib/mongo/database.rb +88 -18
- data/lib/mongo/error/operation_failure.rb +209 -204
- data/lib/mongo/error/server_timeout_error.rb +12 -0
- data/lib/mongo/error/socket_timeout_error.rb +3 -1
- data/lib/mongo/error/timeout_error.rb +23 -0
- data/lib/mongo/error.rb +2 -0
- data/lib/mongo/grid/fs_bucket.rb +45 -12
- data/lib/mongo/grid/stream/read.rb +15 -1
- data/lib/mongo/grid/stream/write.rb +21 -4
- data/lib/mongo/index/view.rb +77 -16
- data/lib/mongo/operation/context.rb +40 -2
- data/lib/mongo/operation/create_search_indexes/op_msg.rb +2 -2
- data/lib/mongo/operation/delete/op_msg.rb +2 -1
- data/lib/mongo/operation/drop_search_index/op_msg.rb +2 -2
- data/lib/mongo/operation/find/op_msg.rb +45 -0
- data/lib/mongo/operation/get_more/op_msg.rb +33 -0
- data/lib/mongo/operation/insert/op_msg.rb +3 -2
- data/lib/mongo/operation/insert/result.rb +4 -2
- data/lib/mongo/operation/list_collections/result.rb +1 -1
- data/lib/mongo/operation/map_reduce/result.rb +1 -1
- data/lib/mongo/operation/op_msg_base.rb +3 -1
- data/lib/mongo/operation/result.rb +26 -5
- data/lib/mongo/operation/shared/executable.rb +12 -1
- data/lib/mongo/operation/shared/op_msg_executable.rb +4 -1
- data/lib/mongo/operation/shared/response_handling.rb +3 -3
- data/lib/mongo/operation/shared/sessions_supported.rb +1 -1
- data/lib/mongo/operation/shared/timed.rb +52 -0
- data/lib/mongo/operation/shared/write.rb +4 -1
- data/lib/mongo/operation/update/op_msg.rb +2 -1
- data/lib/mongo/operation/update_search_index/op_msg.rb +2 -2
- data/lib/mongo/operation.rb +1 -0
- data/lib/mongo/protocol/message.rb +1 -4
- data/lib/mongo/protocol/msg.rb +2 -2
- data/lib/mongo/retryable/read_worker.rb +69 -29
- data/lib/mongo/retryable/write_worker.rb +49 -18
- data/lib/mongo/retryable.rb +8 -2
- data/lib/mongo/server/connection.rb +11 -5
- data/lib/mongo/server/connection_base.rb +22 -2
- data/lib/mongo/server/connection_pool.rb +32 -14
- data/lib/mongo/server/description/features.rb +1 -1
- data/lib/mongo/server/description.rb +18 -5
- data/lib/mongo/server/monitor.rb +7 -4
- data/lib/mongo/server/pending_connection.rb +7 -3
- data/lib/mongo/server/{round_trip_time_averager.rb → round_trip_time_calculator.rb} +25 -7
- data/lib/mongo/server.rb +11 -6
- data/lib/mongo/server_selector/base.rb +25 -9
- data/lib/mongo/session.rb +78 -9
- data/lib/mongo/socket/ssl.rb +109 -17
- data/lib/mongo/socket/tcp.rb +40 -6
- data/lib/mongo/socket.rb +154 -25
- data/lib/mongo/uri/options_mapper.rb +1 -0
- data/lib/mongo/version.rb +1 -1
- data/lib/mongo.rb +1 -0
- data/spec/atlas/atlas_connectivity_spec.rb +4 -0
- data/spec/atlas/operations_spec.rb +4 -0
- data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +2 -1
- data/spec/integration/client_side_encryption/auto_encryption_spec.rb +494 -487
- data/spec/integration/client_side_encryption/on_demand_aws_credentials_spec.rb +1 -1
- data/spec/integration/client_side_encryption/range_explicit_encryption_prose_spec.rb +66 -22
- data/spec/integration/client_side_operations_timeout/encryption_prose_spec.rb +131 -0
- data/spec/integration/connection_pool_populator_spec.rb +2 -0
- data/spec/integration/cursor_pinning_spec.rb +15 -60
- data/spec/integration/cursor_reaping_spec.rb +1 -1
- data/spec/integration/docs_examples_spec.rb +1 -1
- data/spec/integration/operation_failure_code_spec.rb +1 -1
- data/spec/integration/operation_failure_message_spec.rb +3 -3
- data/spec/integration/retryable_errors_spec.rb +2 -2
- data/spec/integration/sdam_error_handling_spec.rb +2 -1
- data/spec/integration/search_indexes_prose_spec.rb +4 -0
- data/spec/integration/server_spec.rb +4 -3
- data/spec/integration/transactions_api_examples_spec.rb +2 -0
- data/spec/kerberos/kerberos_spec.rb +4 -0
- data/spec/lite_spec_helper.rb +3 -1
- data/spec/mongo/auth/user/view_spec.rb +1 -1
- data/spec/mongo/caching_cursor_spec.rb +1 -1
- data/spec/mongo/client_encryption_spec.rb +1 -0
- data/spec/mongo/client_spec.rb +158 -4
- data/spec/mongo/collection/view/aggregation_spec.rb +14 -39
- data/spec/mongo/collection/view/change_stream_spec.rb +3 -3
- data/spec/mongo/collection_spec.rb +5 -6
- data/spec/mongo/crypt/auto_encrypter_spec.rb +14 -12
- data/spec/mongo/crypt/data_key_context_spec.rb +3 -1
- data/spec/mongo/crypt/explicit_encryption_context_spec.rb +2 -2
- data/spec/mongo/crypt/handle_spec.rb +1 -1
- data/spec/mongo/cursor_spec.rb +26 -9
- data/spec/mongo/error/operation_failure_heavy_spec.rb +2 -2
- data/spec/mongo/operation/context_spec.rb +79 -0
- data/spec/mongo/operation/create/op_msg_spec.rb +106 -110
- data/spec/mongo/operation/delete/op_msg_spec.rb +6 -5
- data/spec/mongo/operation/find/op_msg_spec.rb +66 -0
- data/spec/mongo/operation/get_more/op_msg_spec.rb +65 -0
- data/spec/mongo/operation/insert/op_msg_spec.rb +128 -131
- data/spec/mongo/operation/shared/csot/examples.rb +113 -0
- data/spec/mongo/query_cache_spec.rb +243 -225
- data/spec/mongo/retryable_spec.rb +1 -0
- data/spec/mongo/server/round_trip_time_calculator_spec.rb +120 -0
- data/spec/mongo/socket/ssl_spec.rb +0 -10
- data/spec/runners/change_streams/test.rb +2 -2
- data/spec/runners/crud/operation.rb +1 -1
- data/spec/runners/crud/verifier.rb +3 -1
- data/spec/runners/transactions/operation.rb +4 -6
- data/spec/runners/unified/ambiguous_operations.rb +13 -0
- data/spec/runners/unified/assertions.rb +4 -0
- data/spec/runners/unified/change_stream_operations.rb +14 -24
- data/spec/runners/unified/crud_operations.rb +82 -59
- data/spec/runners/unified/ddl_operations.rb +38 -7
- data/spec/runners/unified/grid_fs_operations.rb +37 -2
- data/spec/runners/unified/support_operations.rb +43 -4
- data/spec/runners/unified/test.rb +22 -10
- data/spec/runners/unified.rb +1 -1
- data/spec/solo/clean_exit_spec.rb +2 -0
- data/spec/spec_tests/client_side_operations_timeout_spec.rb +15 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams-clusterTime.yml +3 -1
- data/spec/spec_tests/data/change_streams_unified/change-streams-disambiguatedPaths.yml +3 -1
- data/spec/spec_tests/data/change_streams_unified/change-streams-errors.yml +3 -1
- data/spec/spec_tests/data/change_streams_unified/change-streams-pre_and_post_images.yml +1 -1
- data/spec/spec_tests/data/change_streams_unified/change-streams-resume-allowlist.yml +1 -1
- data/spec/spec_tests/data/change_streams_unified/change-streams-resume-errorLabels.yml +1 -1
- data/spec/spec_tests/data/change_streams_unified/change-streams-showExpandedEvents.yml +1 -1
- data/spec/spec_tests/data/client_side_encryption/badQueries.yml +2 -1
- data/spec/spec_tests/data/client_side_encryption/timeoutMS.yml +67 -0
- data/spec/spec_tests/data/client_side_operations_timeout/bulkWrite.yml +87 -0
- data/spec/spec_tests/data/client_side_operations_timeout/change-streams.yml +358 -0
- data/spec/spec_tests/data/client_side_operations_timeout/close-cursors.yml +129 -0
- data/spec/spec_tests/data/client_side_operations_timeout/command-execution.yml +250 -0
- data/spec/spec_tests/data/client_side_operations_timeout/convenient-transactions.yml +113 -0
- data/spec/spec_tests/data/client_side_operations_timeout/cursors.yml +70 -0
- data/spec/spec_tests/data/client_side_operations_timeout/deprecated-options.yml +3982 -0
- data/spec/spec_tests/data/client_side_operations_timeout/error-transformations.yml +96 -0
- data/spec/spec_tests/data/client_side_operations_timeout/global-timeoutMS.yml +3236 -0
- data/spec/spec_tests/data/client_side_operations_timeout/gridfs-advanced.yml +207 -0
- data/spec/spec_tests/data/client_side_operations_timeout/gridfs-delete.yml +152 -0
- data/spec/spec_tests/data/client_side_operations_timeout/gridfs-download.yml +182 -0
- data/spec/spec_tests/data/client_side_operations_timeout/gridfs-find.yml +100 -0
- data/spec/spec_tests/data/client_side_operations_timeout/gridfs-upload.yml +249 -0
- data/spec/spec_tests/data/client_side_operations_timeout/legacy-timeouts.yml +204 -0
- data/spec/spec_tests/data/client_side_operations_timeout/non-tailable-cursors.yml +307 -0
- data/spec/spec_tests/data/client_side_operations_timeout/override-collection-timeoutMS.yml +1877 -0
- data/spec/spec_tests/data/client_side_operations_timeout/override-operation-timeoutMS.yml +1918 -0
- data/spec/spec_tests/data/client_side_operations_timeout/retryability-legacy-timeouts.yml +1676 -0
- data/spec/spec_tests/data/client_side_operations_timeout/retryability-timeoutMS.yml +2824 -0
- data/spec/spec_tests/data/client_side_operations_timeout/sessions-inherit-timeoutMS.yml +168 -0
- data/spec/spec_tests/data/client_side_operations_timeout/sessions-override-operation-timeoutMS.yml +171 -0
- data/spec/spec_tests/data/client_side_operations_timeout/sessions-override-timeoutMS.yml +168 -0
- data/spec/spec_tests/data/client_side_operations_timeout/tailable-awaitData.yml +247 -0
- data/spec/spec_tests/data/client_side_operations_timeout/tailable-non-awaitData.yml +181 -0
- data/spec/spec_tests/data/crud_unified/aggregate-write-readPreference.yml +4 -0
- data/spec/spec_tests/data/crud_unified/db-aggregate-write-readPreference.yml +4 -0
- data/spec/spec_tests/data/crud_unified/find-test-all-options.yml +29 -0
- data/spec/spec_tests/server_selection_rtt_spec.rb +6 -6
- data/spec/support/certificates/atlas-ocsp-ca.crt +81 -83
- data/spec/support/certificates/atlas-ocsp.crt +107 -107
- data/spec/support/cluster_tools.rb +3 -3
- data/spec/support/common_shortcuts.rb +2 -2
- data/spec/support/crypt/encrypted_fields/range-encryptedFields-Date.json +1 -1
- data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalNoPrecision.json +1 -1
- data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalPrecision.json +1 -1
- data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoubleNoPrecision.json +1 -1
- data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoublePrecision.json +1 -1
- data/spec/support/crypt/encrypted_fields/range-encryptedFields-Int.json +1 -1
- data/spec/support/crypt/encrypted_fields/range-encryptedFields-Long.json +1 -1
- data/spec/support/shared/session.rb +2 -2
- data/spec/support/spec_setup.rb +2 -2
- data/spec/support/utils.rb +3 -1
- metadata +78 -91
- data/spec/mongo/server/round_trip_time_averager_spec.rb +0 -48
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Aggregate.yml +0 -242
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Correctness.yml +0 -423
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Delete.yml +0 -183
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-FindOneAndUpdate.yml +0 -240
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-InsertFind.yml +0 -236
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Update.yml +0 -253
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Aggregate.yml +0 -1688
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Correctness.yml +0 -294
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Delete.yml +0 -906
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-FindOneAndUpdate.yml +0 -1685
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-InsertFind.yml +0 -1681
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Update.yml +0 -1698
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Aggregate.yml +0 -330
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Correctness.yml +0 -425
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Delete.yml +0 -227
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-FindOneAndUpdate.yml +0 -328
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-InsertFind.yml +0 -320
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Update.yml +0 -337
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Aggregate.yml +0 -914
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Correctness.yml +0 -293
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Delete.yml +0 -519
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-FindOneAndUpdate.yml +0 -912
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-InsertFind.yml +0 -908
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Update.yml +0 -925
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Aggregate.yml +0 -326
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Correctness.yml +0 -425
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Delete.yml +0 -225
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-FindOneAndUpdate.yml +0 -324
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-InsertFind.yml +0 -320
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Update.yml +0 -339
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Aggregate.yml +0 -242
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Correctness.yml +0 -424
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Delete.yml +0 -183
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-FindOneAndUpdate.yml +0 -240
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-InsertFind.yml +0 -236
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Update.yml +0 -255
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Aggregate.yml +0 -242
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Correctness.yml +0 -423
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Delete.yml +0 -183
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-FindOneAndUpdate.yml +0 -240
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-InsertFind.yml +0 -236
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Update.yml +0 -255
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-WrongType.yml +0 -44
@@ -38,7 +38,8 @@ module Mongo
|
|
38
38
|
# @param [ Hash ] opts The options.
|
39
39
|
#
|
40
40
|
# @option opts [ Integer ] :max_time_ms The maximum amount of time to allow the command
|
41
|
-
# to run in milliseconds.
|
41
|
+
# to run in milliseconds. This option is deprecated, use
|
42
|
+
# :timeout_ms instead.
|
42
43
|
# @option opts [ Hash ] :projection The fields to include or exclude in the returned doc.
|
43
44
|
# @option opts [ Hash ] :sort The key and direction pairs by which the result set
|
44
45
|
# will be sorted.
|
@@ -46,11 +47,15 @@ module Mongo
|
|
46
47
|
# @option opts [ Session ] :session The session to use.
|
47
48
|
# @option opts [ Hash | String ] :hint The index to use for this operation.
|
48
49
|
# May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
|
50
|
+
# @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
|
51
|
+
# Must be a non-negative integer. An explicit value of 0 means infinite.
|
52
|
+
# The default value is unset which means the value is inherited from
|
53
|
+
# the collection or the database or the client.
|
49
54
|
# @option opts [ Hash ] :write_concern The write concern options.
|
50
55
|
# Can be :w => Integer, :fsync => Boolean, :j => Boolean.
|
51
|
-
# @option
|
56
|
+
# @option opts [ Hash ] :let Mapping of variables to use in the command.
|
52
57
|
# See the server documentation for details.
|
53
|
-
# @option
|
58
|
+
# @option opts [ Object ] :comment A user-provided
|
54
59
|
# comment to attach to this command.
|
55
60
|
#
|
56
61
|
# @return [ BSON::Document, nil ] The document, if found.
|
@@ -80,7 +85,11 @@ module Mongo
|
|
80
85
|
comment: opts[:comment],
|
81
86
|
}.compact
|
82
87
|
|
83
|
-
context = Operation::Context.new(
|
88
|
+
context = Operation::Context.new(
|
89
|
+
client: client,
|
90
|
+
session: session,
|
91
|
+
operation_timeouts: operation_timeouts(opts)
|
92
|
+
)
|
84
93
|
write_with_retry(write_concern, context: context) do |connection, txn_num, context|
|
85
94
|
gte_4_4 = connection.server.description.server_version_gte?('4.4')
|
86
95
|
if !gte_4_4 && opts[:hint] && write_concern && !write_concern.acknowledged?
|
@@ -116,9 +125,13 @@ module Mongo
|
|
116
125
|
# @option opts [ Hash ] :collation The collation to use.
|
117
126
|
# @option opts [ Hash | String ] :hint The index to use for this operation.
|
118
127
|
# May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
|
128
|
+
# @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
|
129
|
+
# Must be a non-negative integer. An explicit value of 0 means infinite.
|
130
|
+
# The default value is unset which means the value is inherited from
|
131
|
+
# the collection or the database or the client.
|
119
132
|
# @option opts [ Hash ] :write_concern The write concern options.
|
120
133
|
# Can be :w => Integer, :fsync => Boolean, :j => Boolean.
|
121
|
-
# @option
|
134
|
+
# @option opts [ Hash ] :let Mapping of variables to use in the command.
|
122
135
|
# See the server documentation for details.
|
123
136
|
#
|
124
137
|
# @return [ BSON::Document ] The document.
|
@@ -136,8 +149,9 @@ module Mongo
|
|
136
149
|
# @param [ BSON::Document ] document The updates.
|
137
150
|
# @param [ Hash ] opts The options.
|
138
151
|
#
|
139
|
-
# @option
|
140
|
-
# to run in milliseconds.
|
152
|
+
# @option opts [ Integer ] :max_time_ms The maximum amount of time to allow the command
|
153
|
+
# to run in milliseconds. This option is deprecated, use
|
154
|
+
# :timeout_ms instead.
|
141
155
|
# @option opts [ Hash ] :projection The fields to include or exclude in the returned doc.
|
142
156
|
# @option opts [ Hash ] :sort The key and direction pairs by which the result set
|
143
157
|
# will be sorted.
|
@@ -149,13 +163,17 @@ module Mongo
|
|
149
163
|
# @option opts [ Array ] :array_filters A set of filters specifying to which array elements
|
150
164
|
# an update should apply.
|
151
165
|
# @option opts [ Session ] :session The session to use.
|
166
|
+
# @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
|
167
|
+
# Must be a non-negative integer. An explicit value of 0 means infinite.
|
168
|
+
# The default value is unset which means the value is inherited from
|
169
|
+
# the collection or the database or the client.
|
152
170
|
# @option opts [ Hash | String ] :hint The index to use for this operation.
|
153
171
|
# May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
|
154
172
|
# @option opts [ Hash ] :write_concern The write concern options.
|
155
173
|
# Can be :w => Integer, :fsync => Boolean, :j => Boolean.
|
156
|
-
# @option
|
174
|
+
# @option opts [ Hash ] :let Mapping of variables to use in the command.
|
157
175
|
# See the server documentation for details.
|
158
|
-
# @option
|
176
|
+
# @option opts [ Object ] :comment A user-provided
|
159
177
|
# comment to attach to this command.
|
160
178
|
#
|
161
179
|
# @return [ BSON::Document | nil ] The document or nil if none is found.
|
@@ -188,7 +206,11 @@ module Mongo
|
|
188
206
|
comment: opts[:comment]
|
189
207
|
}.compact
|
190
208
|
|
191
|
-
context = Operation::Context.new(
|
209
|
+
context = Operation::Context.new(
|
210
|
+
client: client,
|
211
|
+
session: session,
|
212
|
+
operation_timeouts: operation_timeouts(opts)
|
213
|
+
)
|
192
214
|
write_with_retry(write_concern, context: context) do |connection, txn_num, context|
|
193
215
|
gte_4_4 = connection.server.description.server_version_gte?('4.4')
|
194
216
|
if !gte_4_4 && opts[:hint] && write_concern && !write_concern.acknowledged?
|
@@ -216,13 +238,17 @@ module Mongo
|
|
216
238
|
#
|
217
239
|
# @option opts [ Hash ] :collation The collation to use.
|
218
240
|
# @option opts [ Session ] :session The session to use.
|
241
|
+
# @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
|
242
|
+
# Must be a non-negative integer. An explicit value of 0 means infinite.
|
243
|
+
# The default value is unset which means the value is inherited from
|
244
|
+
# the collection or the database or the client.
|
219
245
|
# @option opts [ Hash | String ] :hint The index to use for this operation.
|
220
246
|
# May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
|
221
247
|
# @option opts [ Hash ] :write_concern The write concern options.
|
222
248
|
# Can be :w => Integer, :fsync => Boolean, :j => Boolean.
|
223
|
-
# @option
|
249
|
+
# @option opts [ Hash ] :let Mapping of variables to use in the command.
|
224
250
|
# See the server documentation for details.
|
225
|
-
# @option
|
251
|
+
# @option opts [ Object ] :comment A user-provided
|
226
252
|
# comment to attach to this command.
|
227
253
|
#
|
228
254
|
# @return [ Result ] The response from the database.
|
@@ -244,8 +270,11 @@ module Mongo
|
|
244
270
|
hint: opts[:hint],
|
245
271
|
collation: opts[:collation] || opts['collation'] || collation,
|
246
272
|
}.compact
|
247
|
-
|
248
|
-
|
273
|
+
context = Operation::Context.new(
|
274
|
+
client: client,
|
275
|
+
session: session,
|
276
|
+
operation_timeouts: operation_timeouts(opts)
|
277
|
+
)
|
249
278
|
nro_write_with_retry(write_concern, context: context) do |connection, txn_num, context|
|
250
279
|
gte_4_4 = connection.server.description.server_version_gte?('4.4')
|
251
280
|
if !gte_4_4 && opts[:hint] && write_concern && !write_concern.acknowledged?
|
@@ -274,15 +303,19 @@ module Mongo
|
|
274
303
|
# @param [ Hash ] opts The options.
|
275
304
|
#
|
276
305
|
# @option opts [ Hash ] :collation The collation to use.
|
277
|
-
# @option opts [
|
306
|
+
# @option opts [ Object ] :comment A user-provided
|
307
|
+
# comment to attach to this command.
|
278
308
|
# @option opts [ Hash | String ] :hint The index to use for this operation.
|
279
309
|
# May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
|
310
|
+
# @option opts [ Hash ] :let Mapping of variables to use in the command.
|
311
|
+
# See the server documentation for details.
|
312
|
+
# @option opts [ Session ] :session The session to use.
|
313
|
+
# @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
|
314
|
+
# Must be a non-negative integer. An explicit value of 0 means infinite.
|
315
|
+
# The default value is unset which means the value is inherited from
|
316
|
+
# the collection or the database or the client.
|
280
317
|
# @option opts [ Hash ] :write_concern The write concern options.
|
281
318
|
# Can be :w => Integer, :fsync => Boolean, :j => Boolean.
|
282
|
-
# @option options [ Hash ] :let Mapping of variables to use in the command.
|
283
|
-
# See the server documentation for details.
|
284
|
-
# @option options [ Object ] :comment A user-provided
|
285
|
-
# comment to attach to this command.
|
286
319
|
#
|
287
320
|
# @return [ Result ] The response from the database.
|
288
321
|
#
|
@@ -304,7 +337,11 @@ module Mongo
|
|
304
337
|
collation: opts[:collation] || opts['collation'] || collation,
|
305
338
|
}.compact
|
306
339
|
|
307
|
-
context = Operation::Context.new(
|
340
|
+
context = Operation::Context.new(
|
341
|
+
client: client,
|
342
|
+
session: session,
|
343
|
+
operation_timeouts: operation_timeouts(opts)
|
344
|
+
)
|
308
345
|
write_with_retry(write_concern, context: context) do |connection, txn_num, context|
|
309
346
|
gte_4_4 = connection.server.description.server_version_gte?('4.4')
|
310
347
|
if !gte_4_4 && opts[:hint] && write_concern && !write_concern.acknowledged?
|
@@ -334,20 +371,24 @@ module Mongo
|
|
334
371
|
# @param [ Hash ] replacement The replacement document.
|
335
372
|
# @param [ Hash ] opts The options.
|
336
373
|
#
|
337
|
-
# @option opts [ true, false ] :upsert Whether to upsert if the
|
338
|
-
# document doesn't exist.
|
339
374
|
# @option opts [ true, false ] :bypass_document_validation Whether or
|
340
375
|
# not to skip document level validation.
|
341
376
|
# @option opts [ Hash ] :collation The collation to use.
|
342
|
-
# @option opts [
|
377
|
+
# @option opts [ Object ] :comment A user-provided
|
378
|
+
# comment to attach to this command.
|
343
379
|
# @option opts [ Hash | String ] :hint The index to use for this operation.
|
344
380
|
# May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
|
381
|
+
# @option opts [ Hash ] :let Mapping of variables to use in the command.
|
382
|
+
# See the server documentation for details.
|
383
|
+
# @option opts [ Session ] :session The session to use.
|
384
|
+
# @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
|
385
|
+
# Must be a non-negative integer. An explicit value of 0 means infinite.
|
386
|
+
# The default value is unset which means the value is inherited from
|
387
|
+
# the collection or the database or the client.
|
345
388
|
# @option opts [ Hash ] :write_concern The write concern options.
|
389
|
+
# @option opts [ true, false ] :upsert Whether to upsert if the
|
390
|
+
# document doesn't exist.
|
346
391
|
# Can be :w => Integer, :fsync => Boolean, :j => Boolean.
|
347
|
-
# @option options [ Hash ] :let Mapping of variables to use in the command.
|
348
|
-
# See the server documentation for details.
|
349
|
-
# @option options [ Object ] :comment A user-provided
|
350
|
-
# comment to attach to this command.
|
351
392
|
#
|
352
393
|
# @return [ Result ] The response from the database.
|
353
394
|
#
|
@@ -374,7 +415,11 @@ module Mongo
|
|
374
415
|
update_doc['upsert'] = true
|
375
416
|
end
|
376
417
|
|
377
|
-
context = Operation::Context.new(
|
418
|
+
context = Operation::Context.new(
|
419
|
+
client: client,
|
420
|
+
session: session,
|
421
|
+
operation_timeouts: operation_timeouts(opts)
|
422
|
+
)
|
378
423
|
write_with_retry(write_concern, context: context) do |connection, txn_num, context|
|
379
424
|
gte_4_2 = connection.server.description.server_version_gte?('4.2')
|
380
425
|
if !gte_4_2 && opts[:hint] && write_concern && !write_concern.acknowledged?
|
@@ -404,22 +449,26 @@ module Mongo
|
|
404
449
|
# @param [ Hash | Array<Hash> ] spec The update document or pipeline.
|
405
450
|
# @param [ Hash ] opts The options.
|
406
451
|
#
|
407
|
-
# @option opts [
|
408
|
-
#
|
452
|
+
# @option opts [ Array ] :array_filters A set of filters specifying to
|
453
|
+
# which array elements an update should apply.
|
409
454
|
# @option opts [ true, false ] :bypass_document_validation Whether or
|
410
455
|
# not to skip document level validation.
|
411
456
|
# @option opts [ Hash ] :collation The collation to use.
|
412
|
-
# @option opts [
|
413
|
-
#
|
414
|
-
# @option opts [ Session ] :session The session to use.
|
457
|
+
# @option opts [ Object ] :comment A user-provided
|
458
|
+
# comment to attach to this command.
|
415
459
|
# @option opts [ Hash | String ] :hint The index to use for this operation.
|
416
460
|
# May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
|
461
|
+
# @option opts [ Hash ] :let Mapping of variables to use in the command.
|
462
|
+
# See the server documentation for details.
|
463
|
+
# @option opts [ Session ] :session The session to use.
|
464
|
+
# @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
|
465
|
+
# Must be a non-negative integer. An explicit value of 0 means infinite.
|
466
|
+
# The default value is unset which means the value is inherited from
|
467
|
+
# the collection or the database or the client.
|
468
|
+
# @option opts [ true, false ] :upsert Whether to upsert if the
|
469
|
+
# document doesn't exist.
|
417
470
|
# @option opts [ Hash ] :write_concern The write concern options.
|
418
471
|
# Can be :w => Integer, :fsync => Boolean, :j => Boolean.
|
419
|
-
# @option options [ Hash ] :let Mapping of variables to use in the command.
|
420
|
-
# See the server documentation for details.
|
421
|
-
# @option options [ Object ] :comment A user-provided
|
422
|
-
# comment to attach to this command.
|
423
472
|
#
|
424
473
|
# @return [ Result ] The response from the database.
|
425
474
|
#
|
@@ -447,7 +496,11 @@ module Mongo
|
|
447
496
|
update_doc['upsert'] = true
|
448
497
|
end
|
449
498
|
|
450
|
-
context = Operation::Context.new(
|
499
|
+
context = Operation::Context.new(
|
500
|
+
client: client,
|
501
|
+
session: session,
|
502
|
+
operation_timeouts: operation_timeouts(opts)
|
503
|
+
)
|
451
504
|
nro_write_with_retry(write_concern, context: context) do |connection, txn_num, context|
|
452
505
|
gte_4_2 = connection.server.description.server_version_gte?('4.2')
|
453
506
|
if !gte_4_2 && opts[:hint] && write_concern && !write_concern.acknowledged?
|
@@ -476,22 +529,26 @@ module Mongo
|
|
476
529
|
# @param [ Hash | Array<Hash> ] spec The update document or pipeline.
|
477
530
|
# @param [ Hash ] opts The options.
|
478
531
|
#
|
479
|
-
# @option opts [
|
480
|
-
#
|
532
|
+
# @option opts [ Array ] :array_filters A set of filters specifying to
|
533
|
+
# which array elements an update should apply.
|
481
534
|
# @option opts [ true, false ] :bypass_document_validation Whether or
|
482
535
|
# not to skip document level validation.
|
483
536
|
# @option opts [ Hash ] :collation The collation to use.
|
484
|
-
# @option opts [
|
485
|
-
#
|
486
|
-
# @option opts [ Session ] :session The session to use.
|
537
|
+
# @option opts [ Object ] :comment A user-provided
|
538
|
+
# comment to attach to this command.
|
487
539
|
# @option opts [ Hash | String ] :hint The index to use for this operation.
|
488
540
|
# May be specified as a Hash (e.g. { _id: 1 }) or a String (e.g. "_id_").
|
541
|
+
# @option opts [ Hash ] :let Mapping of variables to use in the command.
|
542
|
+
# See the server documentation for details.
|
543
|
+
# @option opts [ Session ] :session The session to use.
|
544
|
+
# @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
|
545
|
+
# Must be a non-negative integer. An explicit value of 0 means infinite.
|
546
|
+
# The default value is unset which means the value is inherited from
|
547
|
+
# the collection or the database or the client.
|
548
|
+
# @option opts [ true, false ] :upsert Whether to upsert if the
|
549
|
+
# document doesn't exist.
|
489
550
|
# @option opts [ Hash ] :write_concern The write concern options.
|
490
551
|
# Can be :w => Integer, :fsync => Boolean, :j => Boolean.
|
491
|
-
# @option options [ Hash ] :let Mapping of variables to use in the command.
|
492
|
-
# See the server documentation for details.
|
493
|
-
# @option options [ Object ] :comment A user-provided
|
494
|
-
# comment to attach to this command.
|
495
552
|
#
|
496
553
|
# @return [ Result ] The response from the database.
|
497
554
|
#
|
@@ -518,7 +575,11 @@ module Mongo
|
|
518
575
|
update_doc['upsert'] = true
|
519
576
|
end
|
520
577
|
|
521
|
-
context = Operation::Context.new(
|
578
|
+
context = Operation::Context.new(
|
579
|
+
client: client,
|
580
|
+
session: session,
|
581
|
+
operation_timeouts: operation_timeouts(opts)
|
582
|
+
)
|
522
583
|
write_with_retry(write_concern, context: context) do |connection, txn_num, context|
|
523
584
|
gte_4_2 = connection.server.description.server_version_gte?('4.2')
|
524
585
|
if !gte_4_2 && opts[:hint] && write_concern && !write_concern.acknowledged?
|
@@ -63,10 +63,10 @@ module Mongo
|
|
63
63
|
:client,
|
64
64
|
:cluster,
|
65
65
|
:database,
|
66
|
+
:nro_write_with_retry,
|
66
67
|
:read_with_retry,
|
67
68
|
:read_with_retry_cursor,
|
68
69
|
:write_with_retry,
|
69
|
-
:nro_write_with_retry,
|
70
70
|
:write_concern_with_session
|
71
71
|
|
72
72
|
# Delegate to the cluster for the next primary.
|
@@ -74,6 +74,12 @@ module Mongo
|
|
74
74
|
|
75
75
|
alias :selector :filter
|
76
76
|
|
77
|
+
# @return [ Integer | nil | The timeout_ms value that was passed as an
|
78
|
+
# option to the view.
|
79
|
+
#
|
80
|
+
# @api private
|
81
|
+
attr_reader :operation_timeout_ms
|
82
|
+
|
77
83
|
# Compare two +View+ objects.
|
78
84
|
#
|
79
85
|
# @example Compare the view with another object.
|
@@ -151,15 +157,26 @@ module Mongo
|
|
151
157
|
# document more than once. Deprecated as of MongoDB server version 4.0.
|
152
158
|
# @option options [ Hash ] :sort The key and direction pairs used to sort
|
153
159
|
# the results.
|
160
|
+
# @option options [ :cursor_lifetime | :iteration ] :timeout_mode How to interpret
|
161
|
+
# :timeout_ms (whether it applies to the lifetime of the cursor, or per
|
162
|
+
# iteration).
|
163
|
+
# @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
|
164
|
+
# Must be a non-negative integer. An explicit value of 0 means infinite.
|
165
|
+
# The default value is unset which means the value is inherited from
|
166
|
+
# the collection or the database or the client.
|
154
167
|
#
|
155
168
|
# @since 2.0.0
|
156
169
|
def initialize(collection, filter = {}, options = {})
|
157
170
|
validate_doc!(filter)
|
158
|
-
@collection = collection
|
159
171
|
|
160
172
|
filter = BSON::Document.new(filter)
|
161
173
|
options = BSON::Document.new(options)
|
162
174
|
|
175
|
+
@collection = collection
|
176
|
+
@operation_timeout_ms = options.delete(:timeout_ms)
|
177
|
+
|
178
|
+
validate_timeout_mode!(options)
|
179
|
+
|
163
180
|
# This is when users pass $query in filter and other modifiers
|
164
181
|
# alongside?
|
165
182
|
query = filter.delete(:$query)
|
@@ -171,6 +188,14 @@ module Mongo
|
|
171
188
|
@options = Operation::Find::Builder::Modifiers.map_driver_options(modifiers).merge!(options).freeze
|
172
189
|
end
|
173
190
|
|
191
|
+
# The timeout_ms value to use for this operation; either specified as an
|
192
|
+
# option to the view, or inherited from the collection.
|
193
|
+
#
|
194
|
+
# @return [ Integer | nil ] the timeout_ms for this operation
|
195
|
+
def timeout_ms
|
196
|
+
operation_timeout_ms || collection.timeout_ms
|
197
|
+
end
|
198
|
+
|
174
199
|
# Get a human-readable string representation of +View+.
|
175
200
|
#
|
176
201
|
# @example Get the inspection.
|
@@ -196,6 +221,20 @@ module Mongo
|
|
196
221
|
WriteConcern.get(options[:write_concern] || options[:write] || collection.write_concern)
|
197
222
|
end
|
198
223
|
|
224
|
+
# @return [ Hash ] timeout_ms value set on the operation level (if any),
|
225
|
+
# and/or timeout_ms that is set on collection/database/client level (if any).
|
226
|
+
#
|
227
|
+
# @api private
|
228
|
+
def operation_timeouts(opts = {})
|
229
|
+
{}.tap do |result|
|
230
|
+
if opts[:timeout_ms] || operation_timeout_ms
|
231
|
+
result[:operation_timeout_ms] = opts[:timeout_ms] || operation_timeout_ms
|
232
|
+
else
|
233
|
+
result[:inherited_timeout_ms] = collection.timeout_ms
|
234
|
+
end
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
199
238
|
private
|
200
239
|
|
201
240
|
def initialize_copy(other)
|
@@ -205,13 +244,14 @@ module Mongo
|
|
205
244
|
end
|
206
245
|
|
207
246
|
def new(options)
|
247
|
+
options = options.merge(timeout_ms: operation_timeout_ms) if operation_timeout_ms
|
208
248
|
View.new(collection, filter, options)
|
209
249
|
end
|
210
250
|
|
211
251
|
def view; self; end
|
212
252
|
|
213
253
|
def with_session(opts = {}, &block)
|
214
|
-
client.
|
254
|
+
client.with_session(@options.merge(opts), &block)
|
215
255
|
end
|
216
256
|
end
|
217
257
|
end
|