mongo 2.17.2 → 2.18.1
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
- checksums.yaml.gz.sig +0 -0
- data/README.md +21 -37
- data/lib/mongo/auth/base.rb +8 -1
- data/lib/mongo/auth.rb +12 -1
- data/lib/mongo/bulk_write/result.rb +10 -1
- data/lib/mongo/bulk_write/result_combiner.rb +2 -4
- data/lib/mongo/bulk_write.rb +115 -29
- data/lib/mongo/client.rb +133 -17
- data/lib/mongo/client_encryption.rb +113 -10
- data/lib/mongo/cluster/reapers/cursor_reaper.rb +11 -1
- data/lib/mongo/cluster.rb +26 -28
- data/lib/mongo/collection/helpers.rb +43 -0
- data/lib/mongo/collection/queryable_encryption.rb +122 -0
- data/lib/mongo/collection/view/aggregation.rb +22 -16
- data/lib/mongo/collection/view/change_stream.rb +65 -23
- data/lib/mongo/collection/view/explainable.rb +1 -1
- data/lib/mongo/collection/view/iterable.rb +2 -2
- data/lib/mongo/collection/view/map_reduce.rb +18 -9
- data/lib/mongo/collection/view/readable.rb +29 -25
- data/lib/mongo/collection/view/writable.rb +133 -40
- data/lib/mongo/collection.rb +117 -49
- data/lib/mongo/config/options.rb +62 -0
- data/lib/mongo/config/validators/option.rb +26 -0
- data/lib/mongo/config.rb +42 -0
- data/lib/mongo/crypt/auto_encrypter.rb +136 -14
- data/lib/mongo/crypt/binding.rb +513 -144
- data/lib/mongo/crypt/context.rb +5 -2
- data/lib/mongo/crypt/data_key_context.rb +12 -104
- data/lib/mongo/crypt/encryption_io.rb +94 -60
- data/lib/mongo/crypt/explicit_encrypter.rb +143 -26
- data/lib/mongo/crypt/explicit_encryption_context.rb +25 -2
- data/lib/mongo/crypt/handle.rb +160 -86
- data/lib/mongo/crypt/hooks.rb +25 -2
- data/lib/mongo/crypt/kms/aws.rb +136 -0
- data/lib/mongo/crypt/kms/azure.rb +144 -0
- data/lib/mongo/crypt/kms/credentials.rb +81 -0
- data/lib/mongo/crypt/kms/gcp.rb +189 -0
- data/lib/mongo/crypt/kms/kmip.rb +116 -0
- data/lib/mongo/crypt/kms/local.rb +82 -0
- data/lib/mongo/crypt/kms/master_key_document.rb +65 -0
- data/lib/mongo/crypt/kms.rb +117 -0
- data/lib/mongo/crypt/rewrap_many_data_key_context.rb +46 -0
- data/lib/mongo/crypt/rewrap_many_data_key_result.rb +37 -0
- data/lib/mongo/crypt/status.rb +8 -2
- data/lib/mongo/crypt.rb +3 -0
- data/lib/mongo/cursor/kill_spec.rb +27 -6
- data/lib/mongo/cursor.rb +26 -11
- data/lib/mongo/database/view.rb +6 -3
- data/lib/mongo/database.rb +57 -13
- data/lib/mongo/dbref.rb +1 -105
- data/lib/mongo/error/bulk_write_error.rb +31 -4
- data/lib/mongo/error/invalid_config_option.rb +20 -0
- data/lib/mongo/error/invalid_replacement_document.rb +27 -9
- data/lib/mongo/error/invalid_update_document.rb +27 -7
- data/lib/mongo/error/labelable.rb +72 -0
- data/lib/mongo/error/missing_connection.rb +25 -0
- data/lib/mongo/error/missing_file_chunk.rb +8 -2
- data/lib/mongo/error/notable.rb +7 -0
- data/lib/mongo/error/operation_failure.rb +34 -86
- data/lib/mongo/error/read_write_retryable.rb +108 -0
- data/lib/mongo/{operation/kill_cursors/legacy.rb → error/session_not_materialized.rb} +7 -19
- data/lib/mongo/error.rb +5 -37
- data/lib/mongo/grid/stream/read.rb +6 -0
- data/lib/mongo/index/view.rb +23 -7
- data/lib/mongo/monitoring/event/command_failed.rb +8 -2
- data/lib/mongo/monitoring/event/command_started.rb +1 -1
- data/lib/mongo/monitoring/event/command_succeeded.rb +9 -2
- data/lib/mongo/monitoring/publishable.rb +9 -5
- data/lib/mongo/operation/collections_info/result.rb +5 -2
- data/lib/mongo/operation/command/op_msg.rb +6 -0
- data/lib/mongo/operation/context.rb +24 -6
- data/lib/mongo/operation/count/op_msg.rb +4 -1
- data/lib/mongo/operation/create/op_msg.rb +4 -1
- data/lib/mongo/operation/create_index/op_msg.rb +2 -1
- data/lib/mongo/operation/delete/op_msg.rb +1 -0
- data/lib/mongo/operation/delete.rb +0 -1
- data/lib/mongo/operation/distinct/op_msg.rb +4 -1
- data/lib/mongo/operation/drop_index/op_msg.rb +5 -1
- data/lib/mongo/operation/get_more/command_builder.rb +5 -1
- data/lib/mongo/operation/insert/bulk_result.rb +5 -1
- data/lib/mongo/operation/insert/command.rb +0 -4
- data/lib/mongo/operation/insert/op_msg.rb +6 -3
- data/lib/mongo/operation/insert/result.rb +6 -3
- data/lib/mongo/operation/insert.rb +0 -1
- data/lib/mongo/operation/kill_cursors.rb +0 -1
- data/lib/mongo/operation/list_collections/op_msg.rb +4 -1
- data/lib/mongo/operation/map_reduce/result.rb +16 -0
- data/lib/mongo/operation/result.rb +21 -5
- data/lib/mongo/operation/shared/executable.rb +21 -6
- data/lib/mongo/operation/shared/polymorphic_operation.rb +15 -3
- data/lib/mongo/operation/shared/response_handling.rb +6 -5
- data/lib/mongo/operation/shared/sessions_supported.rb +7 -3
- data/lib/mongo/operation/shared/write.rb +18 -12
- data/lib/mongo/operation/update/op_msg.rb +2 -1
- data/lib/mongo/operation/update.rb +0 -1
- data/lib/mongo/protocol/caching_hash.rb +69 -0
- data/lib/mongo/protocol/msg.rb +21 -1
- data/lib/mongo/protocol.rb +1 -0
- data/lib/mongo/query_cache.rb +15 -0
- data/lib/mongo/retryable.rb +78 -30
- data/lib/mongo/server/connection.rb +33 -0
- data/lib/mongo/server/connection_base.rb +2 -0
- data/lib/mongo/server/connection_common.rb +4 -1
- data/lib/mongo/server/connection_pool.rb +74 -46
- data/lib/mongo/server/description/features.rb +3 -1
- data/lib/mongo/server/description.rb +7 -2
- data/lib/mongo/server/monitor/connection.rb +1 -0
- data/lib/mongo/server/monitor.rb +25 -13
- data/lib/mongo/server/push_monitor.rb +13 -3
- data/lib/mongo/server.rb +9 -5
- data/lib/mongo/session/session_pool.rb +8 -0
- data/lib/mongo/session.rb +111 -35
- data/lib/mongo/socket/ocsp_verifier.rb +4 -5
- data/lib/mongo/socket/tcp.rb +3 -0
- data/lib/mongo/srv/resolver.rb +24 -3
- data/lib/mongo/uri/options_mapper.rb +2 -0
- data/lib/mongo/uri/srv_protocol.rb +1 -1
- data/lib/mongo/uri.rb +20 -0
- data/lib/mongo/version.rb +1 -1
- data/lib/mongo.rb +22 -0
- data/mongo.gemspec +10 -4
- data/spec/README.md +23 -5
- data/spec/integration/aws_lambda_examples_spec.rb +68 -0
- data/spec/integration/bulk_write_error_message_spec.rb +32 -0
- data/spec/integration/bulk_write_spec.rb +16 -0
- data/spec/integration/change_stream_spec.rb +6 -5
- data/spec/integration/client_construction_spec.rb +74 -8
- data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +9 -9
- data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +168 -168
- data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +0 -1
- data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +31 -0
- data/spec/integration/client_side_encryption/auto_encryption_spec.rb +108 -1
- data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +2 -2
- data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +2 -2
- data/spec/integration/client_side_encryption/client_close_spec.rb +1 -1
- data/spec/integration/client_side_encryption/corpus_spec.rb +64 -35
- data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +39 -42
- data/spec/integration/client_side_encryption/data_key_spec.rb +97 -7
- data/spec/integration/client_side_encryption/decryption_events_prose_spec.rb +158 -0
- data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +59 -0
- data/spec/integration/client_side_encryption/explicit_queryable_encryption_spec.rb +147 -0
- data/spec/integration/client_side_encryption/external_key_vault_spec.rb +6 -6
- data/spec/integration/client_side_encryption/kms_tls_options_spec.rb +436 -0
- data/spec/integration/client_side_encryption/kms_tls_spec.rb +92 -0
- data/spec/integration/client_side_encryption/queryable_encryption_examples_spec.rb +111 -0
- data/spec/integration/client_side_encryption/unique_index_on_key_alt_names_prose_spec.rb +85 -0
- data/spec/integration/client_side_encryption/views_spec.rb +1 -1
- data/spec/integration/client_update_spec.rb +2 -2
- data/spec/integration/crud_spec.rb +12 -0
- data/spec/integration/cursor_pinning_spec.rb +3 -3
- data/spec/integration/fork_reconnect_spec.rb +15 -8
- data/spec/integration/grid_fs_bucket_spec.rb +3 -3
- data/spec/integration/ocsp_verifier_spec.rb +3 -0
- data/spec/integration/query_cache_spec.rb +34 -30
- data/spec/integration/reconnect_spec.rb +2 -0
- data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +1 -1
- data/spec/integration/server_monitor_spec.rb +2 -1
- data/spec/integration/size_limit_spec.rb +4 -1
- data/spec/integration/snapshot_query_examples_spec.rb +127 -0
- data/spec/integration/srv_monitoring_spec.rb +38 -0
- data/spec/integration/srv_spec.rb +1 -0
- data/spec/integration/step_down_spec.rb +20 -4
- data/spec/integration/transaction_pinning_spec.rb +2 -2
- data/spec/integration/versioned_api_examples_spec.rb +37 -31
- data/spec/lite_spec_helper.rb +19 -9
- data/spec/mongo/address/ipv6_spec.rb +7 -0
- data/spec/mongo/address_spec.rb +7 -0
- data/spec/mongo/auth/scram/conversation_spec.rb +23 -23
- data/spec/mongo/auth/scram256/conversation_spec.rb +20 -20
- data/spec/mongo/auth/scram_negotiation_spec.rb +1 -0
- data/spec/mongo/bulk_write/result_spec.rb +15 -1
- data/spec/mongo/bulk_write_spec.rb +141 -20
- data/spec/mongo/client_construction_spec.rb +186 -9
- data/spec/mongo/client_encryption_spec.rb +10 -22
- data/spec/mongo/client_spec.rb +297 -1
- data/spec/mongo/cluster/cursor_reaper_spec.rb +21 -3
- data/spec/mongo/cluster_spec.rb +0 -44
- data/spec/mongo/collection/view/aggregation_spec.rb +121 -2
- data/spec/mongo/collection/view/change_stream_spec.rb +2 -2
- data/spec/mongo/collection/view/readable_spec.rb +605 -1
- data/spec/mongo/collection/view/writable_spec.rb +144 -32
- data/spec/mongo/collection_crud_spec.rb +63 -13
- data/spec/mongo/collection_spec.rb +32 -0
- data/spec/mongo/config/options_spec.rb +75 -0
- data/spec/mongo/config_spec.rb +73 -0
- data/spec/mongo/crypt/auto_decryption_context_spec.rb +17 -1
- data/spec/mongo/crypt/auto_encrypter_spec.rb +256 -5
- data/spec/mongo/crypt/auto_encryption_context_spec.rb +17 -1
- data/spec/mongo/crypt/binding/context_spec.rb +67 -17
- data/spec/mongo/crypt/binding/mongocrypt_spec.rb +17 -46
- data/spec/mongo/crypt/binding/version_spec.rb +33 -0
- data/spec/mongo/crypt/binding_unloaded_spec.rb +14 -0
- data/spec/mongo/crypt/data_key_context_spec.rb +42 -114
- data/spec/mongo/crypt/encryption_io_spec.rb +2 -0
- data/spec/mongo/crypt/explicit_decryption_context_spec.rb +32 -1
- data/spec/mongo/crypt/explicit_encryption_context_spec.rb +94 -1
- data/spec/mongo/crypt/handle_spec.rb +172 -156
- data/spec/mongo/crypt/hooks_spec.rb +30 -0
- data/spec/mongo/crypt/kms/credentials_spec.rb +357 -0
- data/spec/mongo/crypt/kms_spec.rb +59 -0
- data/spec/mongo/cursor_spec.rb +87 -1
- data/spec/mongo/database_spec.rb +66 -1
- data/spec/mongo/error/operation_failure_heavy_spec.rb +49 -0
- data/spec/mongo/index/view_spec.rb +125 -0
- data/spec/mongo/operation/create/op_msg_spec.rb +244 -0
- data/spec/mongo/operation/delete/op_msg_spec.rb +13 -4
- data/spec/mongo/operation/delete_spec.rb +0 -30
- data/spec/mongo/operation/insert/op_msg_spec.rb +18 -10
- data/spec/mongo/operation/insert_spec.rb +0 -32
- data/spec/mongo/operation/result_spec.rb +20 -0
- data/spec/mongo/operation/update/op_msg_spec.rb +13 -4
- data/spec/mongo/operation/update_spec.rb +0 -29
- data/spec/mongo/protocol/caching_hash_spec.rb +82 -0
- data/spec/mongo/protocol/msg_spec.rb +41 -0
- data/spec/mongo/query_cache_spec.rb +1 -0
- data/spec/mongo/retryable_spec.rb +32 -3
- data/spec/mongo/server/connection_auth_spec.rb +3 -1
- data/spec/mongo/server/connection_common_spec.rb +13 -1
- data/spec/mongo/server/connection_pool_spec.rb +120 -53
- data/spec/mongo/server/connection_spec.rb +50 -159
- data/spec/mongo/server/description/features_spec.rb +24 -0
- data/spec/mongo/server/push_monitor_spec.rb +2 -8
- data/spec/mongo/session_spec.rb +26 -6
- data/spec/mongo/session_transaction_spec.rb +2 -1
- data/spec/mongo/socket/ssl_spec.rb +18 -7
- data/spec/mongo/uri/srv_protocol_spec.rb +101 -2
- data/spec/mongo/uri_spec.rb +25 -0
- data/spec/runners/connection_string.rb +8 -0
- data/spec/runners/crud/operation.rb +12 -3
- data/spec/runners/crud/requirement.rb +9 -4
- data/spec/runners/crud/spec.rb +5 -0
- data/spec/runners/crud/test.rb +1 -1
- data/spec/runners/crud/verifier.rb +6 -0
- data/spec/runners/transactions/spec.rb +2 -2
- data/spec/runners/transactions/test.rb +19 -16
- data/spec/runners/transactions.rb +11 -8
- data/spec/runners/unified/assertions.rb +90 -11
- data/spec/runners/unified/change_stream_operations.rb +12 -0
- data/spec/runners/unified/client_side_encryption_operations.rb +83 -0
- data/spec/runners/unified/crud_operations.rb +67 -4
- data/spec/runners/unified/ddl_operations.rb +45 -0
- data/spec/runners/unified/error.rb +2 -1
- data/spec/runners/unified/grid_fs_operations.rb +21 -0
- data/spec/runners/unified/support_operations.rb +5 -2
- data/spec/runners/unified/test.rb +78 -5
- data/spec/runners/unified.rb +9 -2
- data/spec/shared/lib/mrss/constraints.rb +10 -17
- data/spec/shared/lib/mrss/docker_runner.rb +23 -3
- data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
- data/spec/shared/lib/mrss/event_subscriber.rb +15 -5
- data/spec/shared/lib/mrss/lite_constraints.rb +40 -1
- data/spec/shared/lib/mrss/session_registry.rb +69 -0
- data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
- data/spec/shared/share/Dockerfile.erb +56 -54
- data/spec/shared/shlib/config.sh +27 -0
- data/spec/shared/shlib/distro.sh +2 -1
- data/spec/shared/shlib/server.sh +46 -21
- data/spec/shared/shlib/set_env.sh +43 -5
- data/spec/solo/clean_exit_spec.rb +5 -0
- data/spec/spec_helper.rb +0 -1
- data/spec/spec_tests/client_side_encryption_spec.rb +1 -1
- data/spec/spec_tests/client_side_encryption_unified_spec.rb +16 -0
- data/spec/spec_tests/crud_spec.rb +0 -10
- data/spec/spec_tests/data/change_streams_unified/change-streams-errors.yml +124 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams-pre_and_post_images.yml +351 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams-resume-allowlist.yml +1171 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams-resume-errorLabels.yml +1071 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams-showExpandedEvents.yml +298 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams.yml +859 -4
- data/spec/spec_tests/data/client_side_encryption/aggregate.yml +3 -17
- data/spec/spec_tests/data/client_side_encryption/azureKMS.yml +46 -0
- data/spec/spec_tests/data/client_side_encryption/badQueries.yml +12 -2
- data/spec/spec_tests/data/client_side_encryption/basic.yml +3 -17
- data/spec/spec_tests/data/client_side_encryption/bulk.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/bypassAutoEncryption.yml +2 -2
- data/spec/spec_tests/data/client_side_encryption/count.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/create-and-createIndexes.yml +58 -0
- data/spec/spec_tests/data/client_side_encryption/delete.yml +2 -16
- data/spec/spec_tests/data/client_side_encryption/distinct.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/explain.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/find.yml +2 -16
- data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/fle2-BypassQueryAnalysis.yml +101 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-Compact.yml +80 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-CreateCollection.yml +1263 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-DecryptExistingData.yml +64 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-Delete.yml +107 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-EncryptedFields-vs-EncryptedFieldsMap.yml +80 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-EncryptedFields-vs-jsonSchema.yml +90 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-EncryptedFieldsMap-defaults.yml +57 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-FindOneAndUpdate.yml +213 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-InsertFind-Indexed.yml +86 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-InsertFind-Unindexed.yml +83 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-MissingKey.yml +41 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-NoEncryption.yml +42 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-Update.yml +221 -0
- data/spec/spec_tests/data/client_side_encryption/fle2-validatorAndPartialFieldExpression.yml +168 -0
- data/spec/spec_tests/data/client_side_encryption/gcpKMS.yml +46 -0
- data/spec/spec_tests/data/client_side_encryption/getMore.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/insert.yml +2 -16
- data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/localKMS.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/localSchema.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +2 -0
- data/spec/spec_tests/data/client_side_encryption/missingKey.yml +2 -9
- data/spec/spec_tests/data/client_side_encryption/noSchema.yml +39 -0
- data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/types.yml +44 -70
- data/spec/spec_tests/data/client_side_encryption/unified/addKeyAltName.yml +194 -0
- data/spec/spec_tests/data/client_side_encryption/unified/createDataKey-kms_providers-invalid.yml +67 -0
- data/spec/spec_tests/data/client_side_encryption/unified/createDataKey.yml +309 -0
- data/spec/spec_tests/data/client_side_encryption/unified/deleteKey.yml +159 -0
- data/spec/spec_tests/data/client_side_encryption/unified/getKey.yml +105 -0
- data/spec/spec_tests/data/client_side_encryption/unified/getKeyByAltName.yml +104 -0
- data/spec/spec_tests/data/client_side_encryption/unified/getKeys.yml +122 -0
- data/spec/spec_tests/data/client_side_encryption/unified/removeKeyAltName.yml +157 -0
- data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey-decrypt_failure.yml +69 -0
- data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey-encrypt_failure.yml +122 -0
- data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey.yml +432 -0
- data/spec/spec_tests/data/client_side_encryption/updateMany.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/updateOne.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/validatorAndPartialFieldExpression.yml +166 -0
- data/spec/spec_tests/data/collection_management/clustered-indexes.yml +135 -0
- data/spec/spec_tests/data/collection_management/createCollection-pre_and_post_images.yml +50 -0
- data/spec/spec_tests/data/collection_management/modifyCollection-pre_and_post_images.yml +58 -0
- data/spec/spec_tests/data/command_monitoring_unified/bulkWrite.yml +68 -0
- data/spec/spec_tests/data/command_monitoring_unified/command.yml +50 -0
- data/spec/spec_tests/data/command_monitoring_unified/deleteMany.yml +79 -0
- data/spec/spec_tests/data/command_monitoring_unified/deleteOne.yml +79 -0
- data/spec/spec_tests/data/command_monitoring_unified/find.yml +254 -0
- data/spec/spec_tests/data/command_monitoring_unified/insertMany.yml +79 -0
- data/spec/spec_tests/data/command_monitoring_unified/insertOne.yml +77 -0
- data/spec/spec_tests/data/command_monitoring_unified/pre-42-server-connection-id.yml +56 -0
- data/spec/spec_tests/data/command_monitoring_unified/server-connection-id.yml +56 -0
- data/spec/spec_tests/data/command_monitoring_unified/unacknowledgedBulkWrite.yml +55 -0
- data/spec/spec_tests/data/command_monitoring_unified/updateMany.yml +87 -0
- data/spec/spec_tests/data/command_monitoring_unified/updateOne.yml +118 -0
- data/spec/spec_tests/data/crud/read/aggregate-collation.yml +1 -1
- data/spec/spec_tests/data/crud/read/count-collation.yml +1 -1
- data/spec/spec_tests/data/crud/read/distinct-collation.yml +1 -1
- data/spec/spec_tests/data/crud/read/find-collation.yml +1 -1
- data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +1 -1
- data/spec/spec_tests/data/crud/write/deleteMany-collation.yml +1 -1
- data/spec/spec_tests/data/crud/write/deleteOne-collation.yml +1 -1
- data/spec/spec_tests/data/crud/write/findOneAndDelete-collation.yml +1 -1
- data/spec/spec_tests/data/crud/write/findOneAndReplace-collation.yml +1 -1
- data/spec/spec_tests/data/crud/write/findOneAndUpdate-collation.yml +1 -1
- data/spec/spec_tests/data/crud/write/replaceOne-collation.yml +1 -1
- data/spec/spec_tests/data/crud/write/updateMany-collation.yml +1 -1
- data/spec/spec_tests/data/crud/write/updateOne-collation.yml +1 -1
- data/spec/spec_tests/data/crud_unified/aggregate-allowdiskuse.yml +75 -0
- data/spec/spec_tests/data/crud_unified/aggregate-merge.yml +185 -0
- data/spec/spec_tests/data/crud_unified/aggregate-out-readConcern.yml +171 -0
- data/spec/spec_tests/data/crud_unified/aggregate.yml +215 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-arrayFilters-clientError.yml +98 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-arrayFilters.yml +174 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-comment.yml +189 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint-clientError.yml +113 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint-serverError.yml +142 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint.yml +154 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-deleteMany-hint-unacknowledged.yml +98 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-deleteMany-let.yml +86 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-deleteOne-hint-unacknowledged.yml +97 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-deleteOne-let.yml +86 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-insertOne-dots_and_dollars.yml +138 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-dots_and_dollars.yml +165 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-hint-unacknowledged.yml +103 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-let.yml +93 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint-clientError.yml +148 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint-serverError.yml +239 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint.yml +256 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-update-validation.yml +73 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-dots_and_dollars.yml +150 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-hint-unacknowledged.yml +104 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-let.yml +96 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-dots_and_dollars.yml +150 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-hint-unacknowledged.yml +103 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-let.yml +95 -0
- data/spec/spec_tests/data/crud_unified/countDocuments-comment.yml +92 -0
- data/spec/spec_tests/data/crud_unified/db-aggregate.yml +73 -0
- data/spec/spec_tests/data/crud_unified/deleteMany-comment.yml +97 -0
- data/spec/spec_tests/data/crud_unified/deleteMany-hint-clientError.yml +87 -0
- data/spec/spec_tests/data/crud_unified/deleteMany-hint-serverError.yml +107 -0
- data/spec/spec_tests/data/crud_unified/deleteMany-hint-unacknowledged.yml +90 -0
- data/spec/spec_tests/data/crud_unified/deleteMany-hint.yml +99 -0
- data/spec/spec_tests/data/crud_unified/deleteMany-let.yml +2 -0
- data/spec/spec_tests/data/crud_unified/deleteOne-comment.yml +98 -0
- data/spec/spec_tests/data/crud_unified/deleteOne-hint-clientError.yml +80 -0
- data/spec/spec_tests/data/crud_unified/deleteOne-hint-serverError.yml +100 -0
- data/spec/spec_tests/data/crud_unified/deleteOne-hint-unacknowledged.yml +89 -0
- data/spec/spec_tests/data/crud_unified/deleteOne-hint.yml +95 -0
- data/spec/spec_tests/data/crud_unified/deleteOne-let.yml +2 -0
- data/spec/spec_tests/data/crud_unified/distinct-comment.yml +98 -0
- data/spec/spec_tests/data/crud_unified/estimatedDocumentCount-comment.yml +95 -0
- data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +5 -135
- data/spec/spec_tests/data/crud_unified/find-allowdiskuse-clientError.yml +55 -0
- data/spec/spec_tests/data/crud_unified/find-allowdiskuse-serverError.yml +68 -0
- data/spec/spec_tests/data/crud_unified/find-allowdiskuse.yml +79 -0
- data/spec/spec_tests/data/crud_unified/find-comment.yml +166 -0
- data/spec/spec_tests/data/crud_unified/find.yml +68 -0
- data/spec/spec_tests/data/crud_unified/findOneAndDelete-comment.yml +96 -0
- data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-clientError.yml +91 -0
- data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-serverError.yml +107 -0
- data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-unacknowledged.yml +88 -0
- data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint.yml +102 -0
- data/spec/spec_tests/data/crud_unified/findOneAndDelete-let.yml +2 -4
- data/spec/spec_tests/data/crud_unified/findOneAndReplace-comment.yml +101 -0
- data/spec/spec_tests/data/crud_unified/findOneAndReplace-dots_and_dollars.yml +140 -0
- data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-clientError.yml +83 -0
- data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-serverError.yml +99 -0
- data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-unacknowledged.yml +96 -0
- data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint.yml +98 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-comment.yml +95 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-dots_and_dollars.yml +127 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-clientError.yml +84 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-serverError.yml +100 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-unacknowledged.yml +92 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint.yml +99 -0
- data/spec/spec_tests/data/crud_unified/insertMany-comment.yml +93 -0
- data/spec/spec_tests/data/crud_unified/insertMany-dots_and_dollars.yml +128 -0
- data/spec/spec_tests/data/crud_unified/insertOne-comment.yml +91 -0
- data/spec/spec_tests/data/crud_unified/insertOne-dots_and_dollars.yml +238 -0
- data/spec/spec_tests/data/crud_unified/replaceOne-comment.yml +105 -0
- data/spec/spec_tests/data/crud_unified/replaceOne-dots_and_dollars.yml +180 -0
- data/spec/spec_tests/data/crud_unified/replaceOne-hint-unacknowledged.yml +95 -0
- data/spec/spec_tests/data/crud_unified/replaceOne-hint.yml +108 -0
- data/spec/spec_tests/data/crud_unified/replaceOne-let.yml +98 -0
- data/spec/spec_tests/data/crud_unified/replaceOne-validation.yml +37 -0
- data/spec/spec_tests/data/crud_unified/updateMany-comment.yml +104 -0
- data/spec/spec_tests/data/crud_unified/updateMany-dots_and_dollars.yml +138 -0
- data/spec/spec_tests/data/crud_unified/updateMany-hint-clientError.yml +91 -0
- data/spec/spec_tests/data/crud_unified/updateMany-hint-serverError.yml +115 -0
- data/spec/spec_tests/data/crud_unified/updateMany-hint-unacknowledged.yml +96 -0
- data/spec/spec_tests/data/crud_unified/updateMany-hint.yml +115 -0
- data/spec/spec_tests/data/crud_unified/updateMany-let.yml +5 -1
- data/spec/spec_tests/data/crud_unified/updateMany-validation.yml +39 -0
- data/spec/spec_tests/data/crud_unified/updateOne-comment.yml +104 -0
- data/spec/spec_tests/data/crud_unified/updateOne-dots_and_dollars.yml +138 -0
- data/spec/spec_tests/data/crud_unified/updateOne-hint-clientError.yml +85 -0
- data/spec/spec_tests/data/crud_unified/updateOne-hint-serverError.yml +109 -0
- data/spec/spec_tests/data/crud_unified/updateOne-hint-unacknowledged.yml +95 -0
- data/spec/spec_tests/data/crud_unified/updateOne-hint.yml +109 -0
- data/spec/spec_tests/data/crud_unified/updateOne-let.yml +5 -1
- data/spec/spec_tests/data/crud_unified/updateOne-validation.yml +37 -0
- data/spec/spec_tests/data/crud_unified/updateWithPipelines.yml +8 -14
- data/spec/spec_tests/data/gridfs_unified/delete.yml +198 -0
- data/spec/spec_tests/data/gridfs_unified/download.yml +241 -0
- data/spec/spec_tests/data/gridfs_unified/downloadByName.yml +159 -0
- data/spec/spec_tests/data/gridfs_unified/upload-disableMD5.yml +92 -0
- data/spec/spec_tests/data/gridfs_unified/upload.yml +288 -0
- data/spec/spec_tests/data/retryable_reads/{aggregate-merge.yml → legacy/aggregate-merge.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{aggregate-serverErrors.yml → legacy/aggregate-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{aggregate.yml → legacy/aggregate.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{changeStreams-client.watch-serverErrors.yml → legacy/changeStreams-client.watch-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{changeStreams-client.watch.yml → legacy/changeStreams-client.watch.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{changeStreams-db.coll.watch-serverErrors.yml → legacy/changeStreams-db.coll.watch-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{changeStreams-db.coll.watch.yml → legacy/changeStreams-db.coll.watch.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{changeStreams-db.watch-serverErrors.yml → legacy/changeStreams-db.watch-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{changeStreams-db.watch.yml → legacy/changeStreams-db.watch.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{count-serverErrors.yml → legacy/count-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{count.yml → legacy/count.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{countDocuments-serverErrors.yml → legacy/countDocuments-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{countDocuments.yml → legacy/countDocuments.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{distinct-serverErrors.yml → legacy/distinct-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{distinct.yml → legacy/distinct.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-serverErrors-pre4.9.yml → legacy/estimatedDocumentCount-serverErrors.yml} +0 -2
- data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-pre4.9.yml → legacy/estimatedDocumentCount.yml} +0 -2
- data/spec/spec_tests/data/retryable_reads/{find-serverErrors.yml → legacy/find-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{find.yml → legacy/find.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{findOne-serverErrors.yml → legacy/findOne-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{findOne.yml → legacy/findOne.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{gridfs-download-serverErrors.yml → legacy/gridfs-download-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{gridfs-download.yml → legacy/gridfs-download.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{gridfs-downloadByName-serverErrors.yml → legacy/gridfs-downloadByName-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{gridfs-downloadByName.yml → legacy/gridfs-downloadByName.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{listCollectionNames-serverErrors.yml → legacy/listCollectionNames-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{listCollectionNames.yml → legacy/listCollectionNames.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{listCollectionObjects-serverErrors.yml → legacy/listCollectionObjects-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{listCollectionObjects.yml → legacy/listCollectionObjects.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{listCollections-serverErrors.yml → legacy/listCollections-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{listCollections.yml → legacy/listCollections.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{listDatabaseNames-serverErrors.yml → legacy/listDatabaseNames-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{listDatabaseNames.yml → legacy/listDatabaseNames.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{listDatabaseObjects-serverErrors.yml → legacy/listDatabaseObjects-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{listDatabaseObjects.yml → legacy/listDatabaseObjects.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{listDatabases-serverErrors.yml → legacy/listDatabases-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{listDatabases.yml → legacy/listDatabases.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{listIndexNames-serverErrors.yml → legacy/listIndexNames-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{listIndexNames.yml → legacy/listIndexNames.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{listIndexes-serverErrors.yml → legacy/listIndexes-serverErrors.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{listIndexes.yml → legacy/listIndexes.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/{mapReduce.yml → legacy/mapReduce.yml} +0 -0
- data/spec/spec_tests/data/retryable_reads/unified/handshakeError.yml +129 -0
- data/spec/spec_tests/data/retryable_writes/{bulkWrite-errorLabels.yml → legacy/bulkWrite-errorLabels.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{bulkWrite-serverErrors.yml → legacy/bulkWrite-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_writes/{bulkWrite.yml → legacy/bulkWrite.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{deleteMany.yml → legacy/deleteMany.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{deleteOne-errorLabels.yml → legacy/deleteOne-errorLabels.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{deleteOne-serverErrors.yml → legacy/deleteOne-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_writes/{deleteOne.yml → legacy/deleteOne.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{findOneAndDelete-errorLabels.yml → legacy/findOneAndDelete-errorLabels.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{findOneAndDelete-serverErrors.yml → legacy/findOneAndDelete-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_writes/{findOneAndDelete.yml → legacy/findOneAndDelete.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{findOneAndReplace-errorLabels.yml → legacy/findOneAndReplace-errorLabels.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{findOneAndReplace-serverErrors.yml → legacy/findOneAndReplace-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_writes/{findOneAndReplace.yml → legacy/findOneAndReplace.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate-errorLabels.yml → legacy/findOneAndUpdate-errorLabels.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate-serverErrors.yml → legacy/findOneAndUpdate-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate.yml → legacy/findOneAndUpdate.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{insertMany-errorLabels.yml → legacy/insertMany-errorLabels.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{insertMany-serverErrors.yml → legacy/insertMany-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_writes/{insertMany.yml → legacy/insertMany.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{insertOne-errorLabels.yml → legacy/insertOne-errorLabels.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{insertOne-serverErrors.yml → legacy/insertOne-serverErrors.yml} +5 -5
- data/spec/spec_tests/data/retryable_writes/{insertOne.yml → legacy/insertOne.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{replaceOne-errorLabels.yml → legacy/replaceOne-errorLabels.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{replaceOne-serverErrors.yml → legacy/replaceOne-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_writes/{replaceOne.yml → legacy/replaceOne.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{updateMany.yml → legacy/updateMany.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{updateOne-errorLabels.yml → legacy/updateOne-errorLabels.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/{updateOne-serverErrors.yml → legacy/updateOne-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_writes/{updateOne.yml → legacy/updateOne.yml} +0 -0
- data/spec/spec_tests/data/retryable_writes/unified/bulkWrite-serverErrors.yml +96 -0
- data/spec/spec_tests/data/retryable_writes/unified/handshakeError.yml +137 -0
- data/spec/spec_tests/data/retryable_writes/unified/insertOne-serverErrors.yml +78 -0
- data/spec/spec_tests/data/sdam/errors/prefer-error-code.yml +2 -2
- data/spec/spec_tests/data/sdam_integration/hello-command-error.yml +6 -14
- data/spec/spec_tests/data/sdam_integration/hello-network-error.yml +4 -14
- data/spec/spec_tests/data/sdam_integration/hello-timeout.yml +8 -14
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-no-results.yml +5 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true-txt.yml +5 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true.yml +5 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero-txt.yml +10 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero.yml +10 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srv-service-name.yml +11 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-conflicts_with_replicaSet-txt.yml +5 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-conflicts_with_replicaSet.yml +5 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-equal_to_srv_records.yml +16 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-greater_than_srv_records.yml +15 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-less_than_srv_records.yml +15 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-zero-txt.yml +15 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-zero.yml +15 -0
- data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-equal_to_srv_records.yml +13 -0
- data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-greater_than_srv_records.yml +12 -0
- data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-less_than_srv_records.yml +10 -0
- data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-zero.yml +11 -0
- data/spec/spec_tests/data/server_selection/Unknown/read/ghost.yml +11 -0
- data/spec/spec_tests/data/server_selection/Unknown/write/ghost.yml +11 -0
- data/spec/spec_tests/data/sessions_unified/driver-sessions-server-support.yml +123 -0
- data/spec/spec_tests/data/sessions_unified/snapshot-sessions-not-supported-client-error.yml +9 -3
- data/spec/spec_tests/data/transactions/error-labels.yml +1 -1
- data/spec/spec_tests/data/transactions/errors-client.yml +8 -9
- data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +1 -1
- data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +0 -2
- data/spec/spec_tests/data/transactions/retryable-abort.yml +7 -9
- data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +0 -2
- data/spec/spec_tests/data/transactions/retryable-commit.yml +7 -9
- data/spec/spec_tests/data/transactions/retryable-writes.yml +0 -2
- data/spec/spec_tests/data/transactions_unified/do-not-retry-read-in-transaction.yml +64 -0
- data/spec/spec_tests/data/transactions_unified/retryable-abort-handshake.yml +118 -0
- data/spec/spec_tests/data/transactions_unified/retryable-commit-handshake.yml +118 -0
- data/spec/spec_tests/data/unified/invalid/expectedEventsForClient-ignoreExtraEvents-type.yml +15 -0
- data/spec/spec_tests/data/unified/valid-fail/operation-unsupported.yml +13 -0
- data/spec/spec_tests/data/unified/valid-pass/expectedEventsForClient-ignoreExtraEvents.yml +78 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +4 -1
- data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +3 -3
- data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +3 -2
- data/spec/spec_tests/data/uri_options/srv-options.yml +96 -0
- data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +6 -4
- data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +7 -5
- data/spec/spec_tests/gridfs_unified_spec.rb +13 -0
- data/spec/spec_tests/retryable_reads_spec.rb +4 -1
- data/spec/spec_tests/retryable_reads_unified_spec.rb +22 -0
- data/spec/spec_tests/retryable_writes_spec.rb +4 -1
- data/spec/spec_tests/retryable_writes_unified_spec.rb +21 -0
- data/spec/spec_tests/seed_list_discovery_spec.rb +10 -1
- data/spec/spec_tests/unified_spec.rb +6 -1
- data/spec/stress/connection_pool_timing_spec.rb +3 -2
- data/spec/stress/fork_reconnect_stress_spec.rb +3 -2
- data/spec/support/authorization.rb +1 -1
- data/spec/support/background_thread_registry.rb +3 -13
- data/spec/support/certificates/retrieve-atlas-cert +38 -0
- data/spec/support/cluster_tools.rb +1 -1
- data/spec/support/common_shortcuts.rb +22 -0
- data/spec/support/crypt/corpus/corpus-encrypted.json +9515 -0
- data/spec/support/crypt/corpus/corpus-key-aws.json +32 -32
- data/spec/support/crypt/corpus/corpus-key-azure.json +33 -0
- data/spec/support/crypt/corpus/corpus-key-gcp.json +35 -0
- data/spec/support/crypt/corpus/corpus-key-kmip.json +32 -0
- data/spec/support/crypt/corpus/corpus-key-local.json +30 -30
- data/spec/support/crypt/corpus/corpus-schema.json +4399 -121
- data/spec/support/crypt/corpus/corpus.json +4999 -37
- data/spec/support/crypt/data_keys/key_document_azure.json +33 -0
- data/spec/support/crypt/data_keys/key_document_gcp.json +37 -0
- data/spec/support/crypt/data_keys/key_document_kmip.json +32 -0
- data/spec/support/crypt/encryptedFields.json +33 -0
- data/spec/support/crypt/keys/key1-document.json +30 -0
- data/spec/support/crypt/schema_maps/schema_map_azure.json +17 -0
- data/spec/support/crypt/schema_maps/schema_map_azure_key_alt_names.json +12 -0
- data/spec/support/crypt/schema_maps/schema_map_gcp.json +17 -0
- data/spec/support/crypt/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
- data/spec/support/crypt/schema_maps/schema_map_kmip.json +17 -0
- data/spec/support/crypt/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
- data/spec/support/crypt.rb +258 -13
- data/spec/support/macros.rb +28 -0
- data/spec/support/mongos_macros.rb +17 -0
- data/spec/support/shared/scram_conversation.rb +2 -1
- data/spec/support/shared/session.rb +13 -7
- data/spec/support/spec_config.rb +90 -1
- data/spec/support/utils.rb +25 -4
- data.tar.gz.sig +0 -0
- metadata +604 -290
- metadata.gz.sig +0 -0
- data/lib/mongo/operation/delete/legacy.rb +0 -64
- data/lib/mongo/operation/insert/legacy.rb +0 -68
- data/lib/mongo/operation/update/legacy/result.rb +0 -112
- data/lib/mongo/operation/update/legacy.rb +0 -76
- data/spec/mongo/dbref_spec.rb +0 -152
- data/spec/mongo/operation/kill_cursors_spec.rb +0 -47
- data/spec/spec_tests/change_streams_spec.rb +0 -93
- data/spec/spec_tests/command_monitoring_spec.rb +0 -71
- data/spec/spec_tests/data/change_streams/change-streams-errors.yml +0 -101
- data/spec/spec_tests/data/change_streams/change-streams-resume-allowlist.yml +0 -1173
- data/spec/spec_tests/data/change_streams/change-streams-resume-errorLabels.yml +0 -1105
- data/spec/spec_tests/data/change_streams/change-streams.yml +0 -535
- data/spec/spec_tests/data/command_monitoring/bulkWrite.yml +0 -49
- data/spec/spec_tests/data/command_monitoring/command.yml +0 -61
- data/spec/spec_tests/data/command_monitoring/deleteMany.yml +0 -55
- data/spec/spec_tests/data/command_monitoring/deleteOne.yml +0 -55
- data/spec/spec_tests/data/command_monitoring/find.yml +0 -266
- data/spec/spec_tests/data/command_monitoring/insertMany.yml +0 -75
- data/spec/spec_tests/data/command_monitoring/insertOne.yml +0 -51
- data/spec/spec_tests/data/command_monitoring/unacknowledgedBulkWrite.yml +0 -34
- data/spec/spec_tests/data/command_monitoring/updateMany.yml +0 -65
- data/spec/spec_tests/data/command_monitoring/updateOne.yml +0 -90
- data/spec/spec_tests/data/crud_v2/aggregate-merge.yml +0 -103
- data/spec/spec_tests/data/crud_v2/aggregate-out-readConcern.yml +0 -111
- data/spec/spec_tests/data/crud_v2/bulkWrite-arrayFilters.yml +0 -103
- data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-clientError.yml +0 -63
- data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-serverError.yml +0 -92
- data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint.yml +0 -103
- data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-clientError.yml +0 -90
- data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-serverError.yml +0 -147
- data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint.yml +0 -164
- data/spec/spec_tests/data/crud_v2/db-aggregate.yml +0 -39
- data/spec/spec_tests/data/crud_v2/deleteMany-hint-clientError.yml +0 -43
- data/spec/spec_tests/data/crud_v2/deleteMany-hint-serverError.yml +0 -62
- data/spec/spec_tests/data/crud_v2/deleteMany-hint.yml +0 -58
- data/spec/spec_tests/data/crud_v2/deleteOne-hint-clientError.yml +0 -41
- data/spec/spec_tests/data/crud_v2/deleteOne-hint-serverError.yml +0 -60
- data/spec/spec_tests/data/crud_v2/deleteOne-hint.yml +0 -57
- data/spec/spec_tests/data/crud_v2/find-allowdiskuse-clientError.yml +0 -28
- data/spec/spec_tests/data/crud_v2/find-allowdiskuse-serverError.yml +0 -44
- data/spec/spec_tests/data/crud_v2/find-allowdiskuse.yml +0 -50
- data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-clientError.yml +0 -45
- data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-serverError.yml +0 -60
- data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint.yml +0 -56
- data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-clientError.yml +0 -40
- data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-serverError.yml +0 -59
- data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint.yml +0 -55
- data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-clientError.yml +0 -40
- data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-serverError.yml +0 -58
- data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint.yml +0 -55
- data/spec/spec_tests/data/crud_v2/replaceOne-hint.yml +0 -61
- data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-delete-hint-clientError.yml +0 -60
- data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-update-hint-clientError.yml +0 -88
- data/spec/spec_tests/data/crud_v2/unacknowledged-deleteMany-hint-clientError.yml +0 -40
- data/spec/spec_tests/data/crud_v2/unacknowledged-deleteOne-hint-clientError.yml +0 -38
- data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndDelete-hint-clientError.yml +0 -42
- data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndReplace-hint-clientError.yml +0 -40
- data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndUpdate-hint-clientError.yml +0 -40
- data/spec/spec_tests/data/crud_v2/unacknowledged-replaceOne-hint-clientError.yml +0 -40
- data/spec/spec_tests/data/crud_v2/unacknowledged-updateMany-hint-clientError.yml +0 -43
- data/spec/spec_tests/data/crud_v2/unacknowledged-updateOne-hint-clientError.yml +0 -40
- data/spec/spec_tests/data/crud_v2/updateMany-hint-clientError.yml +0 -45
- data/spec/spec_tests/data/crud_v2/updateMany-hint-serverError.yml +0 -66
- data/spec/spec_tests/data/crud_v2/updateMany-hint.yml +0 -65
- data/spec/spec_tests/data/crud_v2/updateOne-hint-clientError.yml +0 -43
- data/spec/spec_tests/data/crud_v2/updateOne-hint-serverError.yml +0 -62
- data/spec/spec_tests/data/crud_v2/updateOne-hint.yml +0 -61
- data/spec/spec_tests/data/crud_v2/updateWithPipelines.yml +0 -157
- data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +0 -60
- data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +0 -146
- data/spec/support/crypt/corpus/corpus_encrypted.json +0 -4152
- data/spec/support/session_registry.rb +0 -55
|
@@ -27,7 +27,8 @@ module Mongo
|
|
|
27
27
|
include ResponseHandling
|
|
28
28
|
|
|
29
29
|
def do_execute(connection, context, options = {})
|
|
30
|
-
|
|
30
|
+
session&.materialize_if_needed
|
|
31
|
+
unpin_maybe(session, connection) do
|
|
31
32
|
add_error_labels(connection, context) do
|
|
32
33
|
add_server_diagnostics(connection) do
|
|
33
34
|
get_result(connection, context, options).tap do |result|
|
|
@@ -35,12 +36,16 @@ module Mongo
|
|
|
35
36
|
if session.in_transaction? &&
|
|
36
37
|
connection.description.load_balancer?
|
|
37
38
|
then
|
|
38
|
-
if session.
|
|
39
|
-
unless session.
|
|
40
|
-
raise
|
|
39
|
+
if session.pinned_connection_global_id
|
|
40
|
+
unless session.pinned_connection_global_id == connection.global_id
|
|
41
|
+
raise(
|
|
42
|
+
Error::InternalDriverError,
|
|
43
|
+
"Expected operation to use connection #{session.pinned_connection_global_id} but it used #{connection.global_id}"
|
|
44
|
+
)
|
|
41
45
|
end
|
|
42
46
|
else
|
|
43
|
-
session.
|
|
47
|
+
session.pin_to_connection(connection.global_id)
|
|
48
|
+
connection.pin
|
|
44
49
|
end
|
|
45
50
|
end
|
|
46
51
|
|
|
@@ -48,6 +53,16 @@ module Mongo
|
|
|
48
53
|
session.snapshot_timestamp = result.snapshot_timestamp
|
|
49
54
|
end
|
|
50
55
|
end
|
|
56
|
+
|
|
57
|
+
if result.has_cursor_id? &&
|
|
58
|
+
connection.description.load_balancer?
|
|
59
|
+
then
|
|
60
|
+
if result.cursor_id == 0
|
|
61
|
+
connection.unpin
|
|
62
|
+
else
|
|
63
|
+
connection.pin
|
|
64
|
+
end
|
|
65
|
+
end
|
|
51
66
|
process_result(result, connection)
|
|
52
67
|
end
|
|
53
68
|
end
|
|
@@ -82,7 +97,7 @@ module Mongo
|
|
|
82
97
|
message = build_message(connection, context)
|
|
83
98
|
message = message.maybe_encrypt(connection, context)
|
|
84
99
|
reply = connection.dispatch([ message ], context, options)
|
|
85
|
-
[reply, connection.description]
|
|
100
|
+
[reply, connection.description, connection.global_id]
|
|
86
101
|
end
|
|
87
102
|
|
|
88
103
|
# @param [ Mongo::Server::Connection ] connection The connection on which
|
|
@@ -32,11 +32,23 @@ module Mongo
|
|
|
32
32
|
#
|
|
33
33
|
# @return [ Mongo::Operation::Result ] The operation result.
|
|
34
34
|
def execute(server, context:, options: {})
|
|
35
|
-
server.with_connection(
|
|
36
|
-
|
|
37
|
-
operation.execute(connection, context: context, options: options)
|
|
35
|
+
server.with_connection(connection_global_id: context.connection_global_id) do |connection|
|
|
36
|
+
execute_with_connection(connection, context: context, options: options)
|
|
38
37
|
end
|
|
39
38
|
end
|
|
39
|
+
|
|
40
|
+
# Execute the operation.
|
|
41
|
+
#
|
|
42
|
+
# @param [ Mongo::Server::Connection ] connection The connection to send
|
|
43
|
+
# the operation through.
|
|
44
|
+
# @param [ Operation::Context ] context The operation context.
|
|
45
|
+
# @param [ Hash ] options Operation execution options.
|
|
46
|
+
#
|
|
47
|
+
# @return [ Mongo::Operation::Result ] The operation result.
|
|
48
|
+
def execute_with_connection(connection, context:, options: {})
|
|
49
|
+
operation = final_operation(connection)
|
|
50
|
+
operation.execute(connection, context: context, options: options)
|
|
51
|
+
end
|
|
40
52
|
end
|
|
41
53
|
end
|
|
42
54
|
end
|
|
@@ -30,7 +30,7 @@ module Mongo
|
|
|
30
30
|
# the operation is performed.
|
|
31
31
|
# @param [ Mongo::Operation::Context ] context The operation context.
|
|
32
32
|
def validate_result(result, connection, context)
|
|
33
|
-
unpin_maybe(context.session) do
|
|
33
|
+
unpin_maybe(context.session, connection) do
|
|
34
34
|
add_error_labels(connection, context) do
|
|
35
35
|
add_server_diagnostics(connection) do
|
|
36
36
|
result.validate!
|
|
@@ -81,19 +81,20 @@ module Mongo
|
|
|
81
81
|
end
|
|
82
82
|
end
|
|
83
83
|
|
|
84
|
-
# Unpins the session
|
|
85
|
-
# raises errors that are required to unpin the session.
|
|
84
|
+
# Unpins the session and/or the connection if the yielded to block
|
|
85
|
+
# raises errors that are required to unpin the session and the connection.
|
|
86
86
|
#
|
|
87
87
|
# @note This method takes the session as an argument because this module
|
|
88
88
|
# is included in BulkWrite which does not store the session in the
|
|
89
89
|
# receiver (despite Specifiable doing so).
|
|
90
90
|
#
|
|
91
91
|
# @param [ Session | nil ] session Session to consider.
|
|
92
|
-
|
|
92
|
+
# @param [ Connection | nil ] connection Connection to unpin.
|
|
93
|
+
def unpin_maybe(session, connection)
|
|
93
94
|
yield
|
|
94
95
|
rescue Mongo::Error => e
|
|
95
96
|
if session
|
|
96
|
-
session.unpin_maybe(e)
|
|
97
|
+
session.unpin_maybe(e, connection)
|
|
97
98
|
end
|
|
98
99
|
raise
|
|
99
100
|
end
|
|
@@ -257,10 +257,14 @@ module Mongo
|
|
|
257
257
|
super.tap do |message|
|
|
258
258
|
if session = context.session
|
|
259
259
|
# Serialize the message to detect client-side problems,
|
|
260
|
-
# such as invalid BSON keys
|
|
260
|
+
# such as invalid BSON keys or too large messages.
|
|
261
|
+
# The message will be serialized again
|
|
261
262
|
# later prior to being sent to the connection.
|
|
262
|
-
|
|
263
|
-
|
|
263
|
+
buf = BSON::ByteBuffer.new
|
|
264
|
+
message.serialize(buf)
|
|
265
|
+
if buf.length > connection.max_message_size
|
|
266
|
+
raise Error::MaxMessageSize.new(connection.max_message_size)
|
|
267
|
+
end
|
|
264
268
|
session.update_state!
|
|
265
269
|
end
|
|
266
270
|
end
|
|
@@ -35,21 +35,27 @@ module Mongo
|
|
|
35
35
|
#
|
|
36
36
|
# @since 2.5.2
|
|
37
37
|
def execute(server, context:)
|
|
38
|
-
server.with_connection(
|
|
39
|
-
|
|
40
|
-
op = if connection.features.op_msg_enabled?
|
|
41
|
-
self.class::OpMsg.new(spec)
|
|
42
|
-
elsif !acknowledged_write?
|
|
43
|
-
self.class::Legacy.new(spec)
|
|
44
|
-
else
|
|
45
|
-
self.class::Command.new(spec)
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
result = op.execute(connection, context: context)
|
|
49
|
-
validate_result(result, connection, context)
|
|
38
|
+
server.with_connection(connection_global_id: context.connection_global_id) do |connection|
|
|
39
|
+
execute_with_connection(connection, context: context)
|
|
50
40
|
end
|
|
51
41
|
end
|
|
52
42
|
|
|
43
|
+
# Execute the operation.
|
|
44
|
+
#
|
|
45
|
+
# @param [ Mongo::Server::Connection ] connection The connection to send
|
|
46
|
+
# the operation through.
|
|
47
|
+
# @param [ Operation::Context ] context The operation context.
|
|
48
|
+
# @param [ Hash ] options Operation execution options.
|
|
49
|
+
#
|
|
50
|
+
# @return [ Mongo::Operation::Result ] The operation result.
|
|
51
|
+
def execute_with_connection(connection, context:)
|
|
52
|
+
validate!(connection)
|
|
53
|
+
op = self.class::OpMsg.new(spec)
|
|
54
|
+
|
|
55
|
+
result = op.execute(connection, context: context)
|
|
56
|
+
validate_result(result, connection, context)
|
|
57
|
+
end
|
|
58
|
+
|
|
53
59
|
# Execute the bulk write operation.
|
|
54
60
|
#
|
|
55
61
|
# @param [ Mongo::Server::Connection ] connection The connection over
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# encoding: utf-8
|
|
3
|
+
|
|
4
|
+
# Copyright (C) 2014-2022 MongoDB Inc.
|
|
5
|
+
#
|
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
# you may not use this file except in compliance with the License.
|
|
8
|
+
# You may obtain a copy of the License at
|
|
9
|
+
#
|
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
#
|
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
# See the License for the specific language governing permissions and
|
|
16
|
+
# limitations under the License.
|
|
17
|
+
|
|
18
|
+
module Mongo
|
|
19
|
+
module Protocol
|
|
20
|
+
|
|
21
|
+
# A Hash that caches the results of #to_bson.
|
|
22
|
+
#
|
|
23
|
+
# @api private
|
|
24
|
+
class CachingHash
|
|
25
|
+
|
|
26
|
+
def initialize(hash)
|
|
27
|
+
@hash = hash
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def bson_type
|
|
31
|
+
Hash::BSON_TYPE
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Caches the result of to_bson and writes it to the given buffer on subsequent
|
|
35
|
+
# calls to this method. If this method is originally called without validation,
|
|
36
|
+
# and then is subsequently called with validation, we will want to recalculate
|
|
37
|
+
# the to_bson to trigger the validations.
|
|
38
|
+
#
|
|
39
|
+
# @param [ BSON::ByteBuffer ] buffer The encoded BSON buffer to append to.
|
|
40
|
+
# @param [ true, false ] validating_keys Whether keys should be validated when serializing.
|
|
41
|
+
#
|
|
42
|
+
# @return [ BSON::ByteBuffer ] The buffer with the encoded object.
|
|
43
|
+
def to_bson(buffer = BSON::ByteBuffer.new, validating_keys = BSON::Config.validating_keys?)
|
|
44
|
+
if !@bytes
|
|
45
|
+
@bytes = @hash.to_bson(BSON::ByteBuffer.new, validating_keys).to_s
|
|
46
|
+
elsif needs_validation?(validating_keys)
|
|
47
|
+
@validated = true
|
|
48
|
+
return @hash.to_bson(buffer, validating_keys)
|
|
49
|
+
end
|
|
50
|
+
@validated ||= validating_keys
|
|
51
|
+
buffer.put_bytes(@bytes)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
private
|
|
55
|
+
|
|
56
|
+
# Checks the current value for validating keys, and whether or not this
|
|
57
|
+
# bson has been validated in the past, and decides if we need to recalculate
|
|
58
|
+
# the to_bson to check the validations.
|
|
59
|
+
#
|
|
60
|
+
# @param [ true, false ] validating_keys Whether keys should be validated when serializing.
|
|
61
|
+
#
|
|
62
|
+
# @return [ true, false ] Whether or not the bson needs to be recalculated
|
|
63
|
+
# with validation.
|
|
64
|
+
def needs_validation?(validating_keys)
|
|
65
|
+
!@validated && validating_keys
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
data/lib/mongo/protocol/msg.rb
CHANGED
|
@@ -87,7 +87,9 @@ module Mongo
|
|
|
87
87
|
] + @sequences.map do |section|
|
|
88
88
|
{type: 1, payload: {
|
|
89
89
|
identifier: section.identifier,
|
|
90
|
-
sequence: section.documents
|
|
90
|
+
sequence: section.documents.map do |doc|
|
|
91
|
+
CachingHash.new(doc)
|
|
92
|
+
end,
|
|
91
93
|
}}
|
|
92
94
|
end
|
|
93
95
|
@request_id = nil
|
|
@@ -298,6 +300,24 @@ module Mongo
|
|
|
298
300
|
Msg.new(@flags, @options, main_document, *@sequences)
|
|
299
301
|
end
|
|
300
302
|
|
|
303
|
+
# Returns the number of documents returned from the server.
|
|
304
|
+
#
|
|
305
|
+
# The Msg instance must be for a server reply and the reply must return
|
|
306
|
+
# an active cursor (either a newly created one or one whose iteration is
|
|
307
|
+
# continuing via getMore).
|
|
308
|
+
#
|
|
309
|
+
# @return [ Integer ] Number of returned documents.
|
|
310
|
+
def number_returned
|
|
311
|
+
if doc = documents.first
|
|
312
|
+
if cursor = doc['cursor']
|
|
313
|
+
if batch = cursor['firstBatch'] || cursor['nextBatch']
|
|
314
|
+
return batch.length
|
|
315
|
+
end
|
|
316
|
+
end
|
|
317
|
+
end
|
|
318
|
+
raise NotImplementedError, "number_returned is only defined for cursor replies"
|
|
319
|
+
end
|
|
320
|
+
|
|
301
321
|
private
|
|
302
322
|
|
|
303
323
|
# Validate that the documents in this message are all smaller than the
|
data/lib/mongo/protocol.rb
CHANGED
data/lib/mongo/query_cache.rb
CHANGED
|
@@ -280,6 +280,21 @@ module Mongo
|
|
|
280
280
|
ensure
|
|
281
281
|
QueryCache.clear
|
|
282
282
|
end
|
|
283
|
+
|
|
284
|
+
# ActiveJob middleware that activates the query cache for each job.
|
|
285
|
+
module ActiveJob
|
|
286
|
+
def self.included(base)
|
|
287
|
+
base.class_eval do
|
|
288
|
+
around_perform do |_job, block|
|
|
289
|
+
QueryCache.cache do
|
|
290
|
+
block.call
|
|
291
|
+
end
|
|
292
|
+
ensure
|
|
293
|
+
QueryCache.clear
|
|
294
|
+
end
|
|
295
|
+
end
|
|
296
|
+
end
|
|
297
|
+
end
|
|
283
298
|
end
|
|
284
299
|
end
|
|
285
300
|
end
|
data/lib/mongo/retryable.rb
CHANGED
|
@@ -191,25 +191,29 @@ module Mongo
|
|
|
191
191
|
# @note This only retries operations on not master failures, since it is
|
|
192
192
|
# the only case we can be sure a partial write did not already occur.
|
|
193
193
|
#
|
|
194
|
-
# @param [ nil | Session ] session Optional session to use with the operation.
|
|
195
194
|
# @param [ nil | Hash | WriteConcern::Base ] write_concern The write concern.
|
|
196
|
-
# @param [ true | false ] ending_transaction True if the write operation is
|
|
197
|
-
# commitTransaction, false otherwise.
|
|
195
|
+
# @param [ true | false ] ending_transaction True if the write operation is
|
|
196
|
+
# abortTransaction or commitTransaction, false otherwise.
|
|
197
|
+
# @param [ Context ] context The context for the operation.
|
|
198
198
|
# @param [ Proc ] block The block to execute.
|
|
199
199
|
#
|
|
200
|
-
# @yieldparam [
|
|
200
|
+
# @yieldparam [ Connection ] connection The connection through which the
|
|
201
|
+
# write should be sent.
|
|
201
202
|
# @yieldparam [ Integer ] txn_num Transaction number (NOT the ACID kind).
|
|
203
|
+
# @yieldparam [ Operation::Context ] context The operation context.
|
|
202
204
|
#
|
|
203
205
|
# @return [ Result ] The result of the operation.
|
|
204
206
|
#
|
|
205
207
|
# @since 2.1.0
|
|
206
|
-
def write_with_retry(
|
|
208
|
+
def write_with_retry(write_concern, ending_transaction: false, context:, &block)
|
|
209
|
+
session = context.session
|
|
210
|
+
|
|
207
211
|
if ending_transaction && !session
|
|
208
212
|
raise ArgumentError, 'Cannot end a transaction without a session'
|
|
209
213
|
end
|
|
210
214
|
|
|
211
215
|
unless ending_transaction || retry_write_allowed?(session, write_concern)
|
|
212
|
-
return legacy_write_with_retry(nil,
|
|
216
|
+
return legacy_write_with_retry(nil, context: context, &block)
|
|
213
217
|
end
|
|
214
218
|
|
|
215
219
|
# If we are here, session is not nil. A session being nil would have
|
|
@@ -218,23 +222,46 @@ module Mongo
|
|
|
218
222
|
server = select_server(cluster, ServerSelector.primary, session)
|
|
219
223
|
|
|
220
224
|
unless ending_transaction || server.retry_writes?
|
|
221
|
-
return legacy_write_with_retry(server,
|
|
225
|
+
return legacy_write_with_retry(server, context: context, &block)
|
|
222
226
|
end
|
|
223
227
|
|
|
224
|
-
txn_num =
|
|
225
|
-
|
|
226
|
-
else
|
|
227
|
-
session.next_txn_num
|
|
228
|
-
end
|
|
228
|
+
txn_num = nil
|
|
229
|
+
|
|
229
230
|
begin
|
|
230
|
-
|
|
231
|
-
|
|
231
|
+
connection_succeeded = false
|
|
232
|
+
server.with_connection(connection_global_id: context.connection_global_id) do |connection|
|
|
233
|
+
connection_succeeded = true
|
|
234
|
+
|
|
235
|
+
session.materialize_if_needed
|
|
236
|
+
txn_num = if session.in_transaction?
|
|
237
|
+
session.txn_num
|
|
238
|
+
else
|
|
239
|
+
session.next_txn_num
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
# The context needs to be duplicated here because we will be using
|
|
243
|
+
# it later for the retry as well.
|
|
244
|
+
yield(connection, txn_num, context.dup)
|
|
245
|
+
end
|
|
246
|
+
rescue Error::SocketError, Error::SocketTimeoutError, Auth::Unauthorized => e
|
|
232
247
|
e.add_note('modern retry')
|
|
233
248
|
e.add_note("attempt 1")
|
|
234
249
|
if !e.label?('RetryableWriteError')
|
|
235
|
-
|
|
250
|
+
# If we get an auth error, it was raised when connecting the connection
|
|
251
|
+
# and therefore we didn't have the connection yet to add labels.
|
|
252
|
+
# Therefore, check if it is retryable, and if it is, add the label
|
|
253
|
+
# and retry it. We also want to retry this if there was a Socket error
|
|
254
|
+
# when trying to create the connection.
|
|
255
|
+
if !connection_succeeded && !session.in_transaction? && e.write_retryable?
|
|
256
|
+
e.add_label('RetryableWriteError')
|
|
257
|
+
else
|
|
258
|
+
raise e
|
|
259
|
+
end
|
|
236
260
|
end
|
|
237
|
-
|
|
261
|
+
|
|
262
|
+
# Context#with creates a new context, which is not necessary here
|
|
263
|
+
# but the API is less prone to misuse this way.
|
|
264
|
+
retry_write(e, txn_num, context: context.with(is_retry: true), &block)
|
|
238
265
|
rescue Error::OperationFailure => e
|
|
239
266
|
e.add_note('modern retry')
|
|
240
267
|
e.add_note("attempt 1")
|
|
@@ -244,7 +271,9 @@ module Mongo
|
|
|
244
271
|
raise e
|
|
245
272
|
end
|
|
246
273
|
|
|
247
|
-
|
|
274
|
+
# Context#with creates a new context, which is not necessary here
|
|
275
|
+
# but the API is less prone to misuse this way.
|
|
276
|
+
retry_write(e, txn_num, context: context.with(is_retry: true), &block)
|
|
248
277
|
end
|
|
249
278
|
end
|
|
250
279
|
|
|
@@ -258,23 +287,30 @@ module Mongo
|
|
|
258
287
|
# delegates to legacy_write_with_retry which performs write retries using
|
|
259
288
|
# legacy logic.
|
|
260
289
|
#
|
|
261
|
-
# @param [ nil | Session ] session Optional session to use with the operation.
|
|
262
290
|
# @param [ nil | Hash | WriteConcern::Base ] write_concern The write concern.
|
|
291
|
+
# @param [ Context ] context The context for the operation.
|
|
263
292
|
#
|
|
264
|
-
# @yieldparam [
|
|
293
|
+
# @yieldparam [ Connection ] connection The connection through which the
|
|
294
|
+
# write should be sent.
|
|
295
|
+
# @yieldparam [ nil ] txn_num nil as transaction number.
|
|
296
|
+
# @yieldparam [ Operation::Context ] context The operation context.
|
|
265
297
|
#
|
|
266
298
|
# @api private
|
|
267
|
-
def nro_write_with_retry(
|
|
299
|
+
def nro_write_with_retry(write_concern, context:, &block)
|
|
300
|
+
session = context.session
|
|
301
|
+
|
|
302
|
+
server = select_server(cluster, ServerSelector.primary, session)
|
|
268
303
|
if session && session.client.options[:retry_writes]
|
|
269
|
-
server = select_server(cluster, ServerSelector.primary, session)
|
|
270
304
|
begin
|
|
271
|
-
|
|
305
|
+
server.with_connection(connection_global_id: context.connection_global_id) do |connection|
|
|
306
|
+
yield connection, nil, context
|
|
307
|
+
end
|
|
272
308
|
rescue Error::SocketError, Error::SocketTimeoutError, Error::OperationFailure => e
|
|
273
309
|
e.add_note('retries disabled')
|
|
274
310
|
raise e
|
|
275
311
|
end
|
|
276
312
|
else
|
|
277
|
-
legacy_write_with_retry(
|
|
313
|
+
legacy_write_with_retry(server, context: context, &block)
|
|
278
314
|
end
|
|
279
315
|
end
|
|
280
316
|
|
|
@@ -287,12 +323,17 @@ module Mongo
|
|
|
287
323
|
# @param [ Server ] server The server which should be used for the
|
|
288
324
|
# operation. If not provided, the current primary will be retrieved from
|
|
289
325
|
# the cluster.
|
|
290
|
-
# @param [
|
|
326
|
+
# @param [ Context ] context The context for the operation.
|
|
291
327
|
#
|
|
292
|
-
# @yieldparam [
|
|
328
|
+
# @yieldparam [ Connection ] connection The connection through which the
|
|
329
|
+
# write should be sent.
|
|
330
|
+
# @yieldparam [ nil ] txn_num nil as transaction number.
|
|
331
|
+
# @yieldparam [ Operation::Context ] context The operation context.
|
|
293
332
|
#
|
|
294
333
|
# @api private
|
|
295
|
-
def legacy_write_with_retry(server = nil,
|
|
334
|
+
def legacy_write_with_retry(server = nil, context:)
|
|
335
|
+
session = context.session
|
|
336
|
+
|
|
296
337
|
# This is the pre-session retry logic, and is not subject to
|
|
297
338
|
# current retryable write specifications.
|
|
298
339
|
# In particular it does not retry on SocketError and SocketTimeoutError.
|
|
@@ -300,7 +341,10 @@ module Mongo
|
|
|
300
341
|
begin
|
|
301
342
|
attempt += 1
|
|
302
343
|
server ||= select_server(cluster, ServerSelector.primary, session)
|
|
303
|
-
|
|
344
|
+
server.with_connection(connection_global_id: context.connection_global_id) do |connection|
|
|
345
|
+
# Legacy retries do not use txn_num
|
|
346
|
+
yield connection, nil, context.dup
|
|
347
|
+
end
|
|
304
348
|
rescue Error::OperationFailure => e
|
|
305
349
|
e.add_note('legacy retry')
|
|
306
350
|
e.add_note("attempt #{attempt}")
|
|
@@ -331,7 +375,7 @@ module Mongo
|
|
|
331
375
|
raise e
|
|
332
376
|
end
|
|
333
377
|
retry_read(e, server_selector, session, &block)
|
|
334
|
-
rescue Error::OperationFailure => e
|
|
378
|
+
rescue Error::OperationFailure, Auth::Unauthorized => e
|
|
335
379
|
e.add_note('modern retry')
|
|
336
380
|
e.add_note("attempt 1")
|
|
337
381
|
if session.in_transaction? || !e.write_retryable?
|
|
@@ -423,7 +467,9 @@ module Mongo
|
|
|
423
467
|
raise original_error
|
|
424
468
|
end
|
|
425
469
|
|
|
426
|
-
def retry_write(original_error,
|
|
470
|
+
def retry_write(original_error, txn_num, context:, &block)
|
|
471
|
+
session = context.session
|
|
472
|
+
|
|
427
473
|
# We do not request a scan of the cluster here, because error handling
|
|
428
474
|
# for the error which triggered the retry should have updated the
|
|
429
475
|
# server description and/or topology as necessary (specifically,
|
|
@@ -444,7 +490,9 @@ module Mongo
|
|
|
444
490
|
raise Error::RaiseOriginalError
|
|
445
491
|
end
|
|
446
492
|
log_retry(original_error, message: 'Write retry')
|
|
447
|
-
|
|
493
|
+
server.with_connection(connection_global_id: context.connection_global_id) do |connection|
|
|
494
|
+
yield(connection, txn_num, context)
|
|
495
|
+
end
|
|
448
496
|
rescue Error::SocketError, Error::SocketTimeoutError => e
|
|
449
497
|
e.add_note('modern retry')
|
|
450
498
|
e.add_note('attempt 2')
|
|
@@ -24,6 +24,7 @@ module Mongo
|
|
|
24
24
|
class Connection < ConnectionBase
|
|
25
25
|
include Monitoring::Publishable
|
|
26
26
|
include Retryable
|
|
27
|
+
include Id
|
|
27
28
|
extend Forwardable
|
|
28
29
|
|
|
29
30
|
# The ping command.
|
|
@@ -105,6 +106,7 @@ module Mongo
|
|
|
105
106
|
end
|
|
106
107
|
|
|
107
108
|
@id = server.next_connection_id
|
|
109
|
+
@global_id = self.class.next_id
|
|
108
110
|
@monitoring = server.monitoring
|
|
109
111
|
@options = options.freeze
|
|
110
112
|
@server = server
|
|
@@ -112,6 +114,7 @@ module Mongo
|
|
|
112
114
|
@last_checkin = nil
|
|
113
115
|
@auth_mechanism = nil
|
|
114
116
|
@pid = Process.pid
|
|
117
|
+
@pinned = false
|
|
115
118
|
|
|
116
119
|
publish_cmap_event(
|
|
117
120
|
Monitoring::Event::Cmap::ConnectionCreated.new(address, id)
|
|
@@ -129,6 +132,10 @@ module Mongo
|
|
|
129
132
|
# @since 2.9.0
|
|
130
133
|
attr_reader :id
|
|
131
134
|
|
|
135
|
+
# @return [ Integer ] The global ID for the connection. This will be unique
|
|
136
|
+
# across all connections.
|
|
137
|
+
attr_reader :global_id
|
|
138
|
+
|
|
132
139
|
# The connection pool from which this connection was created.
|
|
133
140
|
# May be nil.
|
|
134
141
|
#
|
|
@@ -154,6 +161,32 @@ module Mongo
|
|
|
154
161
|
!!@error
|
|
155
162
|
end
|
|
156
163
|
|
|
164
|
+
# Whether the connection is used by a transaction or cursor operations.
|
|
165
|
+
#
|
|
166
|
+
# Pinned connections should not be disconnected and removed from a
|
|
167
|
+
# connection pool if they are idle or stale.
|
|
168
|
+
#
|
|
169
|
+
# # @return [ true | false ] Whether connection is pinned.
|
|
170
|
+
#
|
|
171
|
+
# @api private
|
|
172
|
+
def pinned?
|
|
173
|
+
@pinned
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
# Mark the connection as pinned.
|
|
177
|
+
#
|
|
178
|
+
# @api private
|
|
179
|
+
def pin
|
|
180
|
+
@pinned = true
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
# Mark the connection as not pinned.
|
|
184
|
+
#
|
|
185
|
+
# @api private
|
|
186
|
+
def unpin
|
|
187
|
+
@pinned = false
|
|
188
|
+
end
|
|
189
|
+
|
|
157
190
|
# Establishes a network connection to the target address.
|
|
158
191
|
#
|
|
159
192
|
# If the connection is already established, this method does nothing.
|
|
@@ -193,6 +193,7 @@ module Mongo
|
|
|
193
193
|
command_failed(nil, address, operation_id, message.payload,
|
|
194
194
|
e.message, total_duration,
|
|
195
195
|
started_event: started_event,
|
|
196
|
+
server_connection_id: description.server_connection_id,
|
|
196
197
|
service_id: description.service_id,
|
|
197
198
|
)
|
|
198
199
|
raise
|
|
@@ -201,6 +202,7 @@ module Mongo
|
|
|
201
202
|
command_completed(result, address, operation_id, message.payload,
|
|
202
203
|
total_duration,
|
|
203
204
|
started_event: started_event,
|
|
205
|
+
server_connection_id: description.server_connection_id,
|
|
204
206
|
service_id: description.service_id,
|
|
205
207
|
)
|
|
206
208
|
end
|
|
@@ -92,7 +92,7 @@ module Mongo
|
|
|
92
92
|
#
|
|
93
93
|
# @api private
|
|
94
94
|
def handshake_command(handshake_document)
|
|
95
|
-
if handshake_document['apiVersion']
|
|
95
|
+
if handshake_document['apiVersion'] || handshake_document['loadBalanced']
|
|
96
96
|
Protocol::Msg.new(
|
|
97
97
|
[], {}, handshake_document.merge({'$db' => Database::ADMIN})
|
|
98
98
|
)
|
|
@@ -163,6 +163,9 @@ module Mongo
|
|
|
163
163
|
if respond_to?(:generation)
|
|
164
164
|
# Non-monitoring connections
|
|
165
165
|
e.generation = generation
|
|
166
|
+
if respond_to?(:global_id)
|
|
167
|
+
e.connection_global_id = global_id
|
|
168
|
+
end
|
|
166
169
|
if respond_to?(:description)
|
|
167
170
|
e.service_id = service_id
|
|
168
171
|
end
|