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
@@ -42,7 +42,7 @@ module Mongo
|
|
42
42
|
# Adds error labels to exceptions raised in the yielded to block,
|
43
43
|
# which should perform MongoDB operations and raise Mongo::Errors on
|
44
44
|
# failure. This method handles network errors (Error::SocketError)
|
45
|
-
# and server-side errors (Error::OperationFailure); it does not
|
45
|
+
# and server-side errors (Error::OperationFailure::Family); it does not
|
46
46
|
# handle server selection errors (Error::NoServerAvailable), for which
|
47
47
|
# labels are added in the server selection code.
|
48
48
|
#
|
@@ -65,7 +65,7 @@ module Mongo
|
|
65
65
|
rescue Mongo::Error::SocketTimeoutError => e
|
66
66
|
maybe_add_retryable_write_error_label!(e, connection, context)
|
67
67
|
raise e
|
68
|
-
rescue Mongo::Error::OperationFailure => e
|
68
|
+
rescue Mongo::Error::OperationFailure::Family => e
|
69
69
|
if context.committing_transaction?
|
70
70
|
if e.write_retryable? || e.wtimeout? || (e.write_concern_error? &&
|
71
71
|
!Session::UNLABELED_WRITE_CONCERN_CODES.include?(e.write_concern_error_code)
|
@@ -104,7 +104,7 @@ module Mongo
|
|
104
104
|
# raised during execution of operations on servers.
|
105
105
|
def add_server_diagnostics(connection)
|
106
106
|
yield
|
107
|
-
rescue Error::SocketError, Error::SocketTimeoutError
|
107
|
+
rescue Error::SocketError, Error::SocketTimeoutError, Error::TimeoutError
|
108
108
|
# Diagnostics should have already been added by the connection code,
|
109
109
|
# do not add them again.
|
110
110
|
raise
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mongo
|
4
|
+
module Operation
|
5
|
+
# Defines the behavior of operations that have the default timeout
|
6
|
+
# behavior described by the client-side operation timeouts (CSOT)
|
7
|
+
# spec.
|
8
|
+
#
|
9
|
+
# @api private
|
10
|
+
module Timed
|
11
|
+
# If a timeout is active (as defined by the current context), and it has
|
12
|
+
# not yet expired, add :maxTimeMS to the spec.
|
13
|
+
#
|
14
|
+
# @param [ Hash ] spec The spec to modify
|
15
|
+
# @param [ Connection ] connection The connection that will be used to
|
16
|
+
# execute the operation
|
17
|
+
#
|
18
|
+
# @return [ Hash ] the spec
|
19
|
+
#
|
20
|
+
# @raises [ Mongo::Error::TimeoutError ] if the current timeout has
|
21
|
+
# expired.
|
22
|
+
def apply_relevant_timeouts_to(spec, connection)
|
23
|
+
with_max_time(connection) do |max_time_sec|
|
24
|
+
return spec if max_time_sec.nil?
|
25
|
+
return spec if connection.description.mongocryptd?
|
26
|
+
|
27
|
+
spec.tap { spec[:maxTimeMS] = (max_time_sec * 1_000).to_i }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# A helper method that computes the remaining timeout (in seconds) and
|
32
|
+
# yields it to the associated block. If no timeout is present, yields
|
33
|
+
# nil. If the timeout has expired, raises Mongo::Error::TimeoutError.
|
34
|
+
#
|
35
|
+
# @param [ Connection ] connection The connection that will be used to
|
36
|
+
# execute the operation
|
37
|
+
#
|
38
|
+
# @return [ Hash ] the result of yielding to the block (which must be
|
39
|
+
# a Hash)
|
40
|
+
def with_max_time(connection)
|
41
|
+
if context&.timeout?
|
42
|
+
max_time_sec = context.remaining_timeout_sec - connection.server.minimum_round_trip_time
|
43
|
+
raise Mongo::Error::TimeoutError if max_time_sec <= 0
|
44
|
+
|
45
|
+
yield max_time_sec
|
46
|
+
else
|
47
|
+
yield nil
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -35,7 +35,10 @@ module Mongo
|
|
35
35
|
#
|
36
36
|
# @since 2.5.2
|
37
37
|
def execute(server, context:)
|
38
|
-
server.with_connection(
|
38
|
+
server.with_connection(
|
39
|
+
connection_global_id: context.connection_global_id,
|
40
|
+
context: context
|
41
|
+
) do |connection|
|
39
42
|
execute_with_connection(connection, context: context)
|
40
43
|
end
|
41
44
|
end
|
@@ -45,7 +45,8 @@ module Mongo
|
|
45
45
|
def message(connection)
|
46
46
|
updates = validate_updates(connection, send(IDENTIFIER))
|
47
47
|
section = Protocol::Msg::Section1.new(IDENTIFIER, updates)
|
48
|
-
|
48
|
+
cmd = apply_relevant_timeouts_to(command(connection), connection)
|
49
|
+
Protocol::Msg.new(flags, {}, cmd, section)
|
49
50
|
end
|
50
51
|
end
|
51
52
|
end
|
@@ -14,11 +14,11 @@ module Mongo
|
|
14
14
|
# Returns the command to send to the database, describing the
|
15
15
|
# desired updateSearchIndex operation.
|
16
16
|
#
|
17
|
-
# @param [
|
17
|
+
# @param [ Connection ] _connection the connection that will receive the
|
18
18
|
# command
|
19
19
|
#
|
20
20
|
# @return [ Hash ] the selector
|
21
|
-
def selector(
|
21
|
+
def selector(_connection)
|
22
22
|
{
|
23
23
|
updateSearchIndex: coll_name,
|
24
24
|
:$db => db_name,
|
data/lib/mongo/operation.rb
CHANGED
@@ -22,6 +22,7 @@ require 'mongo/operation/shared/specifiable'
|
|
22
22
|
require 'mongo/operation/shared/validatable'
|
23
23
|
require 'mongo/operation/shared/object_id_generator'
|
24
24
|
require 'mongo/operation/shared/op_msg_executable'
|
25
|
+
require 'mongo/operation/shared/timed'
|
25
26
|
|
26
27
|
require 'mongo/operation/op_msg_base'
|
27
28
|
require 'mongo/operation/command'
|
@@ -244,10 +244,7 @@ module Mongo
|
|
244
244
|
# timeout option. For compatibility with whoever might call this
|
245
245
|
# method with some other IO-like object, pass options only when they
|
246
246
|
# are not empty.
|
247
|
-
read_options =
|
248
|
-
if timeout = options[:socket_timeout]
|
249
|
-
read_options[:timeout] = timeout
|
250
|
-
end
|
247
|
+
read_options = options.slice(:timeout, :socket_timeout)
|
251
248
|
|
252
249
|
if read_options.empty?
|
253
250
|
chunk = io.read(16)
|
data/lib/mongo/protocol/msg.rb
CHANGED
@@ -226,7 +226,7 @@ module Mongo
|
|
226
226
|
|
227
227
|
db_name = @main_document[DATABASE_IDENTIFIER]
|
228
228
|
cmd = merge_sections
|
229
|
-
enc_cmd = context.
|
229
|
+
enc_cmd = context.encrypt(db_name, cmd)
|
230
230
|
if cmd.key?('$db') && !enc_cmd.key?('$db')
|
231
231
|
enc_cmd['$db'] = cmd['$db']
|
232
232
|
end
|
@@ -251,7 +251,7 @@ module Mongo
|
|
251
251
|
def maybe_decrypt(context)
|
252
252
|
if context.decrypt?
|
253
253
|
cmd = merge_sections
|
254
|
-
enc_cmd = context.
|
254
|
+
enc_cmd = context.decrypt(cmd)
|
255
255
|
Msg.new(@flags, @options, enc_cmd)
|
256
256
|
else
|
257
257
|
self
|
@@ -60,19 +60,21 @@ module Mongo
|
|
60
60
|
# @param [ Mongo::ServerSelector::Selectable ] server_selector Server
|
61
61
|
# selector for the operation.
|
62
62
|
# @param [ CollectionView ] view The +CollectionView+ defining the query.
|
63
|
+
# @param [ Operation::Context | nil ] context the operation context to use
|
64
|
+
# with the cursor.
|
63
65
|
# @param [ Proc ] block The block to execute.
|
64
66
|
#
|
65
67
|
# @return [ Cursor ] The cursor for the result set.
|
66
|
-
def read_with_retry_cursor(session, server_selector, view, &block)
|
67
|
-
read_with_retry(session, server_selector) do |server|
|
68
|
+
def read_with_retry_cursor(session, server_selector, view, context: nil, &block)
|
69
|
+
read_with_retry(session, server_selector, context) do |server|
|
68
70
|
result = yield server
|
69
71
|
|
70
72
|
# RUBY-2367: This will be updated to allow the query cache to
|
71
73
|
# cache cursors with multi-batch results.
|
72
74
|
if QueryCache.enabled? && !view.collection.system_collection?
|
73
|
-
CachingCursor.new(view, result, server, session: session)
|
75
|
+
CachingCursor.new(view, result, server, session: session, context: context)
|
74
76
|
else
|
75
|
-
Cursor.new(view, result, server, session: session)
|
77
|
+
Cursor.new(view, result, server, session: session, context: context)
|
76
78
|
end
|
77
79
|
end
|
78
80
|
end
|
@@ -107,16 +109,18 @@ module Mongo
|
|
107
109
|
# is being run on.
|
108
110
|
# @param [ Mongo::ServerSelector::Selectable | nil ] server_selector
|
109
111
|
# Server selector for the operation.
|
112
|
+
# @param [ Mongo::Operation::Context | nil ] context Context for the
|
113
|
+
# read operation.
|
110
114
|
# @param [ Proc ] block The block to execute.
|
111
115
|
#
|
112
116
|
# @return [ Result ] The result of the operation.
|
113
|
-
def read_with_retry(session = nil, server_selector = nil, &block)
|
117
|
+
def read_with_retry(session = nil, server_selector = nil, context = nil, &block)
|
114
118
|
if session.nil? && server_selector.nil?
|
115
119
|
deprecated_legacy_read_with_retry(&block)
|
116
120
|
elsif session&.retry_reads?
|
117
|
-
modern_read_with_retry(session, server_selector, &block)
|
121
|
+
modern_read_with_retry(session, server_selector, context, &block)
|
118
122
|
elsif client.max_read_retries > 0
|
119
|
-
legacy_read_with_retry(session, server_selector, &block)
|
123
|
+
legacy_read_with_retry(session, server_selector, context, &block)
|
120
124
|
else
|
121
125
|
read_without_retry(session, server_selector, &block)
|
122
126
|
end
|
@@ -186,17 +190,24 @@ module Mongo
|
|
186
190
|
# being run on.
|
187
191
|
# @param [ Mongo::ServerSelector::Selectable ] server_selector Server
|
188
192
|
# selector for the operation.
|
193
|
+
# @param [ Mongo::Operation::Context ] context Context for the
|
194
|
+
# read operation.
|
189
195
|
# @param [ Proc ] block The block to execute.
|
190
196
|
#
|
191
197
|
# @return [ Result ] The result of the operation.
|
192
|
-
def modern_read_with_retry(session, server_selector, &block)
|
193
|
-
server = select_server(
|
198
|
+
def modern_read_with_retry(session, server_selector, context, &block)
|
199
|
+
server = select_server(
|
200
|
+
cluster,
|
201
|
+
server_selector,
|
202
|
+
session,
|
203
|
+
timeout: context&.remaining_timeout_sec
|
204
|
+
)
|
194
205
|
yield server
|
195
|
-
rescue *retryable_exceptions, Error::OperationFailure, Auth::Unauthorized, Error::PoolError => e
|
206
|
+
rescue *retryable_exceptions, Error::OperationFailure::Family, Auth::Unauthorized, Error::PoolError => e
|
196
207
|
e.add_notes('modern retry', 'attempt 1')
|
197
208
|
raise e if session.in_transaction?
|
198
209
|
raise e if !is_retryable_exception?(e) && !e.write_retryable?
|
199
|
-
retry_read(e, session, server_selector, failed_server: server, &block)
|
210
|
+
retry_read(e, session, server_selector, context: context, failed_server: server, &block)
|
200
211
|
end
|
201
212
|
|
202
213
|
# Attempts to do a "legacy" read with retry. The operation will be
|
@@ -207,17 +218,19 @@ module Mongo
|
|
207
218
|
# being run on.
|
208
219
|
# @param [ Mongo::ServerSelector::Selectable ] server_selector Server
|
209
220
|
# selector for the operation.
|
221
|
+
# @param [ Mongo::Operation::Context | nil ] context Context for the
|
222
|
+
# read operation.
|
210
223
|
# @param [ Proc ] block The block to execute.
|
211
224
|
#
|
212
225
|
# @return [ Result ] The result of the operation.
|
213
|
-
def legacy_read_with_retry(session, server_selector, &block)
|
226
|
+
def legacy_read_with_retry(session, server_selector, context = nil, &block)
|
227
|
+
context&.check_timeout!
|
214
228
|
attempt = attempt ? attempt + 1 : 1
|
215
229
|
yield select_server(cluster, server_selector, session)
|
216
|
-
rescue *legacy_retryable_exceptions, Error::OperationFailure => e
|
230
|
+
rescue *legacy_retryable_exceptions, Error::OperationFailure::Family => e
|
217
231
|
e.add_notes('legacy retry', "attempt #{attempt}")
|
218
232
|
|
219
233
|
if is_legacy_retryable_exception?(e)
|
220
|
-
|
221
234
|
raise e if attempt > client.max_read_retries || session&.in_transaction?
|
222
235
|
elsif e.retryable? && !session&.in_transaction?
|
223
236
|
raise e if attempt > client.max_read_retries
|
@@ -245,7 +258,7 @@ module Mongo
|
|
245
258
|
|
246
259
|
begin
|
247
260
|
yield server
|
248
|
-
rescue *retryable_exceptions, Error::PoolError, Error::OperationFailure => e
|
261
|
+
rescue *retryable_exceptions, Error::PoolError, Error::OperationFailure::Family => e
|
249
262
|
e.add_note('retries disabled')
|
250
263
|
raise e
|
251
264
|
end
|
@@ -259,40 +272,67 @@ module Mongo
|
|
259
272
|
# being run on.
|
260
273
|
# @param [ Mongo::ServerSelector::Selectable ] server_selector Server
|
261
274
|
# selector for the operation.
|
262
|
-
# @param [ Mongo::
|
275
|
+
# @param [ Mongo::Operation::Context | nil ] :context Context for the
|
276
|
+
# read operation.
|
277
|
+
# @param [ Mongo::Server | nil ] :failed_server The server on which the original
|
263
278
|
# operation failed.
|
264
279
|
# @param [ Proc ] block The block to execute.
|
265
280
|
#
|
266
281
|
# @return [ Result ] The result of the operation.
|
267
|
-
def retry_read(original_error, session, server_selector, failed_server: nil, &block)
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
original_error.add_note("later retry failed: #{e.class}: #{e}")
|
272
|
-
raise original_error
|
273
|
-
end
|
282
|
+
def retry_read(original_error, session, server_selector, context: nil, failed_server: nil, &block)
|
283
|
+
server = select_server_for_retry(
|
284
|
+
original_error, session, server_selector, context, failed_server
|
285
|
+
)
|
274
286
|
|
275
287
|
log_retry(original_error, message: 'Read retry')
|
276
288
|
|
277
289
|
begin
|
290
|
+
context&.check_timeout!
|
291
|
+
attempt = attempt ? attempt + 1 : 2
|
278
292
|
yield server, true
|
293
|
+
rescue Error::TimeoutError
|
294
|
+
raise
|
279
295
|
rescue *retryable_exceptions => e
|
280
|
-
e.add_notes('modern retry',
|
281
|
-
|
282
|
-
|
296
|
+
e.add_notes('modern retry', "attempt #{attempt}")
|
297
|
+
if context&.csot?
|
298
|
+
failed_server = server
|
299
|
+
retry
|
300
|
+
else
|
301
|
+
raise e
|
302
|
+
end
|
303
|
+
rescue Error::OperationFailure::Family, Error::PoolError => e
|
283
304
|
e.add_note('modern retry')
|
284
|
-
|
305
|
+
if e.write_retryable?
|
306
|
+
e.add_note("attempt #{attempt}")
|
307
|
+
if context&.csot?
|
308
|
+
failed_server = server
|
309
|
+
retry
|
310
|
+
else
|
311
|
+
raise e
|
312
|
+
end
|
313
|
+
else
|
285
314
|
original_error.add_note("later retry failed: #{e.class}: #{e}")
|
286
315
|
raise original_error
|
287
316
|
end
|
288
|
-
e.add_note("attempt 2")
|
289
|
-
raise e
|
290
317
|
rescue Error, Error::AuthError => e
|
291
318
|
e.add_note('modern retry')
|
292
319
|
original_error.add_note("later retry failed: #{e.class}: #{e}")
|
293
320
|
raise original_error
|
294
321
|
end
|
295
322
|
end
|
323
|
+
|
324
|
+
def select_server_for_retry(original_error, session, server_selector, context, failed_server)
|
325
|
+
select_server(
|
326
|
+
cluster,
|
327
|
+
server_selector,
|
328
|
+
session,
|
329
|
+
failed_server,
|
330
|
+
timeout: context&.remaining_timeout_sec
|
331
|
+
)
|
332
|
+
rescue Error, Error::AuthError => e
|
333
|
+
original_error.add_note("later retry failed: #{e.class}: #{e}")
|
334
|
+
raise original_error
|
335
|
+
end
|
296
336
|
end
|
297
337
|
end
|
298
338
|
end
|
@@ -74,7 +74,11 @@ module Mongo
|
|
74
74
|
# If we are here, session is not nil. A session being nil would have
|
75
75
|
# failed retry_write_allowed? check.
|
76
76
|
|
77
|
-
server = select_server(
|
77
|
+
server = select_server(
|
78
|
+
cluster, ServerSelector.primary,
|
79
|
+
session,
|
80
|
+
timeout: context.remaining_timeout_sec
|
81
|
+
)
|
78
82
|
|
79
83
|
unless ending_transaction || server.retry_writes?
|
80
84
|
return legacy_write_with_retry(server, context: context, &block)
|
@@ -110,7 +114,7 @@ module Mongo
|
|
110
114
|
server.with_connection(connection_global_id: context.connection_global_id) do |connection|
|
111
115
|
yield connection, nil, context
|
112
116
|
end
|
113
|
-
rescue *retryable_exceptions, Error::PoolError, Error::OperationFailure => e
|
117
|
+
rescue *retryable_exceptions, Error::PoolError, Error::OperationFailure::Family => e
|
114
118
|
e.add_note('retries disabled')
|
115
119
|
raise e
|
116
120
|
end
|
@@ -170,6 +174,7 @@ module Mongo
|
|
170
174
|
# @api private
|
171
175
|
def legacy_write_with_retry(server = nil, context:)
|
172
176
|
session = context.session
|
177
|
+
context.check_timeout!
|
173
178
|
|
174
179
|
# This is the pre-session retry logic, and is not subject to
|
175
180
|
# current retryable write specifications.
|
@@ -177,12 +182,20 @@ module Mongo
|
|
177
182
|
attempt = 0
|
178
183
|
begin
|
179
184
|
attempt += 1
|
180
|
-
server ||= select_server(
|
181
|
-
|
185
|
+
server ||= select_server(
|
186
|
+
cluster,
|
187
|
+
ServerSelector.primary,
|
188
|
+
session,
|
189
|
+
timeout: context.remaining_timeout_sec
|
190
|
+
)
|
191
|
+
server.with_connection(
|
192
|
+
connection_global_id: context.connection_global_id,
|
193
|
+
context: context
|
194
|
+
) do |connection|
|
182
195
|
# Legacy retries do not use txn_num
|
183
196
|
yield connection, nil, context.dup
|
184
197
|
end
|
185
|
-
rescue Error::OperationFailure => e
|
198
|
+
rescue Error::OperationFailure::Family => e
|
186
199
|
e.add_note('legacy retry')
|
187
200
|
e.add_note("attempt #{attempt}")
|
188
201
|
server = nil
|
@@ -220,7 +233,10 @@ module Mongo
|
|
220
233
|
txn_num = nil
|
221
234
|
connection_succeeded = false
|
222
235
|
|
223
|
-
server.with_connection(
|
236
|
+
server.with_connection(
|
237
|
+
connection_global_id: context.connection_global_id,
|
238
|
+
context: context
|
239
|
+
) do |connection|
|
224
240
|
connection_succeeded = true
|
225
241
|
|
226
242
|
session.materialize_if_needed
|
@@ -230,10 +246,10 @@ module Mongo
|
|
230
246
|
# it later for the retry as well.
|
231
247
|
yield connection, txn_num, context.dup
|
232
248
|
end
|
233
|
-
rescue *retryable_exceptions, Error::PoolError, Auth::Unauthorized, Error::OperationFailure => e
|
249
|
+
rescue *retryable_exceptions, Error::PoolError, Auth::Unauthorized, Error::OperationFailure::Family => e
|
234
250
|
e.add_notes('modern retry', 'attempt 1')
|
235
251
|
|
236
|
-
if e.is_a?(Error::OperationFailure)
|
252
|
+
if e.is_a?(Error::OperationFailure::Family)
|
237
253
|
ensure_retryable!(e)
|
238
254
|
else
|
239
255
|
ensure_labeled_retryable!(e, connection_succeeded, session)
|
@@ -256,6 +272,8 @@ module Mongo
|
|
256
272
|
#
|
257
273
|
# @return [ Result ] The result of the operation.
|
258
274
|
def retry_write(original_error, txn_num, context:, failed_server: nil, &block)
|
275
|
+
context&.check_timeout!
|
276
|
+
|
259
277
|
session = context.session
|
260
278
|
|
261
279
|
# We do not request a scan of the cluster here, because error handling
|
@@ -263,7 +281,13 @@ module Mongo
|
|
263
281
|
# server description and/or topology as necessary (specifically,
|
264
282
|
# a socket error or a not master error should have marked the respective
|
265
283
|
# server unknown). Here we just need to wait for server selection.
|
266
|
-
server = select_server(
|
284
|
+
server = select_server(
|
285
|
+
cluster,
|
286
|
+
ServerSelector.primary,
|
287
|
+
session,
|
288
|
+
failed_server,
|
289
|
+
timeout: context.remaining_timeout_sec
|
290
|
+
)
|
267
291
|
|
268
292
|
unless server.retry_writes?
|
269
293
|
# Do not need to add "modern retry" here, it should already be on
|
@@ -279,14 +303,21 @@ module Mongo
|
|
279
303
|
raise Error::RaiseOriginalError
|
280
304
|
end
|
281
305
|
|
306
|
+
attempt = attempt ? attempt + 1 : 2
|
282
307
|
log_retry(original_error, message: 'Write retry')
|
283
308
|
server.with_connection(connection_global_id: context.connection_global_id) do |connection|
|
284
309
|
yield(connection, txn_num, context)
|
285
310
|
end
|
286
311
|
rescue *retryable_exceptions, Error::PoolError => e
|
287
|
-
|
288
|
-
|
289
|
-
|
312
|
+
maybe_fail_on_retryable(e, original_error, context, attempt)
|
313
|
+
failed_server = server
|
314
|
+
retry
|
315
|
+
rescue Error::OperationFailure::Family => e
|
316
|
+
maybe_fail_on_operation_failure(e, original_error, context, attempt)
|
317
|
+
failed_server = server
|
318
|
+
retry
|
319
|
+
rescue Mongo::Error::TimeoutError
|
320
|
+
raise
|
290
321
|
rescue Error, Error::AuthError => e
|
291
322
|
fail_on_other_error!(e, original_error)
|
292
323
|
rescue Error::RaiseOriginalError
|
@@ -332,10 +363,10 @@ module Mongo
|
|
332
363
|
|
333
364
|
# Raise either e, or original_error, depending on whether e is
|
334
365
|
# write_retryable.
|
335
|
-
def
|
366
|
+
def maybe_fail_on_retryable(e, original_error, context, attempt)
|
336
367
|
if e.write_retryable?
|
337
|
-
e.add_notes('modern retry',
|
338
|
-
raise e
|
368
|
+
e.add_notes('modern retry', "attempt #{attempt}")
|
369
|
+
raise e unless context&.deadline
|
339
370
|
else
|
340
371
|
original_error.add_note("later retry failed: #{e.class}: #{e}")
|
341
372
|
raise original_error
|
@@ -344,11 +375,11 @@ module Mongo
|
|
344
375
|
|
345
376
|
# Raise either e, or original_error, depending on whether e is
|
346
377
|
# appropriately labeled.
|
347
|
-
def
|
378
|
+
def maybe_fail_on_operation_failure(e, original_error, context, attempt)
|
348
379
|
e.add_note('modern retry')
|
349
380
|
if e.label?('RetryableWriteError') && !e.label?('NoWritesPerformed')
|
350
|
-
e.add_note(
|
351
|
-
raise e
|
381
|
+
e.add_note("attempt #{attempt}")
|
382
|
+
raise e unless context&.deadline
|
352
383
|
else
|
353
384
|
original_error.add_note("later retry failed: #{e.class}: #{e}")
|
354
385
|
raise original_error
|
data/lib/mongo/retryable.rb
CHANGED
@@ -46,8 +46,14 @@ module Mongo
|
|
46
46
|
# @api private
|
47
47
|
#
|
48
48
|
# @return [ Mongo::Server ] A server matching the server preference.
|
49
|
-
def select_server(cluster, server_selector, session, failed_server = nil)
|
50
|
-
server_selector.select_server(
|
49
|
+
def select_server(cluster, server_selector, session, failed_server = nil, timeout: nil)
|
50
|
+
server_selector.select_server(
|
51
|
+
cluster,
|
52
|
+
nil,
|
53
|
+
session,
|
54
|
+
deprioritized: [failed_server].compact,
|
55
|
+
timeout: timeout
|
56
|
+
)
|
51
57
|
end
|
52
58
|
|
53
59
|
# Returns the read worker for handling retryable reads.
|
@@ -226,11 +226,11 @@ module Mongo
|
|
226
226
|
# @return [ true ] If the connection succeeded.
|
227
227
|
#
|
228
228
|
# @since 2.0.0
|
229
|
-
def connect!
|
229
|
+
def connect!(context = nil)
|
230
230
|
raise_if_closed!
|
231
231
|
|
232
232
|
unless @socket
|
233
|
-
@socket = create_socket
|
233
|
+
@socket = create_socket(context)
|
234
234
|
@description, @compressor = do_connect
|
235
235
|
|
236
236
|
if server.load_balancer?
|
@@ -256,10 +256,16 @@ module Mongo
|
|
256
256
|
#
|
257
257
|
#
|
258
258
|
# @return [ Socket ] The created socket.
|
259
|
-
private def create_socket
|
259
|
+
private def create_socket(context = nil)
|
260
260
|
add_server_diagnostics do
|
261
|
-
|
262
|
-
connection_address: address,
|
261
|
+
opts = ssl_options.merge(
|
262
|
+
connection_address: address,
|
263
|
+
connection_generation: generation,
|
264
|
+
pipe: options[:pipe],
|
265
|
+
connect_timeout: context&.remaining_timeout_sec,
|
266
|
+
csot: !!context&.csot?
|
267
|
+
)
|
268
|
+
address.socket(socket_timeout, opts)
|
263
269
|
end
|
264
270
|
end
|
265
271
|
|
@@ -169,6 +169,7 @@ module Mongo
|
|
169
169
|
raise Error::LintError, "Trying to deliver a message over a disconnected connection (to #{address})"
|
170
170
|
end
|
171
171
|
buffer = serialize(message, context)
|
172
|
+
check_timeout!(context)
|
172
173
|
ensure_connected do |socket|
|
173
174
|
operation_id = Monitoring.next_operation_id
|
174
175
|
started_event = command_started(address, operation_id, message.payload,
|
@@ -181,9 +182,10 @@ module Mongo
|
|
181
182
|
result = nil
|
182
183
|
begin
|
183
184
|
result = add_server_diagnostics do
|
184
|
-
socket.write(buffer.to_s)
|
185
|
+
socket.write(buffer.to_s, timeout: context.remaining_timeout_sec)
|
185
186
|
if message.replyable?
|
186
|
-
|
187
|
+
check_timeout!(context)
|
188
|
+
Protocol::Message.deserialize(socket, max_message_size, message.request_id, options.merge(timeout: context.remaining_timeout_sec))
|
187
189
|
else
|
188
190
|
nil
|
189
191
|
end
|
@@ -273,6 +275,24 @@ module Mongo
|
|
273
275
|
|
274
276
|
buffer
|
275
277
|
end
|
278
|
+
|
279
|
+
# If timeoutMS is set for the operation context, checks whether there is
|
280
|
+
# enough time left to send the corresponding message to the server
|
281
|
+
# (remaining timeout is bigger than minimum round trip time for
|
282
|
+
# the server)
|
283
|
+
#
|
284
|
+
# @param [ Mongo::Operation::Context ] context Context of the operation.
|
285
|
+
#
|
286
|
+
# @raise [ Mongo::Error::TimeoutError ] if timeout expired or there is
|
287
|
+
# not enough time to send the message to the server.
|
288
|
+
def check_timeout!(context)
|
289
|
+
return if [nil, 0].include?(context.deadline)
|
290
|
+
|
291
|
+
time_to_execute = context.remaining_timeout_sec - server.minimum_round_trip_time
|
292
|
+
if time_to_execute <= 0
|
293
|
+
raise Mongo::Error::TimeoutError
|
294
|
+
end
|
295
|
+
end
|
276
296
|
end
|
277
297
|
end
|
278
298
|
end
|