mongo 2.19.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 +40 -1
- data/Rakefile +83 -174
- 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/topology/base.rb +16 -0
- data/lib/mongo/cluster.rb +41 -5
- 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 +92 -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 +44 -3
- data/lib/mongo/collection.rb +185 -26
- 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/transactions_not_supported.rb +34 -0
- data/lib/mongo/error.rb +3 -0
- data/lib/mongo/grid/fs_bucket.rb +48 -9
- 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/monitoring/event/secure.rb +1 -1
- data/lib/mongo/operation/context.rb +40 -2
- data/lib/mongo/operation/create_search_indexes/op_msg.rb +31 -0
- data/lib/mongo/operation/create_search_indexes.rb +15 -0
- data/lib/mongo/operation/delete/op_msg.rb +2 -1
- data/lib/mongo/operation/drop_search_index/op_msg.rb +33 -0
- data/lib/mongo/operation/drop_search_index.rb +15 -0
- 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 +55 -28
- data/lib/mongo/operation/shared/op_msg_executable.rb +4 -1
- data/lib/mongo/operation/shared/response_handling.rb +25 -27
- data/lib/mongo/operation/shared/sessions_supported.rb +1 -1
- data/lib/mongo/operation/shared/specifiable.rb +7 -0
- 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 +34 -0
- data/lib/mongo/operation/update_search_index.rb +15 -0
- data/lib/mongo/operation.rb +4 -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 +78 -36
- data/lib/mongo/retryable/write_worker.rb +59 -25
- data/lib/mongo/retryable.rb +8 -2
- data/lib/mongo/search_index/view.rb +232 -0
- data/lib/mongo/server/app_metadata/environment.rb +64 -9
- data/lib/mongo/server/app_metadata.rb +5 -4
- 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 +2 -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 +54 -12
- data/lib/mongo/session/server_session/dirtyable.rb +52 -0
- data/lib/mongo/session/server_session.rb +3 -0
- data/lib/mongo/session/session_pool.rb +12 -18
- data/lib/mongo/session.rb +110 -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/uri.rb +0 -4
- data/lib/mongo/version.rb +1 -5
- data/lib/mongo.rb +2 -0
- data/mongo.gemspec +9 -18
- data/spec/atlas/atlas_connectivity_spec.rb +9 -9
- data/spec/atlas/operations_spec.rb +5 -5
- data/spec/faas/ruby-sam-app/Gemfile +9 -0
- data/spec/faas/ruby-sam-app/mongodb/Gemfile +4 -0
- data/spec/faas/ruby-sam-app/mongodb/app.rb +149 -0
- data/spec/faas/ruby-sam-app/template.yaml +48 -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/corpus_spec.rb +10 -2
- 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/find_options_spec.rb +227 -0
- 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 +196 -31
- data/spec/integration/retryable_writes_errors_spec.rb +156 -0
- data/spec/integration/sdam_error_handling_spec.rb +4 -1
- data/spec/integration/search_indexes_prose_spec.rb +172 -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 +34 -20
- 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/cluster_spec.rb +36 -0
- data/spec/mongo/collection/view/aggregation_spec.rb +20 -40
- data/spec/mongo/collection/view/change_stream_spec.rb +3 -3
- data/spec/mongo/collection/view/explainable_spec.rb +2 -0
- data/spec/mongo/collection_crud_spec.rb +2 -1
- 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/insert_spec.rb +1 -1
- data/spec/mongo/operation/shared/csot/examples.rb +113 -0
- data/spec/mongo/query_cache_spec.rb +243 -225
- data/spec/mongo/retryable/write_worker_spec.rb +39 -0
- data/spec/mongo/retryable_spec.rb +1 -0
- data/spec/mongo/server/app_metadata/environment_spec.rb +135 -0
- data/spec/mongo/server/app_metadata_spec.rb +12 -2
- data/spec/mongo/server/connection_spec.rb +26 -0
- data/spec/mongo/server/round_trip_time_calculator_spec.rb +120 -0
- data/spec/mongo/session/session_pool_spec.rb +1 -16
- data/spec/mongo/session_transaction_spec.rb +15 -0
- data/spec/mongo/socket/ssl_spec.rb +0 -10
- data/spec/mongo/uri_spec.rb +0 -9
- data/spec/runners/change_streams/test.rb +2 -2
- data/spec/runners/crud/operation.rb +1 -1
- data/spec/runners/crud/test.rb +0 -8
- data/spec/runners/crud/verifier.rb +3 -1
- data/spec/runners/crud.rb +1 -1
- data/spec/runners/transactions/operation.rb +4 -6
- data/spec/runners/transactions/test.rb +12 -3
- data/spec/runners/unified/ambiguous_operations.rb +13 -0
- data/spec/runners/unified/assertions.rb +20 -3
- data/spec/runners/unified/change_stream_operations.rb +14 -24
- data/spec/runners/unified/crud_operations.rb +82 -47
- data/spec/runners/unified/ddl_operations.rb +38 -7
- data/spec/runners/unified/grid_fs_operations.rb +37 -2
- data/spec/runners/unified/search_index_operations.rb +63 -0
- data/spec/runners/unified/support_operations.rb +46 -9
- data/spec/runners/unified/test.rb +33 -12
- data/spec/runners/unified.rb +1 -1
- data/spec/solo/clean_exit_spec.rb +2 -0
- data/spec/spec_helper.rb +1 -1
- 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/explain.yml +2 -2
- 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/connection_string/invalid-uris.yml +0 -10
- data/spec/spec_tests/data/connection_string/valid-options.yml +13 -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 +377 -0
- data/spec/spec_tests/data/index_management/createSearchIndex.yml +64 -0
- data/spec/spec_tests/data/index_management/createSearchIndexes.yml +86 -0
- data/spec/spec_tests/data/index_management/dropSearchIndex.yml +43 -0
- data/spec/spec_tests/data/index_management/listSearchIndexes.yml +91 -0
- data/spec/spec_tests/data/index_management/updateSearchIndex.yml +46 -0
- data/spec/spec_tests/data/retryable_writes/unified/bulkWrite-serverErrors.yml +3 -6
- data/spec/spec_tests/data/retryable_writes/unified/insertOne-serverErrors.yml +3 -6
- data/spec/spec_tests/data/run_command_unified/runCommand.yml +319 -0
- data/spec/spec_tests/data/sessions_unified/driver-sessions-dirty-session-errors.yml +351 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +1 -1
- data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +7 -7
- data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +3 -4
- data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +1 -1
- data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +1 -1
- data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +3 -3
- data/spec/spec_tests/index_management_unified_spec.rb +13 -0
- data/spec/spec_tests/run_command_unified_spec.rb +13 -0
- data/spec/spec_tests/sdam_unified_spec.rb +2 -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/constraints.rb +6 -0
- 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/ocsp +1 -1
- data/spec/support/recording_logger.rb +27 -0
- data/spec/support/shared/session.rb +2 -2
- data/spec/support/spec_config.rb +5 -0
- data/spec/support/spec_setup.rb +2 -2
- data/spec/support/utils.rb +3 -1
- metadata +1329 -1368
- 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 -295
- 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 -330
- 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 -416
- data/spec/shared/shlib/set_env.sh +0 -169
- 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/spec_tests/data/cmap/pool-clear-interrupt-immediately.yml +0 -49
- data.tar.gz.sig +0 -0
- metadata.gz.sig +0 -2
@@ -33,11 +33,11 @@ module Mongo
|
|
33
33
|
#
|
34
34
|
# @option options [ Integer ] :local_threshold The local threshold boundary for
|
35
35
|
# nearest selection in seconds.
|
36
|
-
# @option options [ Integer ] max_staleness The maximum replication lag,
|
36
|
+
# @option options [ Integer ] :max_staleness The maximum replication lag,
|
37
37
|
# in seconds, that a secondary can suffer and still be eligible for a read.
|
38
38
|
# A value of -1 is treated identically to nil, which is to not
|
39
39
|
# have a maximum staleness.
|
40
|
-
# @option options [ Hash | nil ] hedge A Hash specifying whether to enable hedged
|
40
|
+
# @option options [ Hash | nil ] :hedge A Hash specifying whether to enable hedged
|
41
41
|
# reads on the server. Hedged reads are not enabled by default. When
|
42
42
|
# specifying this option, it must be in the format: { enabled: true },
|
43
43
|
# where the value of the :enabled key is a boolean value.
|
@@ -164,6 +164,12 @@ module Mongo
|
|
164
164
|
# for mongos pinning. Added in version 2.10.0.
|
165
165
|
# @param [ true | false ] write_aggregation Whether we need a server that
|
166
166
|
# supports writing aggregations (e.g. with $merge/$out) on secondaries.
|
167
|
+
# @param [ Array<Server> ] deprioritized A list of servers that should
|
168
|
+
# be selected from only if no other servers are available. This is
|
169
|
+
# used to avoid selecting the same server twice in a row when
|
170
|
+
# retrying a command.
|
171
|
+
# @param [ Float | nil ] :timeout Timeout in seconds for the operation,
|
172
|
+
# if any.
|
167
173
|
#
|
168
174
|
# @return [ Mongo::Server ] A server matching the server preference.
|
169
175
|
#
|
@@ -174,21 +180,35 @@ module Mongo
|
|
174
180
|
# lint mode is enabled.
|
175
181
|
#
|
176
182
|
# @since 2.0.0
|
177
|
-
def select_server(
|
178
|
-
|
183
|
+
def select_server(
|
184
|
+
cluster,
|
185
|
+
ping = nil,
|
186
|
+
session = nil,
|
187
|
+
write_aggregation: false,
|
188
|
+
deprioritized: [],
|
189
|
+
timeout: nil
|
190
|
+
)
|
191
|
+
select_server_impl(cluster, ping, session, write_aggregation, deprioritized, timeout).tap do |server|
|
179
192
|
if Lint.enabled? && !server.pool.ready?
|
180
193
|
raise Error::LintError, 'Server selector returning a server with a pool which is not ready'
|
181
194
|
end
|
182
195
|
end
|
183
196
|
end
|
184
197
|
|
185
|
-
# Parameters and return values are the same as for select_server
|
186
|
-
|
198
|
+
# Parameters and return values are the same as for select_server, only
|
199
|
+
# the +timeout+ param is renamed to +csot_timeout+.
|
200
|
+
private def select_server_impl(cluster, ping, session, write_aggregation, deprioritized, csot_timeout)
|
187
201
|
if cluster.topology.is_a?(Cluster::Topology::LoadBalanced)
|
188
202
|
return cluster.servers.first
|
189
203
|
end
|
190
204
|
|
191
|
-
|
205
|
+
timeout = cluster.options[:server_selection_timeout] || SERVER_SELECTION_TIMEOUT
|
206
|
+
|
207
|
+
server_selection_timeout = if csot_timeout && csot_timeout > 0
|
208
|
+
[timeout, csot_timeout].min
|
209
|
+
else
|
210
|
+
timeout
|
211
|
+
end
|
192
212
|
|
193
213
|
# Special handling for zero timeout: if we have to select a server,
|
194
214
|
# and the timeout is zero, fail immediately (since server selection
|
@@ -266,7 +286,7 @@ module Mongo
|
|
266
286
|
end
|
267
287
|
end
|
268
288
|
|
269
|
-
server = try_select_server(cluster, write_aggregation: write_aggregation)
|
289
|
+
server = try_select_server(cluster, write_aggregation: write_aggregation, deprioritized: deprioritized)
|
270
290
|
|
271
291
|
if server
|
272
292
|
unless cluster.topology.compatible?
|
@@ -321,11 +341,15 @@ module Mongo
|
|
321
341
|
# an eligible server.
|
322
342
|
# @param [ true | false ] write_aggregation Whether we need a server that
|
323
343
|
# supports writing aggregations (e.g. with $merge/$out) on secondaries.
|
344
|
+
# @param [ Array<Server> ] deprioritized A list of servers that should
|
345
|
+
# be selected from only if no other servers are available. This is
|
346
|
+
# used to avoid selecting the same server twice in a row when
|
347
|
+
# retrying a command.
|
324
348
|
#
|
325
349
|
# @return [ Server | nil ] A suitable server, if one exists.
|
326
350
|
#
|
327
351
|
# @api private
|
328
|
-
def try_select_server(cluster, write_aggregation: false)
|
352
|
+
def try_select_server(cluster, write_aggregation: false, deprioritized: [])
|
329
353
|
servers = if write_aggregation && cluster.replica_set?
|
330
354
|
# 1. Check if ALL servers in cluster support secondary writes.
|
331
355
|
is_write_supported = cluster.servers.reduce(true) do |res, server|
|
@@ -347,7 +371,7 @@ module Mongo
|
|
347
371
|
# by the selector (e.g. for secondary preferred, the first
|
348
372
|
# server may be a secondary and the second server may be primary)
|
349
373
|
# and we should take the first server here respecting the order
|
350
|
-
server = servers
|
374
|
+
server = suitable_server(servers, deprioritized)
|
351
375
|
|
352
376
|
if server
|
353
377
|
if Lint.enabled?
|
@@ -418,6 +442,24 @@ module Mongo
|
|
418
442
|
|
419
443
|
private
|
420
444
|
|
445
|
+
# Returns a server from the list of servers that is suitable for
|
446
|
+
# executing the operation.
|
447
|
+
#
|
448
|
+
# @param [ Array<Server> ] servers The candidate servers.
|
449
|
+
# @param [ Array<Server> ] deprioritized A list of servers that should
|
450
|
+
# be selected from only if no other servers are available.
|
451
|
+
#
|
452
|
+
# @return [ Server | nil ] The suitable server or nil if no suitable
|
453
|
+
# server is available.
|
454
|
+
def suitable_server(servers, deprioritized)
|
455
|
+
preferred = servers - deprioritized
|
456
|
+
if preferred.empty?
|
457
|
+
servers.first
|
458
|
+
else
|
459
|
+
preferred.first
|
460
|
+
end
|
461
|
+
end
|
462
|
+
|
421
463
|
# Convert this server preference definition into a format appropriate
|
422
464
|
# for sending to a MongoDB server (i.e., as a command field).
|
423
465
|
#
|
@@ -612,9 +654,9 @@ module Mongo
|
|
612
654
|
# state resulting from SDAM will immediately wake up this method and
|
613
655
|
# cause it to return.
|
614
656
|
#
|
615
|
-
# If the cluster
|
657
|
+
# If the cluster does not have a server selection semaphore, waits
|
616
658
|
# the smaller of 0.25 seconds and the specified remaining time.
|
617
|
-
# This functionality is provided for backwards
|
659
|
+
# This functionality is provided for backwards compatibility only for
|
618
660
|
# applications directly invoking the server selection process.
|
619
661
|
# If lint mode is enabled and the cluster does not have a server
|
620
662
|
# selection semaphore, Error::LintError will be raised.
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright (C) 2024 MongoDB Inc.
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
|
17
|
+
module Mongo
|
18
|
+
class Session
|
19
|
+
class ServerSession
|
20
|
+
# Functionality for manipulating and querying a session's
|
21
|
+
# "dirty" state, per the last paragraph at
|
22
|
+
# https://github.com/mongodb/specifications/blob/master/source/sessions/driver-sessions.rst#server-session-pool
|
23
|
+
#
|
24
|
+
# If a driver has a server session pool and a network error is
|
25
|
+
# encountered when executing any command with a ClientSession, the
|
26
|
+
# driver MUST mark the associated ServerSession as dirty. Dirty server
|
27
|
+
# sessions are discarded when returned to the server session pool. It is
|
28
|
+
# valid for a dirty session to be used for subsequent commands (e.g. an
|
29
|
+
# implicit retry attempt, a later command in a bulk write, or a later
|
30
|
+
# operation on an explicit session), however, it MUST remain dirty for
|
31
|
+
# the remainder of its lifetime regardless if later commands succeed.
|
32
|
+
#
|
33
|
+
# @api private
|
34
|
+
module Dirtyable
|
35
|
+
# Query whether the server session has been marked dirty or not.
|
36
|
+
#
|
37
|
+
# @return [ true | false ] the server session's dirty state
|
38
|
+
def dirty?
|
39
|
+
@dirty
|
40
|
+
end
|
41
|
+
|
42
|
+
# Mark the server session as dirty (the default) or clean.
|
43
|
+
#
|
44
|
+
# @param [ true | false ] mark whether the mark the server session
|
45
|
+
# dirty or not.
|
46
|
+
def dirty!(mark = true)
|
47
|
+
@dirty = mark
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -15,6 +15,8 @@
|
|
15
15
|
# See the License for the specific language governing permissions and
|
16
16
|
# limitations under the License.
|
17
17
|
|
18
|
+
require 'mongo/session/server_session/dirtyable'
|
19
|
+
|
18
20
|
module Mongo
|
19
21
|
|
20
22
|
class Session
|
@@ -25,6 +27,7 @@ module Mongo
|
|
25
27
|
#
|
26
28
|
# @since 2.5.0
|
27
29
|
class ServerSession
|
30
|
+
include Dirtyable
|
28
31
|
|
29
32
|
# Regex for removing dashes from the UUID string.
|
30
33
|
#
|
@@ -25,21 +25,6 @@ module Mongo
|
|
25
25
|
#
|
26
26
|
# @since 2.5.0
|
27
27
|
class SessionPool
|
28
|
-
|
29
|
-
# Create a SessionPool.
|
30
|
-
#
|
31
|
-
# @example
|
32
|
-
# SessionPool.create(cluster)
|
33
|
-
#
|
34
|
-
# @param [ Mongo::Cluster ] cluster The cluster that will be associated with this
|
35
|
-
# session pool.
|
36
|
-
#
|
37
|
-
# @since 2.5.0
|
38
|
-
def self.create(cluster)
|
39
|
-
pool = new(cluster)
|
40
|
-
cluster.instance_variable_set(:@session_pool, pool)
|
41
|
-
end
|
42
|
-
|
43
28
|
# Initialize a SessionPool.
|
44
29
|
#
|
45
30
|
# @example
|
@@ -105,9 +90,7 @@ module Mongo
|
|
105
90
|
|
106
91
|
@mutex.synchronize do
|
107
92
|
prune!
|
108
|
-
|
109
|
-
@queue.unshift(session)
|
110
|
-
end
|
93
|
+
@queue.unshift(session) if return_to_queue?(session)
|
111
94
|
end
|
112
95
|
end
|
113
96
|
|
@@ -136,6 +119,17 @@ module Mongo
|
|
136
119
|
|
137
120
|
private
|
138
121
|
|
122
|
+
# Query whether the given session is okay to return to the
|
123
|
+
# pool's queue.
|
124
|
+
#
|
125
|
+
# @param [ Session::ServerSession ] session the session to query
|
126
|
+
#
|
127
|
+
# @return [ true | false ] whether to return the session to the
|
128
|
+
# queue.
|
129
|
+
def return_to_queue?(session)
|
130
|
+
!session.dirty? && !about_to_expire?(session)
|
131
|
+
end
|
132
|
+
|
139
133
|
def about_to_expire?(session)
|
140
134
|
if session.nil?
|
141
135
|
raise ArgumentError, 'session cannot be nil'
|
data/lib/mongo/session.rb
CHANGED
@@ -57,6 +57,12 @@ module Mongo
|
|
57
57
|
#
|
58
58
|
# @option options [ true|false ] :causal_consistency Whether to enable
|
59
59
|
# causal consistency for this session.
|
60
|
+
# @option options [ Integer ] :default_timeout_ms The timeoutMS value for
|
61
|
+
# the following operations executed on the session:
|
62
|
+
# - commitTransaction
|
63
|
+
# - abortTransaction
|
64
|
+
# - withTransaction
|
65
|
+
# - endSession
|
60
66
|
# @option options [ Hash ] :default_transaction_options Options to pass
|
61
67
|
# to start_transaction by default, can contain any of the options that
|
62
68
|
# start_transaction accepts.
|
@@ -96,6 +102,7 @@ module Mongo
|
|
96
102
|
@options = options.dup.freeze
|
97
103
|
@cluster_time = nil
|
98
104
|
@state = NO_TRANSACTION_STATE
|
105
|
+
@with_transaction_deadline = nil
|
99
106
|
end
|
100
107
|
|
101
108
|
# @return [ Hash ] The options for this session.
|
@@ -123,6 +130,23 @@ module Mongo
|
|
123
130
|
# @since 2.5.0
|
124
131
|
attr_reader :operation_time
|
125
132
|
|
133
|
+
# Sets the dirty state to the given value for the underlying server
|
134
|
+
# session. If there is no server session, this does nothing.
|
135
|
+
#
|
136
|
+
# @param [ true | false ] mark whether to mark the server session as
|
137
|
+
# dirty, or not.
|
138
|
+
def dirty!(mark = true)
|
139
|
+
@server_session&.dirty!(mark)
|
140
|
+
end
|
141
|
+
|
142
|
+
# @return [ true | false | nil ] whether the underlying server session is
|
143
|
+
# dirty. If no server session exists for this session, returns nil.
|
144
|
+
#
|
145
|
+
# @api private
|
146
|
+
def dirty?
|
147
|
+
@server_session&.dirty?
|
148
|
+
end
|
149
|
+
|
126
150
|
# @return [ Hash ] The options for the transaction currently being executed
|
127
151
|
# on this session.
|
128
152
|
#
|
@@ -421,9 +445,21 @@ module Mongo
|
|
421
445
|
# progress or if the write concern is unacknowledged.
|
422
446
|
#
|
423
447
|
# @since 2.7.0
|
424
|
-
def with_transaction(options=nil)
|
425
|
-
|
426
|
-
|
448
|
+
def with_transaction(options = nil)
|
449
|
+
if timeout_ms = (options || {})[:timeout_ms]
|
450
|
+
timeout_sec = timeout_ms / 1_000.0
|
451
|
+
deadline = Utils.monotonic_time + timeout_sec
|
452
|
+
@with_transaction_deadline = deadline
|
453
|
+
elsif default_timeout_ms = @options[:default_timeout_ms]
|
454
|
+
timeout_sec = default_timeout_ms / 1_000.0
|
455
|
+
deadline = Utils.monotonic_time + timeout_sec
|
456
|
+
@with_transaction_deadline = deadline
|
457
|
+
elsif @client.timeout_sec
|
458
|
+
deadline = Utils.monotonic_time + @client.timeout_sec
|
459
|
+
@with_transaction_deadline = deadline
|
460
|
+
else
|
461
|
+
deadline = Utils.monotonic_time + 120
|
462
|
+
end
|
427
463
|
transaction_in_progress = false
|
428
464
|
loop do
|
429
465
|
commit_options = {}
|
@@ -437,6 +473,7 @@ module Mongo
|
|
437
473
|
rescue Exception => e
|
438
474
|
if within_states?(STARTING_TRANSACTION_STATE, TRANSACTION_IN_PROGRESS_STATE)
|
439
475
|
log_warn("Aborting transaction due to #{e.class}: #{e}")
|
476
|
+
@with_transaction_deadline = nil
|
440
477
|
abort_transaction
|
441
478
|
transaction_in_progress = false
|
442
479
|
end
|
@@ -464,7 +501,7 @@ module Mongo
|
|
464
501
|
rescue Mongo::Error => e
|
465
502
|
if e.label?('UnknownTransactionCommitResult')
|
466
503
|
if Utils.monotonic_time >= deadline ||
|
467
|
-
e.is_a?(Error::OperationFailure) && e.max_time_ms_expired?
|
504
|
+
e.is_a?(Error::OperationFailure::Family) && e.max_time_ms_expired?
|
468
505
|
then
|
469
506
|
transaction_in_progress = false
|
470
507
|
raise
|
@@ -505,9 +542,10 @@ module Mongo
|
|
505
542
|
log_warn('with_transaction callback broke out of with_transaction loop, aborting transaction')
|
506
543
|
begin
|
507
544
|
abort_transaction
|
508
|
-
rescue Error::OperationFailure, Error::InvalidTransactionOperation
|
545
|
+
rescue Error::OperationFailure::Family, Error::InvalidTransactionOperation
|
509
546
|
end
|
510
547
|
end
|
548
|
+
@with_transaction_deadline = nil
|
511
549
|
end
|
512
550
|
|
513
551
|
# Places subsequent operations in this session into a new transaction.
|
@@ -522,6 +560,7 @@ module Mongo
|
|
522
560
|
#
|
523
561
|
# @option options [ Integer ] :max_commit_time_ms The maximum amount of
|
524
562
|
# time to allow a single commitTransaction command to run, in milliseconds.
|
563
|
+
# This options is deprecated, use :timeout_ms instead.
|
525
564
|
# @option options [ Hash ] :read_concern The read concern options hash,
|
526
565
|
# with the following optional keys:
|
527
566
|
# - *:level* -- the read preference level as a symbol; valid values
|
@@ -532,12 +571,18 @@ module Mongo
|
|
532
571
|
# items:
|
533
572
|
# - *:mode* -- read preference specified as a symbol; the only valid value is
|
534
573
|
# *:primary*.
|
574
|
+
# @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
|
575
|
+
# Must be a non-negative integer. An explicit value of 0 means infinite.
|
576
|
+
# The default value is unset which means the value is inherited from
|
577
|
+
# the client.
|
535
578
|
#
|
536
579
|
# @raise [ Error::InvalidTransactionOperation ] If a transaction is already in
|
537
580
|
# progress or if the write concern is unacknowledged.
|
538
581
|
#
|
539
582
|
# @since 2.6.0
|
540
583
|
def start_transaction(options = nil)
|
584
|
+
check_transactions_supported!
|
585
|
+
|
541
586
|
if options
|
542
587
|
Lint.validate_read_concern_option(options[:read_concern])
|
543
588
|
|
@@ -592,6 +637,10 @@ module Mongo
|
|
592
637
|
#
|
593
638
|
# @option options :write_concern [ nil | WriteConcern::Base ] The write
|
594
639
|
# concern to use for this operation.
|
640
|
+
# @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
|
641
|
+
# Must be a non-negative integer. An explicit value of 0 means infinite.
|
642
|
+
# The default value is unset which means the value is inherited from
|
643
|
+
# the client.
|
595
644
|
#
|
596
645
|
# @raise [ Error::InvalidTransactionOperation ] If there is no active transaction.
|
597
646
|
#
|
@@ -628,7 +677,11 @@ module Mongo
|
|
628
677
|
write_concern = WriteConcern.get(write_concern)
|
629
678
|
end
|
630
679
|
|
631
|
-
context = Operation::Context.new(
|
680
|
+
context = Operation::Context.new(
|
681
|
+
client: @client,
|
682
|
+
session: self,
|
683
|
+
operation_timeouts: operation_timeouts(options)
|
684
|
+
)
|
632
685
|
write_with_retry(write_concern, ending_transaction: true,
|
633
686
|
context: context,
|
634
687
|
) do |connection, txn_num, context|
|
@@ -666,10 +719,15 @@ module Mongo
|
|
666
719
|
# @example Abort the transaction.
|
667
720
|
# session.abort_transaction
|
668
721
|
#
|
722
|
+
# @option options [ Integer ] :timeout_ms The operation timeout in milliseconds.
|
723
|
+
# Must be a non-negative integer. An explicit value of 0 means infinite.
|
724
|
+
# The default value is unset which means the value is inherited from
|
725
|
+
# the client.
|
726
|
+
#
|
669
727
|
# @raise [ Error::InvalidTransactionOperation ] If there is no active transaction.
|
670
728
|
#
|
671
729
|
# @since 2.6.0
|
672
|
-
def abort_transaction
|
730
|
+
def abort_transaction(options = nil)
|
673
731
|
QueryCache.clear
|
674
732
|
|
675
733
|
check_if_ended!
|
@@ -686,10 +744,16 @@ module Mongo
|
|
686
744
|
Mongo::Error::InvalidTransactionOperation.cannot_call_twice_msg(:abortTransaction))
|
687
745
|
end
|
688
746
|
|
747
|
+
options ||= {}
|
748
|
+
|
689
749
|
begin
|
690
750
|
unless starting_transaction?
|
691
751
|
@aborting_transaction = true
|
692
|
-
context = Operation::Context.new(
|
752
|
+
context = Operation::Context.new(
|
753
|
+
client: @client,
|
754
|
+
session: self,
|
755
|
+
operation_timeouts: operation_timeouts(options)
|
756
|
+
)
|
693
757
|
write_with_retry(txn_options[:write_concern],
|
694
758
|
ending_transaction: true, context: context,
|
695
759
|
) do |connection, txn_num, context|
|
@@ -879,7 +943,7 @@ module Mongo
|
|
879
943
|
#
|
880
944
|
# @since 2.6.0
|
881
945
|
# @api private
|
882
|
-
def add_txn_opts!(command, read)
|
946
|
+
def add_txn_opts!(command, read, context)
|
883
947
|
command.tap do |c|
|
884
948
|
# The read concern should be added to any command that starts a transaction.
|
885
949
|
if starting_transaction?
|
@@ -933,6 +997,14 @@ module Mongo
|
|
933
997
|
if c[:writeConcern] && c[:writeConcern][:w] && c[:writeConcern][:w].is_a?(Symbol)
|
934
998
|
c[:writeConcern][:w] = c[:writeConcern][:w].to_s
|
935
999
|
end
|
1000
|
+
|
1001
|
+
# Ignore wtimeout if csot
|
1002
|
+
if context&.csot?
|
1003
|
+
c[:writeConcern]&.delete(:wtimeout)
|
1004
|
+
end
|
1005
|
+
|
1006
|
+
# We must not send an empty (server default) write concern.
|
1007
|
+
c.delete(:writeConcern) if c[:writeConcern]&.empty?
|
936
1008
|
end
|
937
1009
|
end
|
938
1010
|
|
@@ -1119,6 +1191,8 @@ module Mongo
|
|
1119
1191
|
# @api private
|
1120
1192
|
attr_accessor :snapshot_timestamp
|
1121
1193
|
|
1194
|
+
attr_reader :with_transaction_deadline
|
1195
|
+
|
1122
1196
|
private
|
1123
1197
|
|
1124
1198
|
# Get the read concern the session will use when starting a transaction.
|
@@ -1185,5 +1259,32 @@ module Mongo
|
|
1185
1259
|
raise Mongo::Error::InvalidSession.new(MISMATCHED_CLUSTER_ERROR_MSG)
|
1186
1260
|
end
|
1187
1261
|
end
|
1262
|
+
|
1263
|
+
def check_transactions_supported!
|
1264
|
+
raise Mongo::Error::TransactionsNotSupported, "standalone topology" if cluster.single?
|
1265
|
+
|
1266
|
+
cluster.next_primary.with_connection do |conn|
|
1267
|
+
if cluster.replica_set? && !conn.features.transactions_enabled?
|
1268
|
+
raise Mongo::Error::TransactionsNotSupported, "server version is < 4.0"
|
1269
|
+
end
|
1270
|
+
if cluster.sharded? && !conn.features.sharded_transactions_enabled?
|
1271
|
+
raise Mongo::Error::TransactionsNotSupported, "sharded transactions require server version >= 4.2"
|
1272
|
+
end
|
1273
|
+
end
|
1274
|
+
end
|
1275
|
+
|
1276
|
+
def operation_timeouts(opts)
|
1277
|
+
{
|
1278
|
+
inherited_timeout_ms: @client.timeout_ms
|
1279
|
+
}.tap do |result|
|
1280
|
+
if @with_transaction_deadline.nil?
|
1281
|
+
if timeout_ms = opts[:timeout_ms]
|
1282
|
+
result[:operation_timeout_ms] = timeout_ms
|
1283
|
+
elsif default_timeout_ms = options[:default_timeout_ms]
|
1284
|
+
result[:operation_timeout_ms] = default_timeout_ms
|
1285
|
+
end
|
1286
|
+
end
|
1287
|
+
end
|
1288
|
+
end
|
1188
1289
|
end
|
1189
1290
|
end
|