mongo 2.20.0 → 2.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +40 -1
- data/Rakefile +59 -23
- 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/config.rb +2 -2
- 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/base_worker.rb +28 -3
- data/lib/mongo/retryable/read_worker.rb +76 -35
- data/lib/mongo/retryable/write_worker.rb +53 -22
- 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 +25 -8
- 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 +131 -18
- 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 -5
- data/lib/mongo.rb +1 -0
- data/mongo.gemspec +8 -11
- 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 +67 -20
- 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/retryable_reads_errors_spec.rb +35 -23
- data/spec/integration/sdam_error_handling_spec.rb +4 -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 -11
- 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_crud_spec.rb +1 -0
- 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/connection_spec.rb +22 -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/fle2v2-BypassQueryAnalysis.yml +1 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Compact.yml +1 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-CreateCollection.yml +1 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-DecryptExistingData.yml +1 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Delete.yml +1 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-EncryptedFields-vs-EncryptedFieldsMap.yml +1 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-EncryptedFields-vs-jsonSchema.yml +1 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-EncryptedFieldsMap-defaults.yml +1 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-FindOneAndUpdate.yml +1 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-InsertFind-Indexed.yml +1 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-InsertFind-Unindexed.yml +1 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-MissingKey.yml +1 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-NoEncryption.yml +1 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Update.yml +1 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-validatorAndPartialFieldExpression.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 +6 -0
- data/spec/spec_tests/data/crud_unified/db-aggregate-write-readPreference.yml +6 -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/spec_tests/transactions_unified_spec.rb +2 -1
- data/spec/support/certificates/atlas-ocsp-ca.crt +89 -79
- data/spec/support/certificates/atlas-ocsp.crt +117 -122
- data/spec/support/certificates/retrieve-atlas-cert +1 -1
- 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 +88 -173
- checksums.yaml.gz.sig +0 -0
- data/spec/mongo/server/round_trip_time_averager_spec.rb +0 -48
- data/spec/shared/LICENSE +0 -20
- data/spec/shared/bin/get-mongodb-download-url +0 -17
- data/spec/shared/bin/s3-copy +0 -45
- data/spec/shared/bin/s3-upload +0 -69
- data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
- data/spec/shared/lib/mrss/cluster_config.rb +0 -231
- data/spec/shared/lib/mrss/constraints.rb +0 -378
- data/spec/shared/lib/mrss/docker_runner.rb +0 -298
- data/spec/shared/lib/mrss/eg_config_utils.rb +0 -51
- data/spec/shared/lib/mrss/event_subscriber.rb +0 -210
- data/spec/shared/lib/mrss/lite_constraints.rb +0 -238
- data/spec/shared/lib/mrss/server_version_registry.rb +0 -113
- data/spec/shared/lib/mrss/session_registry.rb +0 -69
- data/spec/shared/lib/mrss/session_registry_legacy.rb +0 -60
- data/spec/shared/lib/mrss/spec_organizer.rb +0 -179
- data/spec/shared/lib/mrss/utils.rb +0 -37
- data/spec/shared/share/Dockerfile.erb +0 -281
- data/spec/shared/share/haproxy-1.conf +0 -16
- data/spec/shared/share/haproxy-2.conf +0 -17
- data/spec/shared/shlib/config.sh +0 -27
- data/spec/shared/shlib/distro.sh +0 -74
- data/spec/shared/shlib/server.sh +0 -417
- data/spec/shared/shlib/set_env.sh +0 -146
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Aggregate.yml +0 -241
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Correctness.yml +0 -422
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Delete.yml +0 -182
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-FindOneAndUpdate.yml +0 -239
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-InsertFind.yml +0 -235
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Update.yml +0 -252
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Aggregate.yml +0 -1687
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Correctness.yml +0 -293
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Delete.yml +0 -905
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-FindOneAndUpdate.yml +0 -1684
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-InsertFind.yml +0 -1680
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Update.yml +0 -1697
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Aggregate.yml +0 -329
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Correctness.yml +0 -424
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Delete.yml +0 -226
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-FindOneAndUpdate.yml +0 -327
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-InsertFind.yml +0 -319
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Update.yml +0 -336
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Aggregate.yml +0 -913
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Correctness.yml +0 -292
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Delete.yml +0 -518
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-FindOneAndUpdate.yml +0 -911
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-InsertFind.yml +0 -907
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Update.yml +0 -924
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Aggregate.yml +0 -325
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Correctness.yml +0 -424
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Delete.yml +0 -224
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-FindOneAndUpdate.yml +0 -323
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-InsertFind.yml +0 -319
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Update.yml +0 -338
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Aggregate.yml +0 -241
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Correctness.yml +0 -423
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Delete.yml +0 -182
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-FindOneAndUpdate.yml +0 -239
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-InsertFind.yml +0 -235
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Update.yml +0 -254
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Aggregate.yml +0 -241
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Correctness.yml +0 -422
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Delete.yml +0 -182
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-FindOneAndUpdate.yml +0 -239
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-InsertFind.yml +0 -235
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Update.yml +0 -254
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-WrongType.yml +0 -43
- data/spec/support/faas/app/aws_lambda/mongodb/Gemfile.lock +0 -19
- data.tar.gz.sig +0 -0
- metadata.gz.sig +0 -3
data/lib/mongo/socket.rb
CHANGED
@@ -192,27 +192,24 @@ module Mongo
|
|
192
192
|
# socket.read(4096)
|
193
193
|
#
|
194
194
|
# @param [ Integer ] length The number of bytes to read.
|
195
|
-
# @param [ Numeric ]
|
195
|
+
# @param [ Numeric ] socket_timeout The timeout to use for each chunk read,
|
196
|
+
# mutually exclusive to +timeout+.
|
197
|
+
# @param [ Numeric ] timeout The total timeout to the whole read operation,
|
198
|
+
# mutually exclusive to +socket_timeout+.
|
196
199
|
#
|
197
200
|
# @raise [ Mongo::SocketError ] If not all data is returned.
|
198
201
|
#
|
199
202
|
# @return [ Object ] The data from the socket.
|
200
203
|
#
|
201
204
|
# @since 2.0.0
|
202
|
-
def read(length, timeout: nil)
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
unless (chunk.length > 0 || length == 0)
|
211
|
-
raise IOError, "Expected to read > 0 bytes but read 0 bytes"
|
212
|
-
end
|
213
|
-
data << chunk
|
214
|
-
end
|
215
|
-
data
|
205
|
+
def read(length, socket_timeout: nil, timeout: nil)
|
206
|
+
if !socket_timeout.nil? && !timeout.nil?
|
207
|
+
raise ArgumentError, 'Both timeout and socket_timeout cannot be set'
|
208
|
+
end
|
209
|
+
if !socket_timeout.nil? || timeout.nil?
|
210
|
+
read_without_timeout(length, socket_timeout)
|
211
|
+
else
|
212
|
+
read_with_timeout(length, timeout)
|
216
213
|
end
|
217
214
|
end
|
218
215
|
|
@@ -233,15 +230,16 @@ module Mongo
|
|
233
230
|
# Writes data to the socket instance.
|
234
231
|
#
|
235
232
|
# @param [ Array<Object> ] args The data to be written.
|
233
|
+
# @param [ Numeric ] timeout The total timeout to the whole write operation.
|
236
234
|
#
|
237
235
|
# @return [ Integer ] The length of bytes written to the socket.
|
238
236
|
#
|
239
237
|
# @raise [ Error::SocketError | Error::SocketTimeoutError ] When there is a network error during the write.
|
240
238
|
#
|
241
239
|
# @since 2.0.0
|
242
|
-
def write(*args)
|
240
|
+
def write(*args, timeout: nil)
|
243
241
|
map_exceptions do
|
244
|
-
do_write(*args)
|
242
|
+
do_write(*args, timeout: timeout)
|
245
243
|
end
|
246
244
|
end
|
247
245
|
|
@@ -254,7 +252,7 @@ module Mongo
|
|
254
252
|
true
|
255
253
|
end
|
256
254
|
|
257
|
-
# For backwards
|
255
|
+
# For backwards compatibility only, do not use.
|
258
256
|
#
|
259
257
|
# @return [ true ] Always true.
|
260
258
|
#
|
@@ -265,18 +263,76 @@ module Mongo
|
|
265
263
|
|
266
264
|
private
|
267
265
|
|
268
|
-
|
266
|
+
# Reads the +length+ bytes from the socket, the read operation duration is
|
267
|
+
# limited to +timeout+ second.
|
268
|
+
#
|
269
|
+
# @param [ Integer ] length The number of bytes to read.
|
270
|
+
# @param [ Numeric ] timeout The total timeout to the whole read operation.
|
271
|
+
#
|
272
|
+
# @return [ Object ] The data from the socket.
|
273
|
+
def read_with_timeout(length, timeout)
|
274
|
+
deadline = Utils.monotonic_time + timeout
|
275
|
+
map_exceptions do
|
276
|
+
String.new.tap do |data|
|
277
|
+
while data.length < length
|
278
|
+
socket_timeout = deadline - Utils.monotonic_time
|
279
|
+
if socket_timeout <= 0
|
280
|
+
raise Mongo::Error::TimeoutError
|
281
|
+
end
|
282
|
+
chunk = read_from_socket(length - data.length, socket_timeout: socket_timeout, csot: true)
|
283
|
+
unless chunk.length > 0
|
284
|
+
raise IOError, "Expected to read > 0 bytes but read 0 bytes"
|
285
|
+
end
|
286
|
+
data << chunk
|
287
|
+
end
|
288
|
+
end
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
292
|
+
# Reads the +length+ bytes from the socket. The read operation may involve
|
293
|
+
# multiple socket reads, each read is limited to +timeout+ second,
|
294
|
+
# if the parameter is provided.
|
295
|
+
#
|
296
|
+
# @param [ Integer ] length The number of bytes to read.
|
297
|
+
# @param [ Numeric ] socket_timeout The timeout to use for each chunk read.
|
298
|
+
#
|
299
|
+
# @return [ Object ] The data from the socket.
|
300
|
+
def read_without_timeout(length, socket_timeout = nil)
|
301
|
+
map_exceptions do
|
302
|
+
String.new.tap do |data|
|
303
|
+
while data.length < length
|
304
|
+
chunk = read_from_socket(length - data.length, socket_timeout: socket_timeout)
|
305
|
+
unless chunk.length > 0
|
306
|
+
raise IOError, "Expected to read > 0 bytes but read 0 bytes"
|
307
|
+
end
|
308
|
+
data << chunk
|
309
|
+
end
|
310
|
+
end
|
311
|
+
end
|
312
|
+
end
|
313
|
+
|
314
|
+
|
315
|
+
# Reads the +length+ bytes from the socket. The read operation may involve
|
316
|
+
# multiple socket reads, each read is limited to +timeout+ second,
|
317
|
+
# if the parameter is provided.
|
318
|
+
#
|
319
|
+
# @param [ Integer ] length The number of bytes to read.
|
320
|
+
# @param [ Numeric ] :socket_timeout The timeout to use for each chunk read.
|
321
|
+
# @param [ true | false ] :csot Whether the CSOT timeout is set for the operation.
|
322
|
+
#
|
323
|
+
# @return [ Object ] The data from the socket.
|
324
|
+
def read_from_socket(length, socket_timeout: nil, csot: false)
|
269
325
|
# Just in case
|
270
326
|
if length == 0
|
271
327
|
return ''.force_encoding('BINARY')
|
272
328
|
end
|
273
329
|
|
274
|
-
_timeout =
|
330
|
+
_timeout = socket_timeout || self.timeout
|
275
331
|
if _timeout
|
276
332
|
if _timeout > 0
|
277
333
|
deadline = Utils.monotonic_time + _timeout
|
278
334
|
elsif _timeout < 0
|
279
|
-
|
335
|
+
raise_timeout_error!("Negative timeout #{_timeout} given to socket", csot)
|
280
336
|
end
|
281
337
|
end
|
282
338
|
|
@@ -331,7 +387,7 @@ module Mongo
|
|
331
387
|
if deadline
|
332
388
|
select_timeout = deadline - Utils.monotonic_time
|
333
389
|
if select_timeout <= 0
|
334
|
-
|
390
|
+
raise_timeout_error!("Took more than #{_timeout} seconds to receive data", csot)
|
335
391
|
end
|
336
392
|
end
|
337
393
|
pipe = options[:pipe]
|
@@ -373,11 +429,11 @@ module Mongo
|
|
373
429
|
if deadline
|
374
430
|
select_timeout = deadline - Utils.monotonic_time
|
375
431
|
if select_timeout <= 0
|
376
|
-
|
432
|
+
raise_timeout_error!("Took more than #{_timeout} seconds to receive data", csot)
|
377
433
|
end
|
378
434
|
end
|
379
435
|
elsif rv.nil?
|
380
|
-
|
436
|
+
raise_timeout_error!("Took more than #{_timeout} seconds to receive data (select call timed out)", csot)
|
381
437
|
end
|
382
438
|
retry
|
383
439
|
end
|
@@ -402,9 +458,23 @@ module Mongo
|
|
402
458
|
# sholud map exceptions.
|
403
459
|
#
|
404
460
|
# @param [ Array<Object> ] args The data to be written.
|
461
|
+
# @param [ Numeric ] :timeout The total timeout to the whole write operation.
|
462
|
+
#
|
463
|
+
# @return [ Integer ] The length of bytes written to the socket.
|
464
|
+
def do_write(*args, timeout: nil)
|
465
|
+
if timeout.nil?
|
466
|
+
write_without_timeout(*args)
|
467
|
+
else
|
468
|
+
write_with_timeout(*args, timeout: timeout)
|
469
|
+
end
|
470
|
+
end
|
471
|
+
|
472
|
+
# Writes data to to the socket.
|
473
|
+
#
|
474
|
+
# @param [ Array<Object> ] args The data to be written.
|
405
475
|
#
|
406
476
|
# @return [ Integer ] The length of bytes written to the socket.
|
407
|
-
def
|
477
|
+
def write_without_timeout(*args)
|
408
478
|
# This method used to forward arguments to @socket.write in a
|
409
479
|
# single call like so:
|
410
480
|
#
|
@@ -428,6 +498,57 @@ module Mongo
|
|
428
498
|
end
|
429
499
|
end
|
430
500
|
|
501
|
+
# Writes data to to the socket, the write duration is limited to +timeout+.
|
502
|
+
#
|
503
|
+
# @param [ Array<Object> ] args The data to be written.
|
504
|
+
# @param [ Numeric ] :timeout The total timeout to the whole write operation.
|
505
|
+
#
|
506
|
+
# @return [ Integer ] The length of bytes written to the socket.
|
507
|
+
def write_with_timeout(*args, timeout:)
|
508
|
+
raise ArgumentError, 'timeout cannot be nil' if timeout.nil?
|
509
|
+
raise_timeout_error!("Negative timeout #{timeout} given to socket", true) if timeout < 0
|
510
|
+
|
511
|
+
written = 0
|
512
|
+
args.each do |buf|
|
513
|
+
buf = buf.to_s
|
514
|
+
i = 0
|
515
|
+
while i < buf.length
|
516
|
+
chunk = buf[i...(i + WRITE_CHUNK_SIZE)]
|
517
|
+
written += write_chunk(chunk, timeout)
|
518
|
+
i += WRITE_CHUNK_SIZE
|
519
|
+
end
|
520
|
+
end
|
521
|
+
written
|
522
|
+
end
|
523
|
+
|
524
|
+
def write_chunk(chunk, timeout)
|
525
|
+
deadline = Utils.monotonic_time + timeout
|
526
|
+
written = 0
|
527
|
+
begin
|
528
|
+
written += @socket.write_nonblock(chunk[written..-1])
|
529
|
+
rescue IO::WaitWritable, Errno::EINTR
|
530
|
+
select_timeout = deadline - Utils.monotonic_time
|
531
|
+
rv = Kernel.select(nil, [@socket], nil, select_timeout)
|
532
|
+
if BSON::Environment.jruby?
|
533
|
+
# Ignore the return value of Kernel.select.
|
534
|
+
# On JRuby, select appears to return nil prior to timeout expiration
|
535
|
+
# (apparently due to a EAGAIN) which then causes us to fail the read
|
536
|
+
# even though we could have retried it.
|
537
|
+
# Check the deadline ourselves.
|
538
|
+
if deadline
|
539
|
+
select_timeout = deadline - Utils.monotonic_time
|
540
|
+
if select_timeout <= 0
|
541
|
+
raise_timeout_error!("Took more than #{timeout} seconds to receive data", true)
|
542
|
+
end
|
543
|
+
end
|
544
|
+
elsif rv.nil?
|
545
|
+
raise_timeout_error!("Took more than #{timeout} seconds to receive data (select call timed out)", true)
|
546
|
+
end
|
547
|
+
retry
|
548
|
+
end
|
549
|
+
written
|
550
|
+
end
|
551
|
+
|
431
552
|
def unix_socket?(sock)
|
432
553
|
defined?(UNIXSocket) && sock.is_a?(UNIXSocket)
|
433
554
|
end
|
@@ -482,5 +603,13 @@ module Mongo
|
|
482
603
|
def human_address
|
483
604
|
raise NotImplementedError
|
484
605
|
end
|
606
|
+
|
607
|
+
def raise_timeout_error!(message = nil, csot = false)
|
608
|
+
if csot
|
609
|
+
raise Mongo::Error::TimeoutError
|
610
|
+
else
|
611
|
+
raise Errno::ETIMEDOUT, message
|
612
|
+
end
|
613
|
+
end
|
485
614
|
end
|
486
615
|
end
|
@@ -272,6 +272,7 @@ module Mongo
|
|
272
272
|
uri_option 'localThresholdMS', :local_threshold, type: :ms
|
273
273
|
uri_option 'heartbeatFrequencyMS', :heartbeat_frequency, type: :ms
|
274
274
|
uri_option 'maxIdleTimeMS', :max_idle_time, type: :ms
|
275
|
+
uri_option 'timeoutMS', :timeout_ms, type: :integer
|
275
276
|
|
276
277
|
# Write Options
|
277
278
|
uri_option 'w', :w, group: :write_concern, type: :w
|
data/lib/mongo/version.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
# rubocop:todo all
|
3
2
|
|
4
3
|
# Copyright (C) 2014-2020 MongoDB Inc.
|
5
4
|
#
|
@@ -16,9 +15,6 @@
|
|
16
15
|
# limitations under the License.
|
17
16
|
|
18
17
|
module Mongo
|
19
|
-
|
20
18
|
# The current version of the driver.
|
21
|
-
|
22
|
-
# @since 2.0.0
|
23
|
-
VERSION = '2.20.0'.freeze
|
19
|
+
VERSION = '2.21.0'
|
24
20
|
end
|
data/lib/mongo.rb
CHANGED
data/mongo.gemspec
CHANGED
@@ -9,28 +9,25 @@ Gem::Specification.new do |s|
|
|
9
9
|
s.name = 'mongo'
|
10
10
|
s.version = Mongo::VERSION
|
11
11
|
s.platform = Gem::Platform::RUBY
|
12
|
-
s.authors = [
|
13
|
-
s.email =
|
12
|
+
s.authors = [ 'The MongoDB Ruby Team' ]
|
13
|
+
s.email = 'dbx-ruby@mongodb.com'
|
14
14
|
s.homepage = 'https://mongodb.com/docs/ruby-driver/'
|
15
15
|
s.summary = 'Ruby driver for MongoDB'
|
16
|
-
s.description = 'A Ruby driver for MongoDB'
|
17
16
|
s.license = 'Apache-2.0'
|
17
|
+
s.description = <<~DESC
|
18
|
+
A pure-Ruby driver for connecting to, querying, and manipulating MongoDB
|
19
|
+
databases. Officially developed and supported by MongoDB, with love for
|
20
|
+
the Ruby community.
|
21
|
+
DESC
|
18
22
|
|
19
23
|
s.metadata = {
|
20
24
|
'bug_tracker_uri' => 'https://jira.mongodb.org/projects/RUBY',
|
21
25
|
'changelog_uri' => 'https://github.com/mongodb/mongo-ruby-driver/releases',
|
22
|
-
'documentation_uri' => 'https://mongodb.com/docs/ruby-driver/',
|
23
26
|
'homepage_uri' => 'https://mongodb.com/docs/ruby-driver/',
|
27
|
+
'documentation_uri' => 'https://mongodb.com/docs/ruby-driver/current/tutorials/quick-start/',
|
24
28
|
'source_code_uri' => 'https://github.com/mongodb/mongo-ruby-driver',
|
25
29
|
}
|
26
30
|
|
27
|
-
if File.exist?('gem-private_key.pem')
|
28
|
-
s.signing_key = 'gem-private_key.pem'
|
29
|
-
s.cert_chain = ['gem-public_cert.pem']
|
30
|
-
else
|
31
|
-
warn "[#{s.name}] Warning: No private key present, creating unsigned gem."
|
32
|
-
end
|
33
|
-
|
34
31
|
s.files = Dir.glob('{bin,lib,spec}/**/*')
|
35
32
|
s.files += %w[mongo.gemspec LICENSE README.md CONTRIBUTING.md Rakefile]
|
36
33
|
s.test_files = Dir.glob('spec/**/*')
|
@@ -57,7 +57,8 @@ describe 'Auto Encryption' do
|
|
57
57
|
'jsonSchema' => kind_of(Hash),
|
58
58
|
'isRemoteSchema' => false,
|
59
59
|
),
|
60
|
-
{ execution_options: { deserialize_as_bson: true } },
|
60
|
+
{ execution_options: { deserialize_as_bson: true }, timeout_ms: nil },
|
61
|
+
|
61
62
|
)
|
62
63
|
.and_raise(Mongo::Error::NoServerAvailable.new(server_selector, cluster))
|
63
64
|
end
|