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
data/lib/mongo/cluster.rb
CHANGED
@@ -107,6 +107,11 @@ module Mongo
|
|
107
107
|
# for the server monitor to refresh its description via ismaster.
|
108
108
|
# @option options [ Hash ] :resolv_options For internal driver use only.
|
109
109
|
# Options to pass through to Resolv::DNS constructor for SRV lookups.
|
110
|
+
# @option options [ Hash ] :server_api The requested server API version.
|
111
|
+
# This hash can have the following items:
|
112
|
+
# - *:version* -- string
|
113
|
+
# - *:strict* -- boolean
|
114
|
+
# - *:deprecation_errors* -- boolean
|
110
115
|
#
|
111
116
|
# @since 2.0.0
|
112
117
|
def initialize(seeds, monitoring, options = Options::Redacted.new)
|
@@ -129,7 +134,9 @@ module Mongo
|
|
129
134
|
@servers = []
|
130
135
|
@monitoring = monitoring
|
131
136
|
@event_listeners = Event::Listeners.new
|
132
|
-
@app_metadata = Server::AppMetadata.new(@options)
|
137
|
+
@app_metadata = Server::AppMetadata.new(@options.merge(purpose: :application))
|
138
|
+
@monitor_app_metadata = Server::Monitor::AppMetadata.new(@options.merge(purpose: :monitor))
|
139
|
+
@push_monitor_app_metadata = Server::Monitor::AppMetadata.new(@options.merge(purpose: :push_monitor))
|
133
140
|
@cluster_time_lock = Mutex.new
|
134
141
|
@cluster_time = nil
|
135
142
|
@srv_monitor_lock = Mutex.new
|
@@ -199,9 +206,6 @@ module Mongo
|
|
199
206
|
@cursor_reaper, @socket_reaper,
|
200
207
|
], options)
|
201
208
|
|
202
|
-
ObjectSpace.define_finalizer(self, self.class.finalize(
|
203
|
-
{}, @periodic_executor, @session_pool))
|
204
|
-
|
205
209
|
@periodic_executor.run!
|
206
210
|
end
|
207
211
|
|
@@ -244,7 +248,11 @@ module Mongo
|
|
244
248
|
# the servers list above and the wait call below, we should not
|
245
249
|
# wait for the full remaining time - wait for up to 1 second, then
|
246
250
|
# recheck the state.
|
247
|
-
|
251
|
+
begin
|
252
|
+
server_selection_semaphore.wait([time_remaining, 1].min)
|
253
|
+
rescue ::Timeout::Error
|
254
|
+
# nothing
|
255
|
+
end
|
248
256
|
end
|
249
257
|
end
|
250
258
|
|
@@ -288,6 +296,12 @@ module Mongo
|
|
288
296
|
# @since 2.4.0
|
289
297
|
attr_reader :app_metadata
|
290
298
|
|
299
|
+
# @api private
|
300
|
+
attr_reader :monitor_app_metadata
|
301
|
+
|
302
|
+
# @api private
|
303
|
+
attr_reader :push_monitor_app_metadata
|
304
|
+
|
291
305
|
# @return [ Array<String> ] The addresses of seed servers. Contains
|
292
306
|
# addresses that were given to Cluster when it was instantiated, not
|
293
307
|
# current addresses that the cluster is using as a result of SDAM.
|
@@ -445,25 +459,6 @@ module Mongo
|
|
445
459
|
# @api private
|
446
460
|
attr_reader :server_selection_semaphore
|
447
461
|
|
448
|
-
# Finalize the cluster for garbage collection.
|
449
|
-
#
|
450
|
-
# @example Finalize the cluster.
|
451
|
-
# Cluster.finalize(pools)
|
452
|
-
#
|
453
|
-
# @param [ Hash<Address, Server::ConnectionPool> ] pools Ignored.
|
454
|
-
# @param [ PeriodicExecutor ] periodic_executor The periodic executor.
|
455
|
-
# @param [ SessionPool ] session_pool The session pool.
|
456
|
-
#
|
457
|
-
# @return [ Proc ] The Finalizer.
|
458
|
-
#
|
459
|
-
# @since 2.2.0
|
460
|
-
def self.finalize(pools, periodic_executor, session_pool)
|
461
|
-
proc do
|
462
|
-
session_pool.end_sessions
|
463
|
-
periodic_executor.stop!
|
464
|
-
end
|
465
|
-
end
|
466
|
-
|
467
462
|
# Closes the cluster.
|
468
463
|
#
|
469
464
|
# @note Applications should call Client#close to disconnect from
|
@@ -950,13 +945,9 @@ module Mongo
|
|
950
945
|
# Start SRV monitor
|
951
946
|
@srv_monitor_lock.synchronize do
|
952
947
|
unless @srv_monitor
|
953
|
-
monitor_options = options.merge(
|
954
|
-
timeout: options[:connect_timeout] || Server::CONNECT_TIMEOUT)
|
955
|
-
@srv_monitor = _srv_monitor = Srv::Monitor.new(self, monitor_options)
|
956
|
-
finalizer = lambda do
|
957
|
-
_srv_monitor.stop!
|
958
|
-
end
|
959
|
-
ObjectSpace.define_finalizer(self, finalizer)
|
948
|
+
monitor_options = Utils.shallow_symbolize_keys(options.merge(
|
949
|
+
timeout: options[:connect_timeout] || Server::CONNECT_TIMEOUT))
|
950
|
+
@srv_monitor = _srv_monitor = Srv::Monitor.new(self, **monitor_options)
|
960
951
|
end
|
961
952
|
@srv_monitor.run!
|
962
953
|
end
|
@@ -130,16 +130,20 @@ module Mongo
|
|
130
130
|
end
|
131
131
|
|
132
132
|
to_kill_copy.each do |server, op_specs|
|
133
|
+
options = {
|
134
|
+
server_api: server.options[:server_api],
|
135
|
+
}
|
136
|
+
context = Operation::Context.new(options: options)
|
133
137
|
op_specs.each do |op_spec|
|
134
138
|
if server.features.find_command_enabled?
|
135
139
|
Cursor::Builder::KillCursorsCommand.update_cursors(op_spec, active_cursors_copy.to_a)
|
136
140
|
if Cursor::Builder::KillCursorsCommand.get_cursors_list(op_spec).size > 0
|
137
|
-
Operation::KillCursors.new(op_spec).execute(server,
|
141
|
+
Operation::KillCursors.new(op_spec).execute(server, context: context)
|
138
142
|
end
|
139
143
|
else
|
140
144
|
Cursor::Builder::OpKillCursors.update_cursors(op_spec, active_cursors_copy.to_a)
|
141
145
|
if Cursor::Builder::OpKillCursors.get_cursors_list(op_spec).size > 0
|
142
|
-
Operation::KillCursors.new(op_spec).execute(server,
|
146
|
+
Operation::KillCursors.new(op_spec).execute(server, context: context)
|
143
147
|
end
|
144
148
|
end
|
145
149
|
end
|
@@ -178,6 +178,7 @@ class Mongo::Cluster
|
|
178
178
|
raise ArgumentError, "Unknown topology #{topology.class}"
|
179
179
|
end
|
180
180
|
|
181
|
+
verify_invariants
|
181
182
|
commit_changes
|
182
183
|
disconnect_servers
|
183
184
|
end
|
@@ -363,6 +364,9 @@ class Mongo::Cluster
|
|
363
364
|
end
|
364
365
|
end
|
365
366
|
end
|
367
|
+
|
368
|
+
verify_invariants
|
369
|
+
|
366
370
|
added_servers
|
367
371
|
end
|
368
372
|
|
@@ -599,5 +603,15 @@ class Mongo::Cluster
|
|
599
603
|
|
600
604
|
@previous_server_descriptions != server_descriptions
|
601
605
|
end
|
606
|
+
|
607
|
+
def verify_invariants
|
608
|
+
if Mongo::Lint.enabled?
|
609
|
+
if cluster.topology.single?
|
610
|
+
if cluster.servers_list.length > 1
|
611
|
+
raise Mongo::Error::LintError, "Trying to create a single topology with multiple servers: #{cluster.servers_list}"
|
612
|
+
end
|
613
|
+
end
|
614
|
+
end
|
615
|
+
end
|
602
616
|
end
|
603
617
|
end
|
@@ -133,7 +133,7 @@ module Mongo
|
|
133
133
|
|
134
134
|
def validate_options(options, cluster)
|
135
135
|
if cluster.servers_list.length > 1
|
136
|
-
raise ArgumentError,
|
136
|
+
raise ArgumentError, "Cannot instantiate a single topology with more than one server in the cluster: #{cluster.servers_list.map(&:address).map(&:seed).join(', ')}"
|
137
137
|
end
|
138
138
|
|
139
139
|
super(options, cluster)
|
data/lib/mongo/collection.rb
CHANGED
@@ -223,6 +223,7 @@ module Mongo
|
|
223
223
|
# @param [ Hash ] opts The options for the create operation.
|
224
224
|
#
|
225
225
|
# @option options [ Session ] :session The session to use for the operation.
|
226
|
+
# @option opts [ Hash ] :write_concern The write concern options.
|
226
227
|
#
|
227
228
|
# @return [ Result ] The result of the command.
|
228
229
|
#
|
@@ -239,6 +240,11 @@ module Mongo
|
|
239
240
|
operation.delete(:write)
|
240
241
|
operation.delete(:write_concern)
|
241
242
|
client.send(:with_session, opts) do |session|
|
243
|
+
write_concern = if opts[:write_concern]
|
244
|
+
WriteConcern.get(opts[:write_concern])
|
245
|
+
else
|
246
|
+
self.write_concern
|
247
|
+
end
|
242
248
|
server = next_primary(nil, session)
|
243
249
|
if (options[:collation] || options[Operation::COLLATION]) && !server.with_connection { |connection| connection.features }.collation_enabled?
|
244
250
|
raise Error::UnsupportedCollation
|
@@ -248,8 +254,8 @@ module Mongo
|
|
248
254
|
selector: operation,
|
249
255
|
db_name: database.name,
|
250
256
|
write_concern: write_concern,
|
251
|
-
session: session
|
252
|
-
}).execute(server, client: client)
|
257
|
+
session: session,
|
258
|
+
}).execute(server, context: Operation::Context.new(client: client, session: session))
|
253
259
|
end
|
254
260
|
end
|
255
261
|
|
@@ -264,22 +270,33 @@ module Mongo
|
|
264
270
|
# @param [ Hash ] opts The options for the drop operation.
|
265
271
|
#
|
266
272
|
# @option options [ Session ] :session The session to use for the operation.
|
273
|
+
# @option opts [ Hash ] :write_concern The write concern options.
|
267
274
|
#
|
268
275
|
# @return [ Result ] The result of the command.
|
269
276
|
#
|
270
277
|
# @since 2.0.0
|
271
278
|
def drop(opts = {})
|
272
279
|
client.send(:with_session, opts) do |session|
|
280
|
+
temp_write_concern = write_concern
|
281
|
+
write_concern = if opts[:write_concern]
|
282
|
+
WriteConcern.get(opts[:write_concern])
|
283
|
+
else
|
284
|
+
temp_write_concern
|
285
|
+
end
|
273
286
|
Operation::Drop.new({
|
274
287
|
selector: { :drop => name },
|
275
288
|
db_name: database.name,
|
276
289
|
write_concern: write_concern,
|
277
|
-
session: session
|
278
|
-
}).execute(next_primary(nil, session), client: client)
|
290
|
+
session: session,
|
291
|
+
}).execute(next_primary(nil, session), context: Operation::Context.new(client: client, session: session))
|
279
292
|
end
|
280
293
|
rescue Error::OperationFailure => ex
|
281
|
-
|
282
|
-
|
294
|
+
# NamespaceNotFound
|
295
|
+
if ex.code == 26 || ex.code.nil? && ex.message =~ /ns not found/
|
296
|
+
false
|
297
|
+
else
|
298
|
+
raise
|
299
|
+
end
|
283
300
|
end
|
284
301
|
|
285
302
|
# Find documents in the collection.
|
@@ -400,7 +417,7 @@ module Mongo
|
|
400
417
|
View::ChangeStream.new(View.new(self, {}, options), pipeline, nil, options)
|
401
418
|
end
|
402
419
|
|
403
|
-
# Gets
|
420
|
+
# Gets an estimated number of matching documents in the collection.
|
404
421
|
#
|
405
422
|
# @example Get the count.
|
406
423
|
# collection.count(name: 1)
|
@@ -429,11 +446,13 @@ module Mongo
|
|
429
446
|
View.new(self, filter || {}, options).count(options)
|
430
447
|
end
|
431
448
|
|
432
|
-
# Gets the number of
|
433
|
-
# method, this will return the exact number of documents matching
|
449
|
+
# Gets the number of documents matching the query. Unlike the deprecated
|
450
|
+
# #count method, this will return the exact number of documents matching
|
451
|
+
# the filter (or exact number of documents in the collection, if no filter
|
452
|
+
# is provided) rather than an estimate.
|
434
453
|
#
|
435
|
-
#
|
436
|
-
#
|
454
|
+
# Use #estimated_document_count to retrieve an estimate of the number
|
455
|
+
# of documents in the collection using the collection metadata.
|
437
456
|
#
|
438
457
|
# @param [ Hash ] filter A filter for matching documents.
|
439
458
|
# @param [ Hash ] options Options for the operation.
|
@@ -454,15 +473,16 @@ module Mongo
|
|
454
473
|
View.new(self, filter, options).count_documents(options)
|
455
474
|
end
|
456
475
|
|
457
|
-
# Gets an estimate of the
|
476
|
+
# Gets an estimate of the number of documents in the collection using the
|
477
|
+
# collection metadata.
|
458
478
|
#
|
459
|
-
#
|
460
|
-
#
|
479
|
+
# Use #count_documents to retrieve the exact number of documents in the
|
480
|
+
# collection, or to count documents matching a filter.
|
461
481
|
#
|
462
482
|
# @param [ Hash ] options Options for the operation.
|
463
483
|
#
|
464
|
-
# @option opts :max_time_ms [ Integer ] The maximum amount of time to allow
|
465
|
-
# run.
|
484
|
+
# @option opts :max_time_ms [ Integer ] The maximum amount of time to allow
|
485
|
+
# the command to run for on the server.
|
466
486
|
# @option opts [ Hash ] :read The read preference options.
|
467
487
|
#
|
468
488
|
# @return [ Integer ] The document count.
|
@@ -536,12 +556,19 @@ module Mongo
|
|
536
556
|
#
|
537
557
|
# @since 2.0.0
|
538
558
|
def insert_one(document, opts = {})
|
559
|
+
QueryCache.clear_namespace(namespace)
|
560
|
+
|
539
561
|
client.send(:with_session, opts) do |session|
|
540
562
|
write_concern = if opts[:write_concern]
|
541
563
|
WriteConcern.get(opts[:write_concern])
|
542
564
|
else
|
543
565
|
write_concern_with_session(session)
|
544
566
|
end
|
567
|
+
|
568
|
+
if document.nil?
|
569
|
+
raise ArgumentError, "Document to be inserted cannot be nil"
|
570
|
+
end
|
571
|
+
|
545
572
|
write_with_retry(session, write_concern) do |server, txn_num|
|
546
573
|
Operation::Insert.new(
|
547
574
|
:documents => [ document ],
|
@@ -552,8 +579,8 @@ module Mongo
|
|
552
579
|
:options => opts,
|
553
580
|
:id_generator => client.options[:id_generator],
|
554
581
|
:session => session,
|
555
|
-
:txn_num => txn_num
|
556
|
-
).execute(server, client: client)
|
582
|
+
:txn_num => txn_num,
|
583
|
+
).execute(server, context: Operation::Context.new(client: client, session: session))
|
557
584
|
end
|
558
585
|
end
|
559
586
|
end
|
@@ -566,12 +593,16 @@ module Mongo
|
|
566
593
|
# @param [ Array<Hash> ] documents The documents to insert.
|
567
594
|
# @param [ Hash ] options The insert options.
|
568
595
|
#
|
596
|
+
# @option options [ true | false ] :ordered Whether the operations
|
597
|
+
# should be executed in order.
|
569
598
|
# @option options [ Session ] :session The session to use for the operation.
|
570
599
|
#
|
571
600
|
# @return [ Result ] The database response wrapper.
|
572
601
|
#
|
573
602
|
# @since 2.0.0
|
574
603
|
def insert_many(documents, options = {})
|
604
|
+
QueryCache.clear_namespace(namespace)
|
605
|
+
|
575
606
|
inserts = documents.map{ |doc| { :insert_one => doc }}
|
576
607
|
bulk_write(inserts, options)
|
577
608
|
end
|
@@ -854,5 +885,14 @@ module Mongo
|
|
854
885
|
def namespace
|
855
886
|
"#{database.name}.#{name}"
|
856
887
|
end
|
888
|
+
|
889
|
+
# Whether the collection is a system collection.
|
890
|
+
#
|
891
|
+
# @return [ Boolean ] Whether the system is a system collection.
|
892
|
+
#
|
893
|
+
# @api private
|
894
|
+
def system_collection?
|
895
|
+
name.start_with?('system.')
|
896
|
+
end
|
857
897
|
end
|
858
898
|
end
|
@@ -120,27 +120,31 @@ module Mongo
|
|
120
120
|
# server can write temporary data to disk while executing the find
|
121
121
|
# operation. This option is only available on MongoDB server versions
|
122
122
|
# 4.4 and newer.
|
123
|
-
# @option options
|
124
|
-
#
|
125
|
-
# each response from MongoDB.
|
126
|
-
# @option options :projection [ Hash ] The fields to include or exclude in
|
127
|
-
# returned docs.
|
128
|
-
# @option options :hint [ Hash ] Override default index selection and force
|
129
|
-
# MongoDB to use a specific index for the query.
|
130
|
-
# @option options :limit [ Integer ] Max number of docs to return.
|
131
|
-
# @option options :max_scan [ Integer ] Constrain the query to only scan the
|
132
|
-
# specified number of docs. Use to prevent queries from running too long.
|
133
|
-
# Deprecated as of MongoDB server version 4.0.
|
134
|
-
# @option options :read [ Symbol ] The read preference to use for the query.
|
135
|
-
# If none is provided, the collection's default read preference is used.
|
136
|
-
# @option options :show_disk_loc [ true, false ] Return disk location info as
|
137
|
-
# a field in each doc.
|
138
|
-
# @option options :skip [ Integer ] The number of documents to skip.
|
139
|
-
# @option options :snapshot [ true, false ] Prevents returning a doc more than
|
140
|
-
# once. Deprecated as of MongoDB server version 4.0.
|
141
|
-
# @option options :sort [ Hash ] The key and direction pairs used to sort the
|
142
|
-
# results.
|
123
|
+
# @option options [ Integer ] :batch_size The number of documents to
|
124
|
+
# return in each response from MongoDB.
|
143
125
|
# @option options [ Hash ] :collation The collation to use.
|
126
|
+
# @option options [ String ] :comment Associate a comment with the query.
|
127
|
+
# @option options [ Hash ] :explain Execute an explain with the provided
|
128
|
+
# explain options (known options are :verbose and :verbosity) rather
|
129
|
+
# than a find.
|
130
|
+
# @option options [ Hash ] :hint Override the default index selection and
|
131
|
+
# force MongoDB to use a specific index for the query.
|
132
|
+
# @option options [ Integer ] :limit Max number of documents to return.
|
133
|
+
# @option options [ Integer ] :max_scan Constrain the query to only scan
|
134
|
+
# the specified number of documents. Use to prevent queries from
|
135
|
+
# running for too long. Deprecated as of MongoDB server version 4.0.
|
136
|
+
# @option options [ Hash ] :projection The fields to include or exclude
|
137
|
+
# in the returned documents.
|
138
|
+
# @option options [ Hash ] :read The read preference to use for the
|
139
|
+
# query. If none is provided, the collection's default read preference
|
140
|
+
# is used.
|
141
|
+
# @option options [ true | false ] :show_disk_loc Return disk location
|
142
|
+
# info as a field in each doc.
|
143
|
+
# @option options [ Integer ] :skip The number of documents to skip.
|
144
|
+
# @option options [ true | false ] :snapshot Prevents returning a
|
145
|
+
# document more than once. Deprecated as of MongoDB server version 4.0.
|
146
|
+
# @option options [ Hash ] :sort The key and direction pairs used to sort
|
147
|
+
# the results.
|
144
148
|
#
|
145
149
|
# @since 2.0.0
|
146
150
|
def initialize(collection, filter = {}, options = {})
|
@@ -89,6 +89,16 @@ module Mongo
|
|
89
89
|
self.class.new(view, pipeline, options.merge(explain: true)).first
|
90
90
|
end
|
91
91
|
|
92
|
+
# Whether this aggregation will write its result to a database collection.
|
93
|
+
#
|
94
|
+
# @return [ Boolean ] Whether the aggregation will write its result
|
95
|
+
# to a collection.
|
96
|
+
#
|
97
|
+
# @api private
|
98
|
+
def write?
|
99
|
+
pipeline.any? { |op| op.key?('$out') || op.key?(:$out) || op.key?('$merge') || op.key?(:$merge) }
|
100
|
+
end
|
101
|
+
|
92
102
|
private
|
93
103
|
|
94
104
|
def server_selector
|
@@ -114,10 +124,6 @@ module Mongo
|
|
114
124
|
description.standalone? || description.mongos? || description.primary? || secondary_ok?
|
115
125
|
end
|
116
126
|
|
117
|
-
def write?
|
118
|
-
pipeline.any? { |op| op.key?('$out') || op.key?(:$out) || op.key?('$merge') || op.key?(:$merge) }
|
119
|
-
end
|
120
|
-
|
121
127
|
def secondary_ok?
|
122
128
|
!write?
|
123
129
|
end
|
@@ -128,7 +134,7 @@ module Mongo
|
|
128
134
|
server = cluster.next_primary(nil, session)
|
129
135
|
end
|
130
136
|
validate_collation!(server)
|
131
|
-
initial_query_op(session).execute(server, client: client)
|
137
|
+
initial_query_op(session).execute(server, context: Operation::Context.new(client: client, session: session))
|
132
138
|
end
|
133
139
|
|
134
140
|
def validate_collation!(server)
|
@@ -136,6 +142,21 @@ module Mongo
|
|
136
142
|
raise Error::UnsupportedCollation.new
|
137
143
|
end
|
138
144
|
end
|
145
|
+
|
146
|
+
# Skip, sort, limit, projection are specified as pipeline stages
|
147
|
+
# rather than as options.
|
148
|
+
def cache_options
|
149
|
+
{
|
150
|
+
namespace: collection.namespace,
|
151
|
+
selector: pipeline,
|
152
|
+
read_concern: view.read_concern,
|
153
|
+
read_preference: view.read_preference,
|
154
|
+
collation: options[:collation],
|
155
|
+
# Aggregations can read documents from more than one collection,
|
156
|
+
# so they will be cleared on every write operation.
|
157
|
+
multi_collection: true,
|
158
|
+
}
|
159
|
+
end
|
139
160
|
end
|
140
161
|
end
|
141
162
|
end
|