mongo 2.17.3 → 2.18.0.beta1
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 +108 -28
- data/lib/mongo/client.rb +114 -12
- data/lib/mongo/client_encryption.rb +30 -9
- data/lib/mongo/cluster/reapers/cursor_reaper.rb +11 -1
- data/lib/mongo/cluster.rb +20 -24
- data/lib/mongo/collection/helpers.rb +43 -0
- data/lib/mongo/collection/queryable_encryption.rb +122 -0
- data/lib/mongo/collection/view/aggregation.rb +19 -16
- data/lib/mongo/collection/view/change_stream.rb +56 -23
- data/lib/mongo/collection/view/explainable.rb +1 -1
- data/lib/mongo/collection/view/iterable.rb +2 -3
- data/lib/mongo/collection/view/map_reduce.rb +18 -9
- data/lib/mongo/collection/view/readable.rb +19 -23
- data/lib/mongo/collection/view/writable.rb +133 -40
- data/lib/mongo/collection.rb +108 -48
- data/lib/mongo/config/options.rb +62 -0
- data/lib/mongo/config/validators/option.rb +26 -0
- data/lib/mongo/config.rb +31 -0
- data/lib/mongo/crypt/auto_encrypter.rb +79 -6
- data/lib/mongo/crypt/binding.rb +395 -143
- data/lib/mongo/crypt/context.rb +5 -2
- data/lib/mongo/crypt/data_key_context.rb +7 -104
- data/lib/mongo/crypt/encryption_io.rb +28 -60
- data/lib/mongo/crypt/explicit_encrypter.rb +27 -25
- data/lib/mongo/crypt/explicit_encryption_context.rb +31 -3
- data/lib/mongo/crypt/handle.rb +102 -79
- data/lib/mongo/crypt/hooks.rb +25 -2
- data/lib/mongo/crypt/kms/aws.rb +128 -0
- data/lib/mongo/crypt/kms/azure.rb +136 -0
- data/lib/mongo/crypt/kms/credentials.rb +81 -0
- data/lib/mongo/crypt/kms/gcp.rb +182 -0
- data/lib/mongo/crypt/kms/kmip.rb +110 -0
- data/lib/mongo/crypt/kms/local.rb +74 -0
- data/lib/mongo/crypt/kms/master_key_document.rb +65 -0
- data/lib/mongo/crypt/kms.rb +117 -0
- data/lib/mongo/crypt.rb +1 -0
- data/lib/mongo/cursor/kill_spec.rb +27 -6
- data/lib/mongo/cursor.rb +21 -16
- data/lib/mongo/database/view.rb +6 -3
- data/lib/mongo/database.rb +73 -12
- 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/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/index/view.rb +22 -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 +16 -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/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 +3 -7
- 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 +37 -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 +69 -42
- data/lib/mongo/server/description/features.rb +3 -1
- data/lib/mongo/server/description.rb +7 -2
- data/lib/mongo/server/monitor/connection.rb +5 -10
- data/lib/mongo/server/monitor.rb +21 -13
- data/lib/mongo/server/push_monitor.rb +9 -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 +20 -0
- data/mongo.gemspec +10 -4
- data/spec/README.md +5 -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 +0 -16
- data/spec/integration/change_stream_spec.rb +6 -5
- data/spec/integration/client_construction_spec.rb +1 -1
- 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 +18 -19
- 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/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 +394 -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/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 +1 -0
- data/spec/integration/query_cache_spec.rb +34 -30
- data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +1 -1
- data/spec/integration/sdam_events_spec.rb +0 -40
- 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 +37 -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 +14 -5
- 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 +128 -20
- data/spec/mongo/client_construction_spec.rb +141 -7
- data/spec/mongo/client_encryption_spec.rb +11 -11
- 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 +2 -2
- data/spec/mongo/collection/view/change_stream_spec.rb +2 -2
- data/spec/mongo/collection/view/readable_spec.rb +35 -56
- data/spec/mongo/collection/view/writable_spec.rb +144 -32
- data/spec/mongo/collection_crud_spec.rb +63 -13
- 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 +106 -0
- data/spec/mongo/crypt/auto_encryption_context_spec.rb +17 -1
- data/spec/mongo/crypt/binding/context_spec.rb +99 -17
- data/spec/mongo/crypt/binding/mongocrypt_spec.rb +17 -46
- data/spec/mongo/crypt/binding/version_spec.rb +25 -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 +89 -1
- data/spec/mongo/crypt/handle_spec.rb +47 -169
- data/spec/mongo/crypt/hooks_spec.rb +30 -0
- data/spec/mongo/crypt/kms/credentials_spec.rb +404 -0
- data/spec/mongo/crypt/kms_spec.rb +59 -0
- data/spec/mongo/cursor_spec.rb +37 -51
- 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 +69 -0
- data/spec/mongo/operation/create/op_msg_spec.rb +286 -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 +94 -49
- 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 +15 -4
- 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 +3 -3
- data/spec/runners/crud/spec.rb +5 -0
- data/spec/runners/crud/verifier.rb +6 -0
- data/spec/runners/transactions/test.rb +33 -14
- data/spec/runners/transactions.rb +9 -6
- data/spec/runners/unified/assertions.rb +59 -10
- data/spec/runners/unified/change_stream_operations.rb +9 -0
- data/spec/runners/unified/crud_operations.rb +50 -2
- data/spec/runners/unified/ddl_operations.rb +20 -0
- data/spec/runners/unified/error.rb +2 -1
- data/spec/runners/unified/support_operations.rb +5 -2
- data/spec/runners/unified/test.rb +19 -4
- data/spec/runners/unified.rb +9 -2
- data/spec/shared/lib/mrss/constraints.rb +10 -17
- data/spec/shared/lib/mrss/docker_runner.rb +21 -3
- data/spec/shared/lib/mrss/lite_constraints.rb +32 -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 +40 -5
- data/spec/spec_helper.rb +0 -1
- 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 +1068 -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/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/updateMany.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/updateOne.yml +1 -8
- 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/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/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/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/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/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/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/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 +2 -1
- data/spec/stress/fork_reconnect_stress_spec.rb +3 -2
- data/spec/support/authorization.rb +1 -1
- data/spec/support/certificates/atlas-ocsp-ca.crt +47 -40
- data/spec/support/certificates/atlas-ocsp.crt +106 -101
- 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 +207 -6
- data/spec/support/macros.rb +18 -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 +82 -1
- data/spec/support/utils.rb +25 -4
- data.tar.gz.sig +0 -0
- metadata +1468 -1214
- 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/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/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
@@ -31,13 +31,24 @@ module Mongo
|
|
31
31
|
# @option options [ String ] :key_vault_namespace The name of the
|
32
32
|
# key vault collection in the format "database.collection".
|
33
33
|
# @option options [ Hash ] :kms_providers A hash of key management service
|
34
|
-
# configuration information.
|
35
|
-
#
|
34
|
+
# configuration information.
|
35
|
+
# @see Mongo::Crypt::KMS::Credentials for list of options for every
|
36
|
+
# supported provider.
|
37
|
+
# @note There may be more than one KMS provider specified.
|
38
|
+
# @option options [ Hash ] :kms_tls_options TLS options to connect to KMS
|
39
|
+
# providers. Keys of the hash should be KSM provider names; values
|
40
|
+
# should be hashes of TLS connection options. The options are equivalent
|
41
|
+
# to TLS connection options of Mongo::Client.
|
42
|
+
# @see Mongo::Client#initialize for list of TLS options.
|
43
|
+
#
|
44
|
+
# @raise [ ArgumentError ] If required options are missing or incorrectly
|
45
|
+
# formatted.
|
36
46
|
def initialize(key_vault_client, options={})
|
37
47
|
@encrypter = Crypt::ExplicitEncrypter.new(
|
38
48
|
key_vault_client,
|
39
49
|
options[:key_vault_namespace],
|
40
|
-
options[:kms_providers]
|
50
|
+
Crypt::KMS::Credentials.new(options[:kms_providers]),
|
51
|
+
Crypt::KMS::Validations.validate_tls_options(options[:kms_tls_options])
|
41
52
|
)
|
42
53
|
end
|
43
54
|
|
@@ -64,10 +75,9 @@ module Mongo
|
|
64
75
|
# @return [ BSON::Binary ] The 16-byte UUID of the new data key as a
|
65
76
|
# BSON::Binary object with type :uuid.
|
66
77
|
def create_data_key(kms_provider, options={})
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
)
|
78
|
+
key_document = Crypt::KMS::MasterKeyDocument.new(kms_provider, options)
|
79
|
+
key_alt_names = options[:key_alt_names]
|
80
|
+
@encrypter.create_and_insert_data_key(key_document, key_alt_names)
|
71
81
|
end
|
72
82
|
|
73
83
|
# Encrypts a value using the specified encryption key and algorithm.
|
@@ -81,14 +91,25 @@ module Mongo
|
|
81
91
|
# @option options [ String ] :key_alt_name The alternate name for the
|
82
92
|
# encryption key.
|
83
93
|
# @option options [ String ] :algorithm The algorithm used to encrypt the value.
|
84
|
-
# Valid algorithms are "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"
|
85
|
-
#
|
94
|
+
# Valid algorithms are "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic",
|
95
|
+
# "AEAD_AES_256_CBC_HMAC_SHA_512-Random", "Indexed", "Unindexed".
|
96
|
+
# @option options [ Integer | nil ] :contention_factor Contention factor
|
97
|
+
# to be applied if encryption algorithm is set to "Indexed". If not
|
98
|
+
# provided, it defaults to a value of 0. Contention factor should be set
|
99
|
+
# only if encryption algorithm is set to "Indexed".
|
100
|
+
# @option options [ Symbol ] query_type Query type to be applied
|
101
|
+
# if encryption algorithm is set to "Indexed". Query type should be set
|
102
|
+
# only if encryption algorithm is set to "Indexed". The only allowed
|
103
|
+
# value is :equality.
|
86
104
|
#
|
87
105
|
# @note The :key_id and :key_alt_name options are mutually exclusive. Only
|
88
106
|
# one is required to perform explicit encryption.
|
89
107
|
#
|
90
108
|
# @return [ BSON::Binary ] A BSON Binary object of subtype 6 (ciphertext)
|
91
109
|
# representing the encrypted value.
|
110
|
+
#
|
111
|
+
# @raise [ ArgumentError ] if either contention_factor or query_type
|
112
|
+
# is set, and algorithm is not "Indexed".
|
92
113
|
def encrypt(value, options={})
|
93
114
|
@encrypter.encrypt(value, options)
|
94
115
|
end
|
@@ -192,9 +192,19 @@ module Mongo
|
|
192
192
|
|
193
193
|
options = {
|
194
194
|
server_api: server.options[:server_api],
|
195
|
-
|
195
|
+
connection_global_id: kill_spec.connection_global_id,
|
196
196
|
}
|
197
197
|
op.execute(server, context: Operation::Context.new(options: options))
|
198
|
+
|
199
|
+
if session = kill_spec.session
|
200
|
+
if session.ended?
|
201
|
+
if Lint.enabled?
|
202
|
+
raise Error::LintError, "Ended session for a garbage collected cursor"
|
203
|
+
end
|
204
|
+
elsif session.implicit?
|
205
|
+
session.end_session
|
206
|
+
end
|
207
|
+
end
|
198
208
|
end
|
199
209
|
end
|
200
210
|
alias :execute :kill_cursors
|
data/lib/mongo/cluster.rb
CHANGED
@@ -937,11 +937,21 @@ module Mongo
|
|
937
937
|
# is connected to does not support sessions.
|
938
938
|
#
|
939
939
|
# Session support may change over time, for example due to servers in the
|
940
|
-
# deployment being upgraded or downgraded.
|
941
|
-
#
|
942
|
-
#
|
943
|
-
#
|
944
|
-
#
|
940
|
+
# deployment being upgraded or downgraded. If the client isn't connected to
|
941
|
+
# any servers and doesn't find any servers
|
942
|
+
# for the duration of server selection timeout, this method will raise
|
943
|
+
# NoServerAvailable. This method is called from the operation execution flow,
|
944
|
+
# and if it raises NoServerAvailable the entire operation will fail
|
945
|
+
# with that exception, since the operation execution has waited for
|
946
|
+
# the server selection timeout for any server to become available
|
947
|
+
# (which would be a superset of the servers suitable for the operation being
|
948
|
+
# attempted) and none materialized.
|
949
|
+
#
|
950
|
+
# @raise [ Error::SessionsNotAvailable ] If the deployment that the driver
|
951
|
+
# is connected to does not support sessions.
|
952
|
+
# @raise [ Error::NoServerAvailable ] If the client isn't connected to
|
953
|
+
# any servers and doesn't find any servers for the duration of
|
954
|
+
# server selection timeout.
|
945
955
|
#
|
946
956
|
# @api private
|
947
957
|
def validate_session_support!
|
@@ -962,25 +972,11 @@ module Mongo
|
|
962
972
|
# No data bearing servers known - perform server selection to try to
|
963
973
|
# get a response from at least one of them, to return an accurate
|
964
974
|
# assessment of whether sessions are currently supported.
|
965
|
-
|
966
|
-
|
967
|
-
@
|
968
|
-
|
969
|
-
|
970
|
-
raise_sessions_not_supported
|
971
|
-
end
|
972
|
-
end
|
973
|
-
end
|
974
|
-
rescue Error::NoServerAvailable
|
975
|
-
# We haven't been able to contact any servers - use last known
|
976
|
-
# value for session support.
|
977
|
-
@state_change_lock.synchronize do
|
978
|
-
@sdam_flow_lock.synchronize do
|
979
|
-
@update_lock.synchronize do
|
980
|
-
unless @sessions_supported
|
981
|
-
raise_sessions_not_supported
|
982
|
-
end
|
983
|
-
end
|
975
|
+
ServerSelector.get(mode: :primary_preferred).select_server(self)
|
976
|
+
@state_change_lock.synchronize do
|
977
|
+
@sdam_flow_lock.synchronize do
|
978
|
+
unless topology.logical_session_timeout
|
979
|
+
raise_sessions_not_supported
|
984
980
|
end
|
985
981
|
end
|
986
982
|
end
|
@@ -0,0 +1,43 @@
|
|
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
|
+
class Collection
|
20
|
+
# This module contains helper methods collection class.
|
21
|
+
#
|
22
|
+
# @api private
|
23
|
+
module Helpers
|
24
|
+
# Executes drop operation and and ignores NamespaceNotFound error.
|
25
|
+
#
|
26
|
+
# @param [ Operation::Drop ] operation Drop operation to be executed.
|
27
|
+
# @param [ Session ] session Session to be use for execution.
|
28
|
+
# @param [ Operation::Context ] context Context to use for execution.
|
29
|
+
#
|
30
|
+
# @return [ Result ] The result of the execution.
|
31
|
+
def do_drop(operation, session, context)
|
32
|
+
operation.execute(next_primary(nil, session), context: context)
|
33
|
+
rescue Error::OperationFailure => ex
|
34
|
+
# NamespaceNotFound
|
35
|
+
if ex.code == 26 || ex.code.nil? && ex.message =~ /ns not found/
|
36
|
+
false
|
37
|
+
else
|
38
|
+
raise
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,122 @@
|
|
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
|
+
class Collection
|
20
|
+
# This module contains methods for creating and dropping auxiliary collections
|
21
|
+
# for queryable encryption.
|
22
|
+
#
|
23
|
+
# @api private
|
24
|
+
module QueryableEncryption
|
25
|
+
|
26
|
+
# Creates auxiliary collections and indices for queryable encryption if necessary.
|
27
|
+
#
|
28
|
+
# @param [ Hash | nil ] encrypted_fields Encrypted fields hash that was
|
29
|
+
# provided to `create` collection helper.
|
30
|
+
# @param [ Client ] client Mongo client to be used to create auxiliary collections.
|
31
|
+
# @param [ Session ] session Session to be used to create auxiliary collections.
|
32
|
+
#
|
33
|
+
# @return [ Result ] The result of provided block.
|
34
|
+
def maybe_create_qe_collections(encrypted_fields, client, session)
|
35
|
+
encrypted_fields = if encrypted_fields
|
36
|
+
encrypted_fields
|
37
|
+
elsif encrypted_fields_map
|
38
|
+
encrypted_fields_map[namespace] || {}
|
39
|
+
else
|
40
|
+
{}
|
41
|
+
end
|
42
|
+
if encrypted_fields.empty?
|
43
|
+
return yield
|
44
|
+
end
|
45
|
+
|
46
|
+
emm_collections(encrypted_fields).each do |coll|
|
47
|
+
context = Operation::Context.new(client: client, session: session)
|
48
|
+
Operation::Create.new(
|
49
|
+
selector: {
|
50
|
+
create: coll,
|
51
|
+
clusteredIndex: {
|
52
|
+
key: {
|
53
|
+
_id: 1
|
54
|
+
},
|
55
|
+
unique: true
|
56
|
+
}
|
57
|
+
},
|
58
|
+
db_name: database.name,
|
59
|
+
).execute(next_primary(nil, session), context: context)
|
60
|
+
end
|
61
|
+
yield(encrypted_fields).tap do |result|
|
62
|
+
indexes.create_one(__safeContent__: 1) if result
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# Drops auxiliary collections and indices for queryable encryption if necessary.
|
67
|
+
#
|
68
|
+
# @param [ Hash | nil ] encrypted_fields Encrypted fields hash that was
|
69
|
+
# provided to `create` collection helper.
|
70
|
+
# @param [ Client ] client Mongo client to be used to drop auxiliary collections.
|
71
|
+
# @param [ Session ] session Session to be used to drop auxiliary collections.
|
72
|
+
#
|
73
|
+
# @return [ Result ] The result of provided block.
|
74
|
+
def maybe_drop_emm_collections(encrypted_fields, client, session)
|
75
|
+
encrypted_fields = if encrypted_fields
|
76
|
+
encrypted_fields
|
77
|
+
elsif encrypted_fields_map
|
78
|
+
if encrypted_fields_map[namespace]
|
79
|
+
encrypted_fields_map[namespace]
|
80
|
+
else
|
81
|
+
database.list_collections(filter: { name: name })
|
82
|
+
.first
|
83
|
+
&.fetch(:options, {})
|
84
|
+
&.fetch(:encryptedFields, {}) || {}
|
85
|
+
end
|
86
|
+
else
|
87
|
+
{}
|
88
|
+
end
|
89
|
+
if encrypted_fields.empty?
|
90
|
+
return yield
|
91
|
+
end
|
92
|
+
emm_collections(encrypted_fields).each do |coll|
|
93
|
+
context = Operation::Context.new(client: client, session: session)
|
94
|
+
operation = Operation::Drop.new(
|
95
|
+
selector: { drop: coll },
|
96
|
+
db_name: database.name,
|
97
|
+
session: session,
|
98
|
+
)
|
99
|
+
do_drop(operation, session, context)
|
100
|
+
end
|
101
|
+
yield
|
102
|
+
end
|
103
|
+
|
104
|
+
private
|
105
|
+
|
106
|
+
# Checks if names for auxiliary collections are set and returns them,
|
107
|
+
# otherwise returns default names.
|
108
|
+
#
|
109
|
+
# @param [ Hash ] encrypted_fields Encrypted fields hash.
|
110
|
+
#
|
111
|
+
# @return [ Array <String> ] Array of auxiliary collections names.
|
112
|
+
def emm_collections(encrypted_fields)
|
113
|
+
[
|
114
|
+
encrypted_fields['escCollection'] || "enxcol_.#{name}.esc",
|
115
|
+
encrypted_fields['eccCollection'] || "enxcol_.#{name}.ecc",
|
116
|
+
encrypted_fields['ecocCollection'] || "enxcol_.#{name}.ecoc",
|
117
|
+
]
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
@@ -80,7 +80,8 @@ module Mongo
|
|
80
80
|
# @option options [ true, false ] :bypass_document_validation Whether or
|
81
81
|
# not to skip document level validation.
|
82
82
|
# @option options [ Hash ] :collation The collation to use.
|
83
|
-
# @option options [
|
83
|
+
# @option options [ Object ] :comment A user-provided
|
84
|
+
# comment to attach to this command.
|
84
85
|
# @option options [ String ] :hint The index to use for the aggregation.
|
85
86
|
# @option options [ Hash ] :let Mapping of variables to use in the pipeline.
|
86
87
|
# See the server documentation for details.
|
@@ -127,7 +128,7 @@ module Mongo
|
|
127
128
|
@view.send(:server_selector)
|
128
129
|
end
|
129
130
|
|
130
|
-
def aggregate_spec(
|
131
|
+
def aggregate_spec(session, read_preference)
|
131
132
|
Builder::Aggregation.new(
|
132
133
|
pipeline,
|
133
134
|
view,
|
@@ -139,34 +140,35 @@ module Mongo
|
|
139
140
|
Aggregation.new(view, pipeline, options)
|
140
141
|
end
|
141
142
|
|
142
|
-
def initial_query_op(
|
143
|
-
Operation::Aggregate.new(aggregate_spec(
|
143
|
+
def initial_query_op(session, read_preference)
|
144
|
+
Operation::Aggregate.new(aggregate_spec(session, read_preference))
|
144
145
|
end
|
145
146
|
|
146
147
|
# Return effective read preference for the operation.
|
147
148
|
#
|
148
149
|
# If the pipeline contains $merge or $out, and read preference specified
|
149
|
-
# by user is secondary or secondary_preferred, and
|
150
|
+
# by user is secondary or secondary_preferred, and target server is below
|
150
151
|
# 5.0, than this method returns primary read preference, because the
|
151
152
|
# aggregation will be routed to primary. Otherwise return the original
|
152
153
|
# read preference.
|
153
154
|
#
|
154
155
|
# See https://github.com/mongodb/specifications/blob/master/source/crud/crud.rst#read-preferences-and-server-selection
|
155
156
|
#
|
156
|
-
# @param [ Server ]
|
157
|
-
#
|
157
|
+
# @param [ Server::Connection ] connection The connection which
|
158
|
+
# will be used for the operation.
|
158
159
|
# @return [ Hash | nil ] read preference hash that should be sent with
|
159
160
|
# this command.
|
160
|
-
def effective_read_preference(
|
161
|
+
def effective_read_preference(connection)
|
161
162
|
return unless view.read_preference
|
162
163
|
return view.read_preference unless write?
|
163
164
|
return view.read_preference unless [:secondary, :secondary_preferred].include?(view.read_preference[:mode])
|
164
165
|
|
165
166
|
primary_read_preference = {mode: :primary}
|
166
|
-
|
167
|
+
description = connection.description
|
168
|
+
if description.primary?
|
167
169
|
log_warn("Routing the Aggregation operation to the primary server")
|
168
170
|
primary_read_preference
|
169
|
-
elsif
|
171
|
+
elsif description.mongos? && !description.features.merge_out_on_secondary_enabled?
|
170
172
|
log_warn("Routing the Aggregation operation to the primary server")
|
171
173
|
primary_read_preference
|
172
174
|
else
|
@@ -176,14 +178,15 @@ module Mongo
|
|
176
178
|
end
|
177
179
|
|
178
180
|
def send_initial_query(server, session)
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
181
|
+
server.with_connection do |connection|
|
182
|
+
initial_query_op(
|
183
|
+
session,
|
184
|
+
effective_read_preference(connection)
|
185
|
+
).execute_with_connection(
|
186
|
+
connection,
|
185
187
|
context: Operation::Context.new(client: client, session: session)
|
186
188
|
)
|
189
|
+
end
|
187
190
|
end
|
188
191
|
|
189
192
|
# Skip, sort, limit, projection are specified as pipeline stages
|
@@ -70,10 +70,35 @@ module Mongo
|
|
70
70
|
# @param [ Array<Hash> ] pipeline The pipeline of operators to filter the change notifications.
|
71
71
|
# @param [ Hash ] options The change stream options.
|
72
72
|
#
|
73
|
-
# @option options [ String ] :full_document Allowed values:
|
74
|
-
#
|
75
|
-
#
|
76
|
-
#
|
73
|
+
# @option options [ String ] :full_document Allowed values: nil, 'default',
|
74
|
+
# 'updateLookup', 'whenAvailable', 'required'.
|
75
|
+
#
|
76
|
+
# The default is to not send a value (i.e. nil), which is equivalent to
|
77
|
+
# 'default'. By default, the change notification for partial updates will
|
78
|
+
# include a delta describing the changes to the document.
|
79
|
+
#
|
80
|
+
# When set to 'updateLookup', the change notification for partial updates
|
81
|
+
# will include both a delta describing the changes to the document as well
|
82
|
+
# as a copy of the entire document that was changed from some time after
|
83
|
+
# the change occurred.
|
84
|
+
#
|
85
|
+
# When set to 'whenAvailable', configures the change stream to return the
|
86
|
+
# post-image of the modified document for replace and update change events
|
87
|
+
# if the post-image for this event is available.
|
88
|
+
#
|
89
|
+
# When set to 'required', the same behavior as 'whenAvailable' except that
|
90
|
+
# an error is raised if the post-image is not available.
|
91
|
+
# @option options [ String ] :full_document_before_change Allowed values: nil,
|
92
|
+
# 'whenAvailable', 'required', 'off'.
|
93
|
+
#
|
94
|
+
# The default is to not send a value (i.e. nil), which is equivalent to 'off'.
|
95
|
+
#
|
96
|
+
# When set to 'whenAvailable', configures the change stream to return the
|
97
|
+
# pre-image of the modified document for replace, update, and delete change
|
98
|
+
# events if it is available.
|
99
|
+
#
|
100
|
+
# When set to 'required', the same behavior as 'whenAvailable' except that
|
101
|
+
# an error is raised if the pre-image is not available.
|
77
102
|
# @option options [ BSON::Document, Hash ] :resume_after Specifies the logical starting point for the
|
78
103
|
# new change stream.
|
79
104
|
# @option options [ Integer ] :max_await_time_ms The maximum amount of time for the server to wait
|
@@ -88,6 +113,8 @@ module Mongo
|
|
88
113
|
# option takes a resume token and starts a new change stream returning the first
|
89
114
|
# notification after the token. This will allow users to watch collections that have been
|
90
115
|
# dropped and recreated or newly renamed collections without missing any notifications.
|
116
|
+
# @option options [ Object ] :comment A user-provided
|
117
|
+
# comment to attach to this command.
|
91
118
|
#
|
92
119
|
# The server will report an error if `startAfter` and `resumeAfter` are both specified.
|
93
120
|
#
|
@@ -275,20 +302,22 @@ module Mongo
|
|
275
302
|
start_at_operation_time = nil
|
276
303
|
start_at_operation_time_supported = nil
|
277
304
|
@cursor = read_with_retry_cursor(session, server_selector, view) do |server|
|
278
|
-
|
305
|
+
server.with_connection do |connection|
|
306
|
+
start_at_operation_time_supported = connection.description.server_version_gte?('4.0')
|
279
307
|
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
308
|
+
result = send_initial_query(connection, session)
|
309
|
+
if doc = result.replies.first && result.replies.first.documents.first
|
310
|
+
start_at_operation_time = doc['operationTime']
|
311
|
+
else
|
312
|
+
# The above may set @start_at_operation_time to nil
|
313
|
+
# if it was not in the document for some reason,
|
314
|
+
# for consistency set it to nil here as well.
|
315
|
+
# NB: since this block may be executed more than once, each
|
316
|
+
# execution must write to start_at_operation_time either way.
|
317
|
+
start_at_operation_time = nil
|
318
|
+
end
|
319
|
+
result
|
290
320
|
end
|
291
|
-
result
|
292
321
|
end
|
293
322
|
@start_at_operation_time = start_at_operation_time
|
294
323
|
@start_at_operation_time_supported = start_at_operation_time_supported
|
@@ -298,8 +327,8 @@ module Mongo
|
|
298
327
|
[{ '$changeStream' => change_doc }] + @change_stream_filters
|
299
328
|
end
|
300
329
|
|
301
|
-
def aggregate_spec(
|
302
|
-
super(
|
330
|
+
def aggregate_spec(session, read_preference)
|
331
|
+
super(session, read_preference).tap do |spec|
|
303
332
|
spec[:selector][:aggregate] = 1 unless for_collection?
|
304
333
|
end
|
305
334
|
end
|
@@ -310,6 +339,10 @@ module Mongo
|
|
310
339
|
doc[:fullDocument] = @options[:full_document]
|
311
340
|
end
|
312
341
|
|
342
|
+
if @options[:full_document_before_change]
|
343
|
+
doc[:fullDocumentBeforeChange] = @options[:full_document_before_change]
|
344
|
+
end
|
345
|
+
|
313
346
|
if resuming?
|
314
347
|
# We have a resume token once we retrieved any documents.
|
315
348
|
# However, if the first getMore fails and the user didn't pass
|
@@ -348,11 +381,11 @@ module Mongo
|
|
348
381
|
end
|
349
382
|
end
|
350
383
|
|
351
|
-
def send_initial_query(
|
352
|
-
initial_query_op(
|
353
|
-
.
|
354
|
-
|
355
|
-
context: Operation::Context.new(client: client, session: session)
|
384
|
+
def send_initial_query(connection, session)
|
385
|
+
initial_query_op(session, view.read_preference)
|
386
|
+
.execute_with_connection(
|
387
|
+
connection,
|
388
|
+
context: Operation::Context.new(client: client, session: session),
|
356
389
|
)
|
357
390
|
end
|
358
391
|
|
@@ -53,7 +53,7 @@ module Mongo
|
|
53
53
|
#
|
54
54
|
# @return [ Hash ] A single document with the query plan.
|
55
55
|
#
|
56
|
-
# @see https://
|
56
|
+
# @see https://mongodb.com/docs/manual/reference/method/db.collection.explain/#db.collection.explain
|
57
57
|
#
|
58
58
|
# @since 2.0.0
|
59
59
|
def explain(**opts)
|
@@ -149,7 +149,7 @@ module Mongo
|
|
149
149
|
}
|
150
150
|
end
|
151
151
|
|
152
|
-
def initial_query_op(
|
152
|
+
def initial_query_op(session)
|
153
153
|
spec = {
|
154
154
|
coll_name: collection.name,
|
155
155
|
filter: filter,
|
@@ -170,7 +170,6 @@ module Mongo
|
|
170
170
|
max_time_ms: options[:max_time_ms],
|
171
171
|
max_value: options[:max_value],
|
172
172
|
min_value: options[:min_value],
|
173
|
-
no_cursor_timeout: options[:no_cursor_timeout],
|
174
173
|
return_key: options[:return_key],
|
175
174
|
show_disk_loc: options[:show_disk_loc],
|
176
175
|
comment: options[:comment],
|
@@ -194,7 +193,7 @@ module Mongo
|
|
194
193
|
end
|
195
194
|
|
196
195
|
def send_initial_query(server, session = nil)
|
197
|
-
initial_query_op(
|
196
|
+
initial_query_op(session).execute(server, context: Operation::Context.new(client: client, session: session))
|
198
197
|
end
|
199
198
|
|
200
199
|
def use_query_cache?
|
@@ -72,7 +72,7 @@ module Mongo
|
|
72
72
|
@cursor = nil
|
73
73
|
session = client.send(:get_session, @options)
|
74
74
|
server = cluster.next_primary(nil, session)
|
75
|
-
result = send_initial_query(server, session)
|
75
|
+
result = send_initial_query(server, session, context: Operation::Context.new(client: client, session: session))
|
76
76
|
result = send_fetch_query(server, session) unless inline?
|
77
77
|
@cursor = Cursor.new(view, result, server, session: session)
|
78
78
|
if block_given?
|
@@ -223,8 +223,9 @@ module Mongo
|
|
223
223
|
def execute
|
224
224
|
view.send(:with_session, @options) do |session|
|
225
225
|
write_concern = view.write_concern_with_session(session)
|
226
|
-
|
227
|
-
|
226
|
+
context = Operation::Context.new(client: client, session: session)
|
227
|
+
nro_write_with_retry(write_concern, context: context) do |connection, txn_num, context|
|
228
|
+
send_initial_query_with_connection(connection, session, context: context)
|
228
229
|
end
|
229
230
|
end
|
230
231
|
end
|
@@ -266,11 +267,10 @@ module Mongo
|
|
266
267
|
Operation::MapReduce.new(spec)
|
267
268
|
end
|
268
269
|
|
269
|
-
def valid_server?(
|
270
|
+
def valid_server?(description)
|
270
271
|
if secondary_ok?
|
271
272
|
true
|
272
273
|
else
|
273
|
-
description = server.description
|
274
274
|
description.standalone? || description.mongos? || description.primary? || description.load_balancer?
|
275
275
|
end
|
276
276
|
end
|
@@ -279,13 +279,22 @@ module Mongo
|
|
279
279
|
out.respond_to?(:keys) && out.keys.first.to_s.downcase == INLINE
|
280
280
|
end
|
281
281
|
|
282
|
-
def send_initial_query(server, session)
|
283
|
-
|
284
|
-
|
282
|
+
def send_initial_query(server, session, context:)
|
283
|
+
server.with_connection do |connection|
|
284
|
+
send_initial_query_with_connection(connection, session, context: context)
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
def send_initial_query_with_connection(connection, session, context:)
|
289
|
+
op = initial_query_op(session)
|
290
|
+
if valid_server?(connection.description)
|
291
|
+
op.execute_with_connection(connection, context: context)
|
292
|
+
else
|
293
|
+
msg = "Rerouting the MapReduce operation to the primary server - #{connection.address} is not suitable because it is not currently the primray"
|
285
294
|
log_warn(msg)
|
286
295
|
server = cluster.next_primary(nil, session)
|
296
|
+
op.execute(server, context: context)
|
287
297
|
end
|
288
|
-
initial_query_op(session).execute(server, context: Operation::Context.new(client: client, session: session))
|
289
298
|
end
|
290
299
|
|
291
300
|
def fetch_query_spec
|