mongo 2.13.0 → 2.15.0.alpha
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 +1 -4
- data.tar.gz.sig +0 -0
- data/README.md +4 -1
- data/Rakefile +46 -18
- data/lib/mongo.rb +32 -0
- data/lib/mongo/address.rb +1 -1
- data/lib/mongo/address/ipv4.rb +1 -1
- data/lib/mongo/address/ipv6.rb +1 -1
- data/lib/mongo/auth/aws/conversation.rb +1 -4
- data/lib/mongo/auth/base.rb +13 -7
- data/lib/mongo/auth/conversation_base.rb +32 -0
- data/lib/mongo/auth/cr/conversation.rb +6 -29
- data/lib/mongo/auth/gssapi/conversation.rb +4 -15
- data/lib/mongo/auth/ldap/conversation.rb +3 -14
- data/lib/mongo/auth/sasl_conversation_base.rb +1 -13
- data/lib/mongo/auth/scram_conversation_base.rb +7 -34
- data/lib/mongo/auth/user/view.rb +16 -9
- data/lib/mongo/auth/x509/conversation.rb +4 -25
- data/lib/mongo/background_thread.rb +11 -0
- data/lib/mongo/bulk_write.rb +38 -18
- data/lib/mongo/caching_cursor.rb +74 -0
- data/lib/mongo/client.rb +142 -16
- data/lib/mongo/cluster.rb +22 -31
- data/lib/mongo/cluster/reapers/cursor_reaper.rb +6 -2
- data/lib/mongo/cluster/sdam_flow.rb +14 -0
- data/lib/mongo/cluster/topology/single.rb +1 -1
- data/lib/mongo/collection.rb +58 -18
- data/lib/mongo/collection/view.rb +24 -20
- data/lib/mongo/collection/view/aggregation.rb +26 -5
- data/lib/mongo/collection/view/builder/find_command.rb +38 -18
- data/lib/mongo/collection/view/change_stream.rb +1 -1
- data/lib/mongo/collection/view/explainable.rb +27 -8
- data/lib/mongo/collection/view/iterable.rb +73 -13
- data/lib/mongo/collection/view/map_reduce.rb +2 -2
- data/lib/mongo/collection/view/readable.rb +57 -21
- data/lib/mongo/collection/view/writable.rb +29 -15
- data/lib/mongo/crypt/encryption_io.rb +6 -6
- data/lib/mongo/cursor.rb +18 -5
- data/lib/mongo/database.rb +28 -5
- data/lib/mongo/database/view.rb +2 -2
- data/lib/mongo/error.rb +11 -1
- data/lib/mongo/error/bulk_write_error.rb +17 -3
- data/lib/mongo/error/internal_driver_error.rb +22 -0
- data/lib/mongo/error/invalid_read_concern.rb +28 -0
- data/lib/mongo/error/operation_failure.rb +26 -7
- data/lib/mongo/error/parser.rb +65 -12
- data/lib/mongo/error/server_api_conflict.rb +23 -0
- data/lib/mongo/error/server_api_not_supported.rb +24 -0
- data/lib/mongo/error/server_certificate_revoked.rb +22 -0
- data/lib/mongo/error/unmet_dependency.rb +21 -0
- data/lib/mongo/error/unsupported_option.rb +14 -12
- data/lib/mongo/grid/fs_bucket.rb +37 -37
- data/lib/mongo/index/view.rb +21 -11
- data/lib/mongo/lint.rb +2 -1
- data/lib/mongo/logger.rb +3 -3
- data/lib/mongo/monitoring.rb +13 -4
- data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +27 -16
- data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +26 -15
- data/lib/mongo/operation.rb +4 -2
- data/lib/mongo/operation/aggregate/result.rb +9 -8
- data/lib/mongo/operation/collections_info.rb +18 -1
- data/lib/mongo/operation/collections_info/command.rb +5 -0
- data/lib/mongo/operation/collections_info/result.rb +18 -1
- data/lib/mongo/operation/context.rb +99 -0
- data/lib/mongo/operation/delete/bulk_result.rb +2 -0
- data/lib/mongo/operation/delete/result.rb +3 -0
- data/lib/mongo/operation/explain/command.rb +4 -0
- data/lib/mongo/operation/explain/legacy.rb +4 -0
- data/lib/mongo/operation/explain/op_msg.rb +6 -0
- data/lib/mongo/operation/explain/result.rb +3 -0
- data/lib/mongo/operation/find/legacy/result.rb +2 -0
- data/lib/mongo/operation/find/result.rb +13 -0
- data/lib/mongo/operation/get_more/result.rb +3 -0
- data/lib/mongo/operation/indexes.rb +15 -1
- data/lib/mongo/operation/indexes/result.rb +5 -0
- data/lib/mongo/operation/insert/bulk_result.rb +5 -0
- data/lib/mongo/operation/insert/command.rb +2 -2
- data/lib/mongo/operation/insert/legacy.rb +2 -2
- data/lib/mongo/operation/insert/op_msg.rb +2 -2
- data/lib/mongo/operation/insert/result.rb +5 -0
- data/lib/mongo/operation/list_collections/result.rb +9 -1
- data/lib/mongo/operation/map_reduce/result.rb +10 -0
- data/lib/mongo/operation/parallel_scan/result.rb +4 -0
- data/lib/mongo/operation/result.rb +37 -6
- data/lib/mongo/operation/shared/bypass_document_validation.rb +1 -0
- data/lib/mongo/operation/shared/causal_consistency_supported.rb +1 -0
- data/lib/mongo/operation/shared/executable.rb +25 -14
- data/lib/mongo/operation/shared/executable_no_validate.rb +2 -2
- data/lib/mongo/operation/shared/idable.rb +2 -1
- data/lib/mongo/operation/shared/limited.rb +1 -0
- data/lib/mongo/operation/shared/object_id_generator.rb +1 -0
- data/lib/mongo/operation/shared/op_msg_or_command.rb +1 -7
- data/lib/mongo/operation/shared/op_msg_or_find_command.rb +1 -7
- data/lib/mongo/operation/shared/polymorphic_operation.rb +39 -0
- data/lib/mongo/operation/shared/response_handling.rb +23 -23
- data/lib/mongo/operation/shared/result/aggregatable.rb +1 -0
- data/lib/mongo/operation/shared/sessions_supported.rb +14 -2
- data/lib/mongo/operation/shared/specifiable.rb +1 -0
- data/lib/mongo/operation/shared/write.rb +9 -18
- data/lib/mongo/operation/shared/write_concern_supported.rb +1 -0
- data/lib/mongo/operation/update/legacy/result.rb +7 -0
- data/lib/mongo/operation/update/result.rb +8 -0
- data/lib/mongo/operation/users_info/result.rb +3 -0
- data/lib/mongo/protocol/compressed.rb +51 -5
- data/lib/mongo/protocol/message.rb +31 -4
- data/lib/mongo/protocol/msg.rb +37 -12
- data/lib/mongo/protocol/query.rb +36 -0
- data/lib/mongo/query_cache.rb +272 -0
- data/lib/mongo/retryable.rb +9 -2
- data/lib/mongo/server.rb +12 -16
- data/lib/mongo/server/app_metadata.rb +52 -18
- data/lib/mongo/server/connection.rb +5 -0
- data/lib/mongo/server/connection_base.rb +16 -15
- data/lib/mongo/server/connection_common.rb +2 -2
- data/lib/mongo/server/connection_pool.rb +9 -4
- data/lib/mongo/server/description.rb +12 -1
- data/lib/mongo/server/description/features.rb +9 -8
- data/lib/mongo/server/monitor.rb +21 -2
- data/lib/mongo/server/monitor/app_metadata.rb +1 -1
- data/lib/mongo/server/monitor/connection.rb +12 -13
- data/lib/mongo/server/pending_connection.rb +26 -8
- data/lib/mongo/server/push_monitor.rb +12 -2
- data/lib/mongo/server_selector/base.rb +5 -1
- data/lib/mongo/session.rb +7 -3
- data/lib/mongo/session/session_pool.rb +4 -2
- data/lib/mongo/socket.rb +35 -8
- data/lib/mongo/socket/ocsp_cache.rb +97 -0
- data/lib/mongo/socket/ocsp_verifier.rb +368 -0
- data/lib/mongo/socket/ssl.rb +53 -24
- data/lib/mongo/srv/monitor.rb +7 -24
- data/lib/mongo/srv/resolver.rb +14 -10
- data/lib/mongo/timeout.rb +2 -0
- data/lib/mongo/uri.rb +21 -390
- data/lib/mongo/uri/options_mapper.rb +620 -0
- data/lib/mongo/uri/srv_protocol.rb +3 -2
- data/lib/mongo/utils.rb +27 -1
- data/lib/mongo/version.rb +1 -1
- data/spec/NOTES.aws-auth.md +12 -7
- data/spec/README.md +87 -2
- data/spec/integration/auth_spec.rb +25 -15
- data/spec/integration/bson_symbol_spec.rb +4 -2
- data/spec/integration/bulk_write_error_message_spec.rb +41 -0
- data/spec/integration/bulk_write_spec.rb +48 -0
- data/spec/integration/change_stream_spec.rb +5 -5
- data/spec/integration/client_authentication_options_spec.rb +92 -28
- data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +6 -2
- data/spec/integration/command_monitoring_spec.rb +2 -2
- data/spec/integration/connection_pool_populator_spec.rb +4 -2
- data/spec/integration/connection_spec.rb +2 -0
- data/spec/integration/cursor_reaping_spec.rb +54 -18
- data/spec/integration/docs_examples_spec.rb +8 -1
- data/spec/integration/fork_reconnect_spec.rb +60 -2
- data/spec/integration/ocsp_connectivity_spec.rb +26 -0
- data/spec/integration/ocsp_verifier_cache_spec.rb +188 -0
- data/spec/integration/ocsp_verifier_spec.rb +340 -0
- data/spec/integration/operation_failure_code_spec.rb +1 -1
- data/spec/integration/operation_failure_message_spec.rb +90 -0
- data/spec/integration/query_cache_spec.rb +1045 -0
- data/spec/integration/query_cache_transactions_spec.rb +190 -0
- data/spec/integration/reconnect_spec.rb +1 -1
- data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +1 -0
- data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +2 -0
- data/spec/integration/sdam_error_handling_spec.rb +86 -1
- data/spec/integration/sdam_events_spec.rb +8 -7
- data/spec/integration/server_selection_spec.rb +36 -0
- data/spec/integration/size_limit_spec.rb +20 -19
- data/spec/integration/snappy_compression_spec.rb +25 -0
- data/spec/integration/srv_monitoring_spec.rb +39 -4
- data/spec/integration/srv_spec.rb +56 -0
- data/spec/integration/transactions_examples_spec.rb +23 -7
- data/spec/integration/zlib_compression_spec.rb +1 -1
- data/spec/integration/zstd_compression_spec.rb +26 -0
- data/spec/lite_spec_helper.rb +15 -5
- data/spec/mongo/address_spec.rb +16 -12
- data/spec/mongo/auth/ldap/conversation_spec.rb +1 -1
- data/spec/mongo/auth/ldap_spec.rb +5 -1
- data/spec/mongo/auth/scram_negotiation_spec.rb +1 -1
- data/spec/mongo/auth/scram_spec.rb +1 -1
- data/spec/mongo/auth/user_spec.rb +1 -1
- data/spec/mongo/auth/x509/conversation_spec.rb +3 -3
- data/spec/mongo/bulk_write_spec.rb +2 -2
- data/spec/mongo/caching_cursor_spec.rb +70 -0
- data/spec/mongo/client_construction_spec.rb +273 -35
- data/spec/mongo/client_encryption_spec.rb +16 -10
- data/spec/mongo/client_spec.rb +64 -0
- data/spec/mongo/cluster/topology/replica_set_spec.rb +1 -1
- data/spec/mongo/cluster/topology/sharded_spec.rb +1 -1
- data/spec/mongo/cluster/topology/single_spec.rb +15 -6
- data/spec/mongo/cluster/topology/unknown_spec.rb +1 -1
- data/spec/mongo/cluster/topology_spec.rb +1 -1
- data/spec/mongo/cluster_spec.rb +6 -18
- data/spec/mongo/collection/view/change_stream_resume_spec.rb +1 -1
- data/spec/mongo/collection/view/explainable_spec.rb +87 -4
- data/spec/mongo/collection/view/map_reduce_spec.rb +2 -0
- data/spec/mongo/collection/view/readable_spec.rb +50 -0
- data/spec/mongo/collection_crud_spec.rb +4357 -0
- data/spec/mongo/collection_ddl_spec.rb +534 -0
- data/spec/mongo/collection_spec.rb +5 -4787
- data/spec/mongo/crypt/auto_decryption_context_spec.rb +1 -1
- data/spec/mongo/crypt/auto_encryption_context_spec.rb +1 -1
- data/spec/mongo/crypt/binary_spec.rb +1 -6
- data/spec/mongo/crypt/binding/binary_spec.rb +1 -6
- data/spec/mongo/crypt/binding/context_spec.rb +2 -7
- data/spec/mongo/crypt/binding/helpers_spec.rb +1 -6
- data/spec/mongo/crypt/binding/mongocrypt_spec.rb +2 -7
- data/spec/mongo/crypt/binding/status_spec.rb +1 -6
- data/spec/mongo/crypt/binding/version_spec.rb +1 -6
- data/spec/mongo/crypt/data_key_context_spec.rb +1 -1
- data/spec/mongo/crypt/explicit_decryption_context_spec.rb +1 -1
- data/spec/mongo/crypt/explicit_encryption_context_spec.rb +1 -1
- data/spec/mongo/crypt/status_spec.rb +1 -6
- data/spec/mongo/database_spec.rb +174 -4
- data/spec/mongo/error/bulk_write_error_spec.rb +3 -3
- data/spec/mongo/error/no_server_available_spec.rb +1 -1
- data/spec/mongo/error/parser_spec.rb +37 -6
- data/spec/mongo/index/view_spec.rb +8 -2
- data/spec/mongo/logger_spec.rb +13 -11
- data/spec/mongo/monitoring/event/server_closed_spec.rb +1 -1
- data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +1 -1
- data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +1 -1
- data/spec/mongo/monitoring/event/server_opening_spec.rb +1 -1
- data/spec/mongo/monitoring/event/topology_changed_spec.rb +1 -1
- data/spec/mongo/monitoring/event/topology_closed_spec.rb +1 -1
- data/spec/mongo/monitoring/event/topology_opening_spec.rb +1 -1
- data/spec/mongo/operation/aggregate_spec.rb +2 -1
- data/spec/mongo/operation/collections_info_spec.rb +4 -1
- data/spec/mongo/operation/command_spec.rb +6 -3
- data/spec/mongo/operation/create_index_spec.rb +6 -3
- data/spec/mongo/operation/create_user_spec.rb +6 -3
- data/spec/mongo/operation/delete/bulk_spec.rb +9 -6
- data/spec/mongo/operation/delete/op_msg_spec.rb +3 -3
- data/spec/mongo/operation/delete_spec.rb +11 -7
- data/spec/mongo/operation/drop_index_spec.rb +6 -2
- data/spec/mongo/operation/find/legacy_spec.rb +3 -1
- data/spec/mongo/operation/get_more_spec.rb +3 -1
- data/spec/mongo/operation/indexes_spec.rb +5 -1
- data/spec/mongo/operation/insert/bulk_spec.rb +10 -7
- data/spec/mongo/operation/insert/command_spec.rb +2 -2
- data/spec/mongo/operation/insert/op_msg_spec.rb +3 -3
- data/spec/mongo/operation/insert_spec.rb +15 -12
- data/spec/mongo/operation/map_reduce_spec.rb +5 -2
- data/spec/mongo/operation/read_preference_op_msg_spec.rb +1 -1
- data/spec/mongo/operation/remove_user_spec.rb +6 -3
- data/spec/mongo/operation/result_spec.rb +1 -1
- data/spec/mongo/operation/update/bulk_spec.rb +9 -6
- data/spec/mongo/operation/update/command_spec.rb +2 -2
- data/spec/mongo/operation/update/op_msg_spec.rb +3 -3
- data/spec/mongo/operation/update_spec.rb +10 -7
- data/spec/mongo/operation/update_user_spec.rb +4 -1
- data/spec/mongo/protocol/compressed_spec.rb +26 -12
- data/spec/mongo/query_cache_middleware_spec.rb +55 -0
- data/spec/mongo/query_cache_spec.rb +280 -0
- data/spec/mongo/retryable_spec.rb +3 -2
- data/spec/mongo/server/app_metadata_shared.rb +2 -2
- data/spec/mongo/server/app_metadata_spec.rb +2 -0
- data/spec/mongo/server/connection_pool/populator_spec.rb +3 -1
- data/spec/mongo/server/connection_pool_spec.rb +8 -4
- data/spec/mongo/server/connection_spec.rb +39 -25
- data/spec/mongo/server/description_spec.rb +18 -0
- data/spec/mongo/server/monitor/connection_spec.rb +17 -7
- data/spec/mongo/server/monitor_spec.rb +9 -1
- data/spec/mongo/server_selector_spec.rb +2 -2
- data/spec/mongo/server_spec.rb +15 -2
- data/spec/mongo/socket/ssl_spec.rb +44 -4
- data/spec/mongo/socket_spec.rb +2 -2
- data/spec/mongo/tls_context_hooks_spec.rb +37 -0
- data/spec/mongo/uri/srv_protocol_spec.rb +64 -33
- data/spec/mongo/uri_option_parsing_spec.rb +11 -11
- data/spec/mongo/uri_spec.rb +68 -41
- data/spec/mongo/utils_spec.rb +39 -0
- data/spec/runners/auth.rb +3 -0
- data/spec/runners/change_streams/test.rb +1 -1
- data/spec/runners/connection_string.rb +31 -124
- data/spec/runners/crud/requirement.rb +40 -3
- data/spec/runners/crud/test_base.rb +0 -19
- data/spec/runners/crud/verifier.rb +8 -0
- data/spec/runners/server_selection.rb +1 -1
- data/spec/runners/transactions/operation.rb +13 -2
- data/spec/runners/transactions/test.rb +3 -2
- data/spec/runners/unified.rb +96 -0
- data/spec/runners/unified/assertions.rb +249 -0
- data/spec/runners/unified/change_stream_operations.rb +26 -0
- data/spec/runners/unified/crud_operations.rb +199 -0
- data/spec/runners/unified/ddl_operations.rb +96 -0
- data/spec/runners/unified/entity_map.rb +39 -0
- data/spec/runners/unified/error.rb +25 -0
- data/spec/runners/unified/event_subscriber.rb +91 -0
- data/spec/runners/unified/exceptions.rb +21 -0
- data/spec/runners/unified/grid_fs_operations.rb +55 -0
- data/spec/runners/unified/support_operations.rb +250 -0
- data/spec/runners/unified/test.rb +393 -0
- data/spec/runners/unified/test_group.rb +28 -0
- data/spec/runners/unified/using_hash.rb +31 -0
- data/spec/shared/LICENSE +20 -0
- data/spec/shared/bin/get-mongodb-download-url +17 -0
- data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
- data/spec/shared/lib/mrss/cluster_config.rb +218 -0
- data/spec/shared/lib/mrss/constraints.rb +346 -0
- data/spec/shared/lib/mrss/docker_runner.rb +262 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +175 -0
- data/spec/shared/lib/mrss/server_version_registry.rb +112 -0
- data/spec/shared/lib/mrss/spec_organizer.rb +149 -0
- data/spec/shared/lib/mrss/utils.rb +15 -0
- data/spec/shared/share/Dockerfile.erb +231 -0
- data/spec/shared/shlib/distro.sh +73 -0
- data/spec/shared/shlib/server.sh +290 -0
- data/spec/shared/shlib/set_env.sh +128 -0
- data/spec/solo/clean_exit_spec.rb +21 -0
- data/spec/spec_helper.rb +7 -2
- data/spec/spec_tests/cmap_spec.rb +7 -3
- data/spec/spec_tests/crud_unified_spec.rb +10 -0
- data/spec/spec_tests/data/change_streams/change-streams-errors.yml +0 -1
- data/spec/spec_tests/data/change_streams/change-streams.yml +0 -2
- data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +6 -2
- data/spec/spec_tests/data/cmap/pool-create-min-size.yml +3 -0
- data/spec/spec_tests/data/connection_string/valid-warnings.yml +24 -0
- data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +267 -0
- data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +60 -0
- data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount.yml → estimatedDocumentCount-pre4.9.yml} +2 -0
- data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +146 -0
- data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-serverErrors.yml → estimatedDocumentCount-serverErrors-pre4.9.yml} +2 -0
- data/spec/spec_tests/data/retryable_reads/listIndexNames.yml +1 -1
- data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +1 -3
- data/spec/spec_tests/data/sdam_monitoring/standalone.yml +2 -2
- data/spec/spec_tests/data/sdam_monitoring/standalone_repeated.yml +2 -2
- data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +2 -2
- data/spec/spec_tests/data/sdam_monitoring/standalone_to_rs_with_me_mismatch.yml +2 -2
- data/spec/spec_tests/data/unified/valid-fail/operation-failure.yml +31 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +220 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +102 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +184 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-gridfs.yml +155 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +193 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +210 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +215 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +235 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +169 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +170 -0
- data/spec/spec_tests/data/uri_options/auth-options.yml +25 -0
- data/spec/spec_tests/data/uri_options/compression-options.yml +7 -4
- data/spec/spec_tests/data/uri_options/read-preference-options.yml +24 -0
- data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +1 -0
- data/spec/spec_tests/data/uri_options/tls-options.yml +160 -4
- data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +416 -0
- data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +409 -0
- data/spec/spec_tests/data/versioned_api/runcommand-helper-no-api-version-declared.yml +67 -0
- data/spec/spec_tests/data/versioned_api/test-commands-deprecation-errors.yml +47 -0
- data/spec/spec_tests/data/versioned_api/test-commands-strict-mode.yml +44 -0
- data/spec/spec_tests/data/versioned_api/transaction-handling.yml +180 -0
- data/spec/spec_tests/dns_seedlist_discovery_spec.rb +9 -1
- data/spec/spec_tests/unified_spec.rb +15 -0
- data/spec/spec_tests/uri_options_spec.rb +47 -33
- data/spec/spec_tests/versioned_api_spec.rb +10 -0
- data/spec/stress/fork_reconnect_stress_spec.rb +1 -1
- data/spec/support/certificates/atlas-ocsp-ca.crt +28 -0
- data/spec/support/certificates/atlas-ocsp.crt +41 -0
- data/spec/support/client_registry_macros.rb +11 -2
- data/spec/support/common_shortcuts.rb +59 -0
- data/spec/support/constraints.rb +6 -253
- data/spec/support/matchers.rb +16 -0
- data/spec/support/ocsp +1 -0
- data/spec/support/session_registry.rb +52 -0
- data/spec/support/shared/session.rb +2 -2
- data/spec/support/spec_config.rb +68 -3
- data/spec/support/spec_setup.rb +48 -38
- data/spec/support/utils.rb +102 -4
- metadata +1087 -936
- metadata.gz.sig +0 -0
- data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +0 -56
- data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +0 -47
- data/spec/support/child_process_helper.rb +0 -78
- data/spec/support/cluster_config.rb +0 -207
- data/spec/support/lite_constraints.rb +0 -141
- data/spec/support/spec_organizer.rb +0 -129
@@ -22,9 +22,13 @@ module Mongo
|
|
22
22
|
|
23
23
|
private
|
24
24
|
|
25
|
-
|
26
|
-
|
27
|
-
|
25
|
+
# @param [ Mongo::Operation::Result ] result The operation result.
|
26
|
+
# @param [ Mongo::Server::Connection ] connection The connection on which
|
27
|
+
# the operation is performed.
|
28
|
+
# @param [ Mongo::Operation::Context ] context The operation context.
|
29
|
+
def validate_result(result, connection, context)
|
30
|
+
unpin_maybe(context.session) do
|
31
|
+
add_error_labels(connection, context) do
|
28
32
|
add_server_diagnostics(connection) do
|
29
33
|
result.validate!
|
30
34
|
end
|
@@ -38,25 +42,29 @@ module Mongo
|
|
38
42
|
# and server-side errors (Error::OperationFailure); it does not
|
39
43
|
# handle server selection errors (Error::NoServerAvailable), for which
|
40
44
|
# labels are added in the server selection code.
|
41
|
-
|
45
|
+
#
|
46
|
+
# @param [ Mongo::Server::Connection ] connection The connection on which
|
47
|
+
# the operation is performed.
|
48
|
+
# @param [ Mongo::Operation::Context ] context The operation context.
|
49
|
+
def add_error_labels(connection, context)
|
42
50
|
begin
|
43
51
|
yield
|
44
52
|
rescue Mongo::Error::SocketError => e
|
45
|
-
if
|
53
|
+
if context.in_transaction? && !context.committing_transaction?
|
46
54
|
e.add_label('TransientTransactionError')
|
47
55
|
end
|
48
|
-
if
|
56
|
+
if context.committing_transaction?
|
49
57
|
e.add_label('UnknownTransactionCommitResult')
|
50
58
|
end
|
51
59
|
|
52
|
-
maybe_add_retryable_write_error_label!(e, connection,
|
60
|
+
maybe_add_retryable_write_error_label!(e, connection, context)
|
53
61
|
|
54
62
|
raise e
|
55
63
|
rescue Mongo::Error::SocketTimeoutError => e
|
56
|
-
maybe_add_retryable_write_error_label!(e, connection,
|
64
|
+
maybe_add_retryable_write_error_label!(e, connection, context)
|
57
65
|
raise e
|
58
66
|
rescue Mongo::Error::OperationFailure => e
|
59
|
-
if
|
67
|
+
if context.committing_transaction?
|
60
68
|
if e.write_retryable? || e.wtimeout? || (e.write_concern_error? &&
|
61
69
|
!Session::UNLABELED_WRITE_CONCERN_CODES.include?(e.write_concern_error_code)
|
62
70
|
) || e.max_time_ms_expired?
|
@@ -64,7 +72,7 @@ module Mongo
|
|
64
72
|
end
|
65
73
|
end
|
66
74
|
|
67
|
-
maybe_add_retryable_write_error_label!(e, connection,
|
75
|
+
maybe_add_retryable_write_error_label!(e, connection, context)
|
68
76
|
|
69
77
|
raise e
|
70
78
|
end
|
@@ -125,21 +133,12 @@ module Mongo
|
|
125
133
|
# @param [ Mongo::Error ] error The error to which to add the label.
|
126
134
|
# @param [ Mongo::Server::Connection ] connection The connection on which
|
127
135
|
# the operation is performed.
|
128
|
-
# @param [ Mongo::
|
129
|
-
# the operation.
|
130
|
-
# @param [ Mongo::Session ] session The operation's session.
|
136
|
+
# @param [ Mongo::Operation::Context ] context The operation context.
|
131
137
|
#
|
132
138
|
# @note The client argument is optional because some operations, such as
|
133
139
|
# end_session, do not pass the client as an argument to the execute
|
134
140
|
# method.
|
135
|
-
def maybe_add_retryable_write_error_label!(error, connection,
|
136
|
-
in_transaction = session && session.in_transaction?
|
137
|
-
committing_transaction = in_transaction && session.committing_transaction?
|
138
|
-
aborting_transaction = in_transaction && session.aborting_transaction?
|
139
|
-
modern_retry_writes = client && client.options[:retry_writes]
|
140
|
-
legacy_retry_writes = client && !client.options[:retry_writes] &&
|
141
|
-
client.max_write_retries > 0
|
142
|
-
|
141
|
+
def maybe_add_retryable_write_error_label!(error, connection, context)
|
143
142
|
# An operation is retryable if it meets one of the following criteria:
|
144
143
|
# - It is a commitTransaction or abortTransaction
|
145
144
|
# - It does not occur during a transaction and the client has enabled
|
@@ -147,8 +146,9 @@ module Mongo
|
|
147
146
|
#
|
148
147
|
# Note: any write operation within a transaction (excepting commit and
|
149
148
|
# abort is NOT a retryable operation)
|
150
|
-
retryable_operation = committing_transaction ||
|
151
|
-
|
149
|
+
retryable_operation = context.committing_transaction? ||
|
150
|
+
context.aborting_transaction? ||
|
151
|
+
!context.in_transaction? && context.any_retry_writes?
|
152
152
|
|
153
153
|
# An operation should add the RetryableWriteError label if one of the
|
154
154
|
# following conditions is met:
|
@@ -18,6 +18,7 @@ module Mongo
|
|
18
18
|
# Shared behavior of operations that support a session.
|
19
19
|
#
|
20
20
|
# @since 2.5.2
|
21
|
+
# @api private
|
21
22
|
module SessionsSupported
|
22
23
|
|
23
24
|
private
|
@@ -221,9 +222,20 @@ module Mongo
|
|
221
222
|
end
|
222
223
|
end
|
223
224
|
|
224
|
-
def build_message(connection)
|
225
|
+
def build_message(connection, context)
|
226
|
+
if self.session != context.session
|
227
|
+
if self.session
|
228
|
+
raise Error::InternalDriverError, "Operation session #{self.session.inspect} does not match context session #{context.session.inspect}"
|
229
|
+
else
|
230
|
+
# Some operations are not constructed with sessions but are
|
231
|
+
# executed in a context where a session is available.
|
232
|
+
# This could be OK or a driver issue.
|
233
|
+
# TODO investigate.
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
225
237
|
super.tap do |message|
|
226
|
-
if session
|
238
|
+
if session = context.session
|
227
239
|
# Serialize the message to detect client-side problems,
|
228
240
|
# such as invalid BSON keys. The message will be serialized again
|
229
241
|
# later prior to being sent to the connection.
|
@@ -18,24 +18,20 @@ module Mongo
|
|
18
18
|
# Shared behavior of operations that write (update, insert, delete).
|
19
19
|
#
|
20
20
|
# @since 2.5.2
|
21
|
+
# @api private
|
21
22
|
module Write
|
22
23
|
|
23
24
|
include ResponseHandling
|
24
25
|
|
25
26
|
# Execute the operation.
|
26
27
|
#
|
27
|
-
# @example
|
28
|
-
# operation.execute(server, client: nil)
|
29
|
-
#
|
30
28
|
# @param [ Mongo::Server ] server The server to send the operation to.
|
31
|
-
# @param [
|
32
|
-
# perform auto-encryption if it is necessary to encrypt the command
|
33
|
-
# being executed (optional).
|
29
|
+
# @param [ Operation::Context ] context The operation context.
|
34
30
|
#
|
35
31
|
# @return [ Mongo::Operation::Result ] The operation result.
|
36
32
|
#
|
37
33
|
# @since 2.5.2
|
38
|
-
def execute(server,
|
34
|
+
def execute(server, context:)
|
39
35
|
server.with_connection do |connection|
|
40
36
|
validate!(connection)
|
41
37
|
op = if connection.features.op_msg_enabled?
|
@@ -46,34 +42,29 @@ module Mongo
|
|
46
42
|
self.class::Command.new(spec)
|
47
43
|
end
|
48
44
|
|
49
|
-
result = op.execute(connection,
|
50
|
-
validate_result(result,
|
45
|
+
result = op.execute(connection, context: context)
|
46
|
+
validate_result(result, connection, context)
|
51
47
|
end
|
52
48
|
end
|
53
49
|
|
54
50
|
# Execute the bulk write operation.
|
55
51
|
#
|
56
|
-
# @example
|
57
|
-
# operation.bulk_execute(connection, client: nil)
|
58
|
-
#
|
59
52
|
# @param [ Mongo::Server::Connection ] connection The connection over
|
60
53
|
# which to send the operation.
|
61
|
-
# @param [
|
62
|
-
# perform auto-encryption if it is necessary to encrypt the command
|
63
|
-
# being executed (optional).
|
54
|
+
# @param [ Operation::Context ] context The operation context.
|
64
55
|
#
|
65
56
|
# @return [ Mongo::Operation::Delete::BulkResult,
|
66
57
|
# Mongo::Operation::Insert::BulkResult,
|
67
58
|
# Mongo::Operation::Update::BulkResult ] The bulk result.
|
68
59
|
#
|
69
60
|
# @since 2.5.2
|
70
|
-
def bulk_execute(connection,
|
61
|
+
def bulk_execute(connection, context:)
|
71
62
|
Lint.assert_type(connection, Server::Connection)
|
72
63
|
|
73
64
|
if connection.features.op_msg_enabled?
|
74
|
-
self.class::OpMsg.new(spec).execute(connection,
|
65
|
+
self.class::OpMsg.new(spec).execute(connection, context: context).bulk_result
|
75
66
|
else
|
76
|
-
self.class::Command.new(spec).execute(connection,
|
67
|
+
self.class::Command.new(spec).execute(connection, context: context).bulk_result
|
77
68
|
end
|
78
69
|
end
|
79
70
|
|
@@ -21,17 +21,20 @@ module Mongo
|
|
21
21
|
# version <= 2.4.
|
22
22
|
#
|
23
23
|
# @since 2.0.0
|
24
|
+
# @api semiprivate
|
24
25
|
class Result < Operation::Result
|
25
26
|
include Operation::Result::UseLegacyErrorParser
|
26
27
|
|
27
28
|
# Whether an existing document was updated.
|
28
29
|
#
|
29
30
|
# @since 2.0.0
|
31
|
+
# @api private
|
30
32
|
UPDATED_EXISTING = 'updatedExisting'.freeze
|
31
33
|
|
32
34
|
# The upserted docs field in the result.
|
33
35
|
#
|
34
36
|
# @since 2.0.0
|
37
|
+
# @api private
|
35
38
|
UPSERTED = 'upserted'.freeze
|
36
39
|
|
37
40
|
# Get the number of documents matched.
|
@@ -42,6 +45,7 @@ module Mongo
|
|
42
45
|
# @return [ Integer ] The matched count.
|
43
46
|
#
|
44
47
|
# @since 2.0.0
|
48
|
+
# @api public
|
45
49
|
def matched_count
|
46
50
|
return 0 unless acknowledged?
|
47
51
|
if upsert?
|
@@ -59,6 +63,7 @@ module Mongo
|
|
59
63
|
# @return [ nil ] Always omitted for legacy versions.
|
60
64
|
#
|
61
65
|
# @since 2.0.0
|
66
|
+
# @api public
|
62
67
|
def modified_count; end
|
63
68
|
|
64
69
|
# The identifier of the inserted document if an upsert
|
@@ -70,6 +75,7 @@ module Mongo
|
|
70
75
|
# @return [ Object ] The upserted id.
|
71
76
|
#
|
72
77
|
# @since 2.0.0
|
78
|
+
# @api public
|
73
79
|
def upserted_id
|
74
80
|
first[UPSERTED] if upsert?
|
75
81
|
end
|
@@ -82,6 +88,7 @@ module Mongo
|
|
82
88
|
# @return [ Integer ] The number upserted.
|
83
89
|
#
|
84
90
|
# @since 2.4.2
|
91
|
+
# @api public
|
85
92
|
def upserted_count
|
86
93
|
upsert? ? n : 0
|
87
94
|
end
|
@@ -19,16 +19,19 @@ module Mongo
|
|
19
19
|
# Defines custom behavior of results for an update.
|
20
20
|
#
|
21
21
|
# @since 2.0.0
|
22
|
+
# @api semiprivate
|
22
23
|
class Result < Operation::Result
|
23
24
|
|
24
25
|
# The number of modified docs field in the result.
|
25
26
|
#
|
26
27
|
# @since 2.0.0
|
28
|
+
# @api private
|
27
29
|
MODIFIED = 'nModified'.freeze
|
28
30
|
|
29
31
|
# The upserted docs field in the result.
|
30
32
|
#
|
31
33
|
# @since 2.0.0
|
34
|
+
# @api private
|
32
35
|
UPSERTED = 'upserted'.freeze
|
33
36
|
|
34
37
|
# Get the number of documents matched.
|
@@ -39,6 +42,7 @@ module Mongo
|
|
39
42
|
# @return [ Integer ] The matched count.
|
40
43
|
#
|
41
44
|
# @since 2.0.0
|
45
|
+
# @api public
|
42
46
|
def matched_count
|
43
47
|
return 0 unless acknowledged?
|
44
48
|
if upsert?
|
@@ -56,6 +60,7 @@ module Mongo
|
|
56
60
|
# @return [ Integer ] The modified count.
|
57
61
|
#
|
58
62
|
# @since 2.0.0
|
63
|
+
# @api public
|
59
64
|
def modified_count
|
60
65
|
return 0 unless acknowledged?
|
61
66
|
first[MODIFIED]
|
@@ -70,6 +75,7 @@ module Mongo
|
|
70
75
|
# @return [ Object ] The upserted id.
|
71
76
|
#
|
72
77
|
# @since 2.0.0
|
78
|
+
# @api public
|
73
79
|
def upserted_id
|
74
80
|
return nil unless upsert?
|
75
81
|
upsert?.first['_id']
|
@@ -83,10 +89,12 @@ module Mongo
|
|
83
89
|
# @return [ Integer ] The number upserted.
|
84
90
|
#
|
85
91
|
# @since 2.4.2
|
92
|
+
# @api public
|
86
93
|
def upserted_count
|
87
94
|
upsert? ? n : 0
|
88
95
|
end
|
89
96
|
|
97
|
+
# @api public
|
90
98
|
def bulk_result
|
91
99
|
BulkResult.new(@replies, connection_description)
|
92
100
|
end
|
@@ -20,13 +20,16 @@ module Mongo
|
|
20
20
|
# usersInfo command.
|
21
21
|
#
|
22
22
|
# @since 2.1.0
|
23
|
+
# @api semiprivate
|
23
24
|
class Result < Operation::Result
|
24
25
|
|
25
26
|
# The field name for the users document in a usersInfo result.
|
26
27
|
#
|
27
28
|
# @since 2.1.0
|
29
|
+
# @api private
|
28
30
|
USERS = 'users'.freeze
|
29
31
|
|
32
|
+
# @api public
|
30
33
|
def documents
|
31
34
|
reply.documents.first[USERS]
|
32
35
|
end
|
@@ -18,12 +18,25 @@ module Mongo
|
|
18
18
|
# MongoDB Wire protocol Compressed message.
|
19
19
|
#
|
20
20
|
# This is a bi-directional message that compresses another opcode.
|
21
|
+
# See https://github.com/mongodb/specifications/blob/master/source/compression/OP_COMPRESSED.rst
|
21
22
|
#
|
22
23
|
# @api semipublic
|
23
24
|
#
|
24
25
|
# @since 2.5.0
|
25
26
|
class Compressed < Message
|
26
27
|
|
28
|
+
# The noop compressor identifier.
|
29
|
+
NOOP = 'noop'.freeze
|
30
|
+
|
31
|
+
# The byte signaling that the message has not been compressed (test mode).
|
32
|
+
NOOP_BYTE = 0.chr.force_encoding(BSON::BINARY).freeze
|
33
|
+
|
34
|
+
# The snappy compressor identifier.
|
35
|
+
SNAPPY = 'snappy'.freeze
|
36
|
+
|
37
|
+
# The byte signaling that the message has been compressed with snappy.
|
38
|
+
SNAPPY_BYTE = 1.chr.force_encoding(BSON::BINARY).freeze
|
39
|
+
|
27
40
|
# The byte signaling that the message has been compressed with Zlib.
|
28
41
|
#
|
29
42
|
# @since 2.5.0
|
@@ -34,10 +47,20 @@ module Mongo
|
|
34
47
|
# @since 2.5.0
|
35
48
|
ZLIB = 'zlib'.freeze
|
36
49
|
|
50
|
+
# The zstd compressor identifier.
|
51
|
+
ZSTD = 'zstd'.freeze
|
52
|
+
|
53
|
+
# The byte signaling that the message has been compressed with zstd.
|
54
|
+
ZSTD_BYTE = 3.chr.force_encoding(BSON::BINARY).freeze
|
55
|
+
|
37
56
|
# The compressor identifier to byte map.
|
38
57
|
#
|
39
58
|
# @since 2.5.0
|
40
|
-
COMPRESSOR_ID_MAP = {
|
59
|
+
COMPRESSOR_ID_MAP = {
|
60
|
+
SNAPPY => SNAPPY_BYTE,
|
61
|
+
ZSTD => ZSTD_BYTE,
|
62
|
+
ZLIB => ZLIB_BYTE
|
63
|
+
}.freeze
|
41
64
|
|
42
65
|
# Creates a new OP_COMPRESSED message.
|
43
66
|
#
|
@@ -68,9 +91,7 @@ module Mongo
|
|
68
91
|
# @api private
|
69
92
|
def maybe_inflate
|
70
93
|
message = Registry.get(@original_op_code).allocate
|
71
|
-
|
72
|
-
|
73
|
-
buf = BSON::ByteBuffer.new(uncompressed_message)
|
94
|
+
buf = decompress(@compressed_message)
|
74
95
|
|
75
96
|
message.send(:fields).each do |field|
|
76
97
|
if field[:multi]
|
@@ -125,10 +146,35 @@ module Mongo
|
|
125
146
|
buf = BSON::ByteBuffer.new
|
126
147
|
@original_message.send(:serialize_fields, buf, max_bson_size)
|
127
148
|
@uncompressed_size = buf.length
|
128
|
-
@compressed_message =
|
149
|
+
@compressed_message = compress(buf)
|
129
150
|
super
|
130
151
|
end
|
131
152
|
|
153
|
+
def compress(buffer)
|
154
|
+
if @compressor_id == NOOP_BYTE
|
155
|
+
buffer.to_s.force_encoding(BSON::BINARY)
|
156
|
+
elsif @compressor_id == ZLIB_BYTE
|
157
|
+
Zlib::Deflate.deflate(buffer.to_s, @zlib_compression_level).force_encoding(BSON::BINARY)
|
158
|
+
elsif @compressor_id == SNAPPY_BYTE
|
159
|
+
Snappy.deflate(buffer.to_s).force_encoding(BSON::BINARY)
|
160
|
+
elsif @compressor_id == ZSTD_BYTE
|
161
|
+
# DRIVERS-600 will allow this to be configurable in the future
|
162
|
+
Zstd.compress(buffer.to_s).force_encoding(BSON::BINARY)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
def decompress(compressed_message)
|
167
|
+
if @compressor_id == NOOP_BYTE
|
168
|
+
BSON::ByteBuffer.new(compressed_message)
|
169
|
+
elsif @compressor_id == ZLIB_BYTE
|
170
|
+
BSON::ByteBuffer.new(Zlib::Inflate.inflate(compressed_message))
|
171
|
+
elsif @compressor_id == SNAPPY_BYTE
|
172
|
+
BSON::ByteBuffer.new(Snappy.inflate(compressed_message))
|
173
|
+
elsif @compressor_id == ZSTD_BYTE
|
174
|
+
BSON::ByteBuffer.new(Zstd.decompress(compressed_message))
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
132
178
|
Registry.register(OP_CODE, self)
|
133
179
|
end
|
134
180
|
end
|
@@ -140,7 +140,13 @@ module Mongo
|
|
140
140
|
self
|
141
141
|
end
|
142
142
|
|
143
|
-
|
143
|
+
# Possibly decrypt this message with libmongocrypt.
|
144
|
+
#
|
145
|
+
# @param [ Mongo::Operation::Context ] context The operation context.
|
146
|
+
#
|
147
|
+
# @return [ Mongo::Protocol::Msg ] The decrypted message, or the original
|
148
|
+
# message if decryption was not possible or necessary.
|
149
|
+
def maybe_decrypt(context)
|
144
150
|
# TODO determine if we should be decrypting data coming from pre-4.2
|
145
151
|
# servers, potentially using legacy wire protocols. If so we need
|
146
152
|
# to implement decryption for those wire protocols as our current
|
@@ -148,11 +154,23 @@ module Mongo
|
|
148
154
|
self
|
149
155
|
end
|
150
156
|
|
151
|
-
|
157
|
+
# Possibly encrypt this message with libmongocrypt.
|
158
|
+
#
|
159
|
+
# @param [ Mongo::Server::Connection ] connection The connection on which
|
160
|
+
# the operation is performed.
|
161
|
+
# @param [ Mongo::Operation::Context ] context The operation context.
|
162
|
+
#
|
163
|
+
# @return [ Mongo::Protocol::Msg ] The encrypted message, or the original
|
164
|
+
# message if encryption was not possible or necessary.
|
165
|
+
def maybe_encrypt(connection, context)
|
152
166
|
# Do nothing if the Message subclass has not implemented this method
|
153
167
|
self
|
154
168
|
end
|
155
169
|
|
170
|
+
def maybe_add_server_api(server_api)
|
171
|
+
raise Error::ServerApiNotSupported, "Server API parameters cannot be sent to pre-3.6 MongoDB servers. Please remove the :server_api parameter from Client options or use MongoDB 3.6 or newer"
|
172
|
+
end
|
173
|
+
|
156
174
|
private def merge_sections
|
157
175
|
cmd = if @sections.length > 1
|
158
176
|
cmd = @sections.detect { |section| section[:type] == 0 }[:payload]
|
@@ -177,10 +195,19 @@ module Mongo
|
|
177
195
|
#
|
178
196
|
# @param buffer [String] buffer where the message should be inserted
|
179
197
|
# @return [String] buffer containing the serialized message
|
180
|
-
def serialize(buffer = BSON::ByteBuffer.new, max_bson_size = nil)
|
198
|
+
def serialize(buffer = BSON::ByteBuffer.new, max_bson_size = nil, bson_overhead = nil)
|
199
|
+
max_size =
|
200
|
+
if max_bson_size && bson_overhead
|
201
|
+
max_bson_size + bson_overhead
|
202
|
+
elsif max_bson_size
|
203
|
+
max_bson_size
|
204
|
+
else
|
205
|
+
nil
|
206
|
+
end
|
207
|
+
|
181
208
|
start = buffer.length
|
182
209
|
serialize_header(buffer)
|
183
|
-
serialize_fields(buffer,
|
210
|
+
serialize_fields(buffer, max_size)
|
184
211
|
buffer.replace_int32(start, buffer.length - start)
|
185
212
|
end
|
186
213
|
|