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
@@ -0,0 +1,190 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'QueryCache with transactions' do
|
4
|
+
# Work around https://jira.mongodb.org/browse/HELP-10518
|
5
|
+
before(:all) do
|
6
|
+
client = ClientRegistry.instance.global_client('authorized')
|
7
|
+
Utils.create_collection(client, 'test')
|
8
|
+
|
9
|
+
Utils.mongos_each_direct_client do |client|
|
10
|
+
client['test'].distinct('foo').to_a
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
around do |spec|
|
15
|
+
Mongo::QueryCache.clear
|
16
|
+
Mongo::QueryCache.cache { spec.run }
|
17
|
+
end
|
18
|
+
|
19
|
+
# These tests do not currently use the session registry because transactions
|
20
|
+
# leak sessions independently of the query cache. This will be resolved by
|
21
|
+
# RUBY-2391.
|
22
|
+
|
23
|
+
let(:subscriber) { EventSubscriber.new }
|
24
|
+
|
25
|
+
let(:client) do
|
26
|
+
authorized_client.tap do |client|
|
27
|
+
client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
before do
|
32
|
+
collection.delete_many
|
33
|
+
|
34
|
+
# Work around https://jira.mongodb.org/browse/HELP-10518
|
35
|
+
client.start_session do |session|
|
36
|
+
session.with_transaction do
|
37
|
+
collection.find({}, session: session).to_a
|
38
|
+
end
|
39
|
+
end
|
40
|
+
subscriber.clear_events!
|
41
|
+
end
|
42
|
+
|
43
|
+
describe 'in transactions' do
|
44
|
+
require_transaction_support
|
45
|
+
require_wired_tiger
|
46
|
+
|
47
|
+
let(:collection) { client['test'] }
|
48
|
+
|
49
|
+
let(:events) do
|
50
|
+
subscriber.command_started_events('find')
|
51
|
+
end
|
52
|
+
|
53
|
+
context 'with convenient API' do
|
54
|
+
context 'when same query is performed inside and outside of transaction' do
|
55
|
+
it 'performs one query' do
|
56
|
+
collection.find.to_a
|
57
|
+
|
58
|
+
session = client.start_session
|
59
|
+
session.with_transaction do
|
60
|
+
collection.find({}, session: session).to_a
|
61
|
+
end
|
62
|
+
|
63
|
+
expect(subscriber.command_started_events('find').length).to eq(1)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
context 'when transaction has a different read concern' do
|
68
|
+
it 'performs two queries' do
|
69
|
+
collection.find.to_a
|
70
|
+
|
71
|
+
session = client.start_session
|
72
|
+
session.with_transaction(
|
73
|
+
read_concern: { level: :snapshot }
|
74
|
+
) do
|
75
|
+
collection.find({}, session: session).to_a
|
76
|
+
end
|
77
|
+
|
78
|
+
expect(subscriber.command_started_events('find').length).to eq(2)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context 'when transaction has a different read preference' do
|
83
|
+
it 'performs two queries' do
|
84
|
+
collection.find.to_a
|
85
|
+
|
86
|
+
session = client.start_session
|
87
|
+
session.with_transaction(
|
88
|
+
read: { mode: :primary }
|
89
|
+
) do
|
90
|
+
collection.find({}, session: session).to_a
|
91
|
+
end
|
92
|
+
|
93
|
+
expect(subscriber.command_started_events('find').length).to eq(2)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
context 'when transaction is committed' do
|
98
|
+
it 'clears the cache' do
|
99
|
+
session = client.start_session
|
100
|
+
session.with_transaction do
|
101
|
+
collection.insert_one({ test: 1 }, session: session)
|
102
|
+
collection.insert_one({ test: 2 }, session: session)
|
103
|
+
|
104
|
+
expect(collection.find({}, session: session).to_a.length).to eq(2)
|
105
|
+
expect(collection.find({}, session: session).to_a.length).to eq(2)
|
106
|
+
|
107
|
+
# The driver caches the queries within the transaction
|
108
|
+
expect(subscriber.command_started_events('find').length).to eq(1)
|
109
|
+
session.commit_transaction
|
110
|
+
end
|
111
|
+
|
112
|
+
expect(collection.find.to_a.length).to eq(2)
|
113
|
+
|
114
|
+
# The driver clears the cache and runs the query again
|
115
|
+
expect(subscriber.command_started_events('find').length).to eq(2)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
context 'when transaction is aborted' do
|
120
|
+
it 'clears the cache' do
|
121
|
+
session = client.start_session
|
122
|
+
session.with_transaction do
|
123
|
+
collection.insert_one({ test: 1 }, session: session)
|
124
|
+
collection.insert_one({ test: 2 }, session: session)
|
125
|
+
|
126
|
+
expect(collection.find({}, session: session).to_a.length).to eq(2)
|
127
|
+
expect(collection.find({}, session: session).to_a.length).to eq(2)
|
128
|
+
|
129
|
+
# The driver caches the queries within the transaction
|
130
|
+
expect(subscriber.command_started_events('find').length).to eq(1)
|
131
|
+
session.abort_transaction
|
132
|
+
end
|
133
|
+
|
134
|
+
expect(collection.find.to_a.length).to eq(0)
|
135
|
+
|
136
|
+
# The driver clears the cache and runs the query again
|
137
|
+
expect(subscriber.command_started_events('find').length).to eq(2)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
context 'with low-level API' do
|
143
|
+
context 'when transaction is committed' do
|
144
|
+
it 'clears the cache' do
|
145
|
+
session = client.start_session
|
146
|
+
session.start_transaction
|
147
|
+
|
148
|
+
collection.insert_one({ test: 1 }, session: session)
|
149
|
+
collection.insert_one({ test: 2 }, session: session)
|
150
|
+
|
151
|
+
expect(collection.find({}, session: session).to_a.length).to eq(2)
|
152
|
+
expect(collection.find({}, session: session).to_a.length).to eq(2)
|
153
|
+
|
154
|
+
# The driver caches the queries within the transaction
|
155
|
+
expect(subscriber.command_started_events('find').length).to eq(1)
|
156
|
+
|
157
|
+
session.commit_transaction
|
158
|
+
|
159
|
+
expect(collection.find.to_a.length).to eq(2)
|
160
|
+
|
161
|
+
# The driver clears the cache and runs the query again
|
162
|
+
expect(subscriber.command_started_events('find').length).to eq(2)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
context 'when transaction is aborted' do
|
167
|
+
it 'clears the cache' do
|
168
|
+
session = client.start_session
|
169
|
+
session.start_transaction
|
170
|
+
|
171
|
+
collection.insert_one({ test: 1 }, session: session)
|
172
|
+
collection.insert_one({ test: 2 }, session: session)
|
173
|
+
|
174
|
+
expect(collection.find({}, session: session).to_a.length).to eq(2)
|
175
|
+
expect(collection.find({}, session: session).to_a.length).to eq(2)
|
176
|
+
|
177
|
+
# The driver caches the queries within the transaction
|
178
|
+
expect(subscriber.command_started_events('find').length).to eq(1)
|
179
|
+
|
180
|
+
session.abort_transaction
|
181
|
+
|
182
|
+
expect(collection.find.to_a.length).to eq(0)
|
183
|
+
|
184
|
+
# The driver clears the cache and runs the query again
|
185
|
+
expect(subscriber.command_started_events('find').length).to eq(2)
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
@@ -65,7 +65,7 @@ describe 'Client after reconnect' do
|
|
65
65
|
end
|
66
66
|
|
67
67
|
let(:client) do
|
68
|
-
new_local_client(uri, SpecConfig.instance.
|
68
|
+
new_local_client(uri, SpecConfig.instance.monitoring_options.merge(
|
69
69
|
server_selection_timeout: 3.86, logger: logger))
|
70
70
|
end
|
71
71
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe 'SDAM error handling' do
|
4
|
-
|
4
|
+
clean_slate
|
5
5
|
|
6
6
|
after do
|
7
7
|
# Close all clients after every test to avoid leaking expectations into
|
@@ -19,6 +19,7 @@ describe 'SDAM error handling' do
|
|
19
19
|
new_local_client(SpecConfig.instance.addresses,
|
20
20
|
SpecConfig.instance.all_test_options.merge(
|
21
21
|
socket_timeout: 3, connect_timeout: 3,
|
22
|
+
heartbeat_frequency: 100,
|
22
23
|
# Uncomment to print all events to stdout:
|
23
24
|
#sdam_proc: Utils.subscribe_all_sdam_proc(diagnostic_subscriber),
|
24
25
|
**Utils.disable_retries_client_options)
|
@@ -28,6 +29,14 @@ describe 'SDAM error handling' do
|
|
28
29
|
let(:server) { client.cluster.next_primary }
|
29
30
|
|
30
31
|
shared_examples_for 'marks server unknown' do
|
32
|
+
before do
|
33
|
+
server.monitor.stop!
|
34
|
+
end
|
35
|
+
|
36
|
+
after do
|
37
|
+
client.close
|
38
|
+
end
|
39
|
+
|
31
40
|
it 'marks server unknown' do
|
32
41
|
expect(server).not_to be_unknown
|
33
42
|
RSpec::Mocks.with_temporary_scope do
|
@@ -38,6 +47,14 @@ describe 'SDAM error handling' do
|
|
38
47
|
end
|
39
48
|
|
40
49
|
shared_examples_for 'does not mark server unknown' do
|
50
|
+
before do
|
51
|
+
server.monitor.stop!
|
52
|
+
end
|
53
|
+
|
54
|
+
after do
|
55
|
+
client.close
|
56
|
+
end
|
57
|
+
|
41
58
|
it 'does not mark server unknown' do
|
42
59
|
expect(server).not_to be_unknown
|
43
60
|
RSpec::Mocks.with_temporary_scope do
|
@@ -197,6 +214,74 @@ describe 'SDAM error handling' do
|
|
197
214
|
end
|
198
215
|
end
|
199
216
|
|
217
|
+
describe 'when there is an error during connection establishment' do
|
218
|
+
require_topology :single
|
219
|
+
|
220
|
+
# The push monitor creates sockets unpredictably and interferes with this
|
221
|
+
# test.
|
222
|
+
max_server_version '4.2'
|
223
|
+
|
224
|
+
# When TLS is used there are two socket classes and we can't simply
|
225
|
+
# mock the base Socket class.
|
226
|
+
require_no_tls
|
227
|
+
|
228
|
+
{
|
229
|
+
SystemCallError => Mongo::Error::SocketError,
|
230
|
+
Errno::ETIMEDOUT => Mongo::Error::SocketTimeoutError,
|
231
|
+
}.each do |raw_error_cls, mapped_error_cls|
|
232
|
+
context raw_error_cls.name do
|
233
|
+
let(:socket) do
|
234
|
+
double('mock socket').tap do |socket|
|
235
|
+
allow(socket).to receive(:set_encoding)
|
236
|
+
allow(socket).to receive(:setsockopt)
|
237
|
+
allow(socket).to receive(:getsockopt)
|
238
|
+
allow(socket).to receive(:connect)
|
239
|
+
allow(socket).to receive(:close)
|
240
|
+
socket.should receive(:write).and_raise(raw_error_cls, 'mocked failure')
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
it 'marks server unknown' do
|
245
|
+
server = client.cluster.next_primary
|
246
|
+
client.cluster.servers.map(&:disconnect!)
|
247
|
+
|
248
|
+
RSpec::Mocks.with_temporary_scope do
|
249
|
+
|
250
|
+
Socket.should receive(:new).with(any_args).ordered.once.and_return(socket)
|
251
|
+
|
252
|
+
lambda do
|
253
|
+
client.command(ping: 1)
|
254
|
+
end.should raise_error(mapped_error_cls, /mocked failure/)
|
255
|
+
|
256
|
+
server.should be_unknown
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
it 'recovers' do
|
261
|
+
server = client.cluster.next_primary
|
262
|
+
# If we do not kill the monitor, the client will recover automatically.
|
263
|
+
|
264
|
+
RSpec::Mocks.with_temporary_scope do
|
265
|
+
|
266
|
+
Socket.should receive(:new).with(any_args).ordered.once.and_return(socket)
|
267
|
+
Socket.should receive(:new).with(any_args).ordered.once.and_call_original
|
268
|
+
|
269
|
+
lambda do
|
270
|
+
client.command(ping: 1)
|
271
|
+
end.should raise_error(mapped_error_cls, /mocked failure/)
|
272
|
+
|
273
|
+
client.command(ping: 1)
|
274
|
+
end
|
275
|
+
end
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
279
|
+
after do
|
280
|
+
# Since we stopped monitoring on the client, close it.
|
281
|
+
ClientRegistry.instance.close_all_clients
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
200
285
|
describe 'when there is an error on monitoring connection' do
|
201
286
|
clean_slate_for_all
|
202
287
|
|
@@ -67,9 +67,8 @@ describe 'SDAM events' do
|
|
67
67
|
started_events.length.should <= 10
|
68
68
|
|
69
69
|
succeeded_events = subscriber.select_succeeded_events(Mongo::Monitoring::Event::ServerHeartbeatSucceeded)
|
70
|
-
|
71
|
-
|
72
|
-
started_events.length.should == succeeded_events.length
|
70
|
+
started_events.length.should > 1
|
71
|
+
(succeeded_events.length..succeeded_events.length+1).should include(started_events.length)
|
73
72
|
end
|
74
73
|
end
|
75
74
|
|
@@ -105,10 +104,12 @@ describe 'SDAM events' do
|
|
105
104
|
(succeeded_awaited = events.select(&:awaited?)).should_not be_empty
|
106
105
|
(succeeded_regular = events.reject(&:awaited?)).should_not be_empty
|
107
106
|
|
108
|
-
#
|
109
|
-
#
|
110
|
-
started_awaited.length.should
|
111
|
-
|
107
|
+
# There may be in-flight ismasters that don't complete, both
|
108
|
+
# regular and awaited.
|
109
|
+
started_awaited.length.should > 1
|
110
|
+
(succeeded_awaited.length..succeeded_awaited.length+1).should include(started_awaited.length)
|
111
|
+
started_regular.length.should > 1
|
112
|
+
(succeeded_regular.length..succeeded_regular.length+1).should include(started_regular.length)
|
112
113
|
end
|
113
114
|
end
|
114
115
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Server selection' do
|
4
|
+
context 'replica set' do
|
5
|
+
require_topology :replica_set
|
6
|
+
# 2.6 server does not provide replSetGetConfig and hence we cannot add
|
7
|
+
# the tags to the members.
|
8
|
+
min_server_version '3.0'
|
9
|
+
|
10
|
+
context 'when mixed case tag names are used' do
|
11
|
+
# For simplicity this test assumes our Evergreen configuration:
|
12
|
+
# nodes are started from port 27017 onwards and there are more than
|
13
|
+
# one of them.
|
14
|
+
|
15
|
+
let(:desired_index) do
|
16
|
+
if authorized_client.cluster.next_primary.address.port == 27017
|
17
|
+
1
|
18
|
+
else
|
19
|
+
0
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
let(:client) do
|
24
|
+
new_local_client(SpecConfig.instance.addresses,
|
25
|
+
SpecConfig.instance.authorized_test_options.merge(
|
26
|
+
server_selection_timeout: 4,
|
27
|
+
read: {mode: :secondary, tag_sets: [nodeIndex: desired_index.to_s]},
|
28
|
+
))
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'selects the server' do
|
32
|
+
client['nonexistent'].count.should == 0
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -62,30 +62,31 @@ describe 'BSON & command size limits' do
|
|
62
62
|
authorized_collection.insert_one(document)
|
63
63
|
end
|
64
64
|
|
65
|
-
|
66
|
-
|
65
|
+
it 'fails on the driver when a document larger than 16MiB is inserted' do
|
66
|
+
document = { key: 'a' * (max_document_size - 27), _id: 'foo' }
|
67
|
+
expect(document.to_bson.length).to eq(max_document_size+1)
|
67
68
|
|
68
|
-
|
69
|
-
document
|
70
|
-
|
71
|
-
|
72
|
-
lambda do
|
73
|
-
authorized_collection.insert_one(document)
|
74
|
-
end.should raise_error(Mongo::Error::MaxBSONSize, /The document exceeds maximum allowed BSON object size after serialization/)
|
75
|
-
end
|
69
|
+
lambda do
|
70
|
+
authorized_collection.insert_one(document)
|
71
|
+
end.should raise_error(Mongo::Error::MaxBSONSize, /The document exceeds maximum allowed BSON object size after serialization/)
|
76
72
|
end
|
77
73
|
|
78
|
-
|
79
|
-
|
74
|
+
it 'fails on the driver when an update larger than 16MiB is performed' do
|
75
|
+
document = { key: 'a' * (max_document_size - 14) }
|
76
|
+
expect(document.to_bson.length).to eq(max_document_size+1)
|
77
|
+
|
78
|
+
lambda do
|
79
|
+
authorized_collection.update_one({ _id: 'foo' }, document)
|
80
|
+
end.should raise_error(Mongo::Error::MaxBSONSize, /The document exceeds maximum allowed BSON object size after serialization/)
|
81
|
+
end
|
80
82
|
|
81
|
-
|
82
|
-
|
83
|
-
|
83
|
+
it 'fails on the driver when an delete larger than 16MiB is performed' do
|
84
|
+
document = { key: 'a' * (max_document_size - 14) }
|
85
|
+
expect(document.to_bson.length).to eq(max_document_size+1)
|
84
86
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
end
|
87
|
+
lambda do
|
88
|
+
authorized_collection.delete_one(document)
|
89
|
+
end.should raise_error(Mongo::Error::MaxBSONSize, /The document exceeds maximum allowed BSON object size after serialization/)
|
89
90
|
end
|
90
91
|
|
91
92
|
it 'fails in the driver when a document larger than 16MiB+16KiB is inserted' do
|