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/auth/user/view.rb
CHANGED
@@ -44,13 +44,13 @@ module Mongo
|
|
44
44
|
# @since 2.0.0
|
45
45
|
def create(user_or_name, options = {})
|
46
46
|
user = generate(user_or_name, options)
|
47
|
-
|
47
|
+
execute_operation(options) do |session|
|
48
48
|
Operation::CreateUser.new(
|
49
49
|
user: user,
|
50
50
|
db_name: database.name,
|
51
51
|
session: session,
|
52
52
|
write_concern: options[:write_concern] && WriteConcern.get(options[:write_concern]),
|
53
|
-
)
|
53
|
+
)
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
@@ -81,13 +81,13 @@ module Mongo
|
|
81
81
|
#
|
82
82
|
# @since 2.0.0
|
83
83
|
def remove(name, options = {})
|
84
|
-
|
84
|
+
execute_operation(options) do |session|
|
85
85
|
Operation::RemoveUser.new(
|
86
86
|
user_name: name,
|
87
87
|
db_name: database.name,
|
88
88
|
session: session,
|
89
89
|
write_concern: options[:write_concern] && WriteConcern.get(options[:write_concern]),
|
90
|
-
)
|
90
|
+
)
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
@@ -106,14 +106,14 @@ module Mongo
|
|
106
106
|
#
|
107
107
|
# @since 2.0.0
|
108
108
|
def update(user_or_name, options = {})
|
109
|
-
|
110
|
-
|
109
|
+
user = generate(user_or_name, options)
|
110
|
+
execute_operation(options) do |session|
|
111
111
|
Operation::UpdateUser.new(
|
112
112
|
user: user,
|
113
113
|
db_name: database.name,
|
114
114
|
session: session,
|
115
115
|
write_concern: options[:write_concern] && WriteConcern.get(options[:write_concern]),
|
116
|
-
)
|
116
|
+
)
|
117
117
|
end
|
118
118
|
end
|
119
119
|
|
@@ -137,18 +137,25 @@ module Mongo
|
|
137
137
|
private
|
138
138
|
|
139
139
|
def user_query(name, options = {})
|
140
|
-
|
140
|
+
execute_operation(options) do |session|
|
141
141
|
Operation::UsersInfo.new(
|
142
142
|
user_name: name,
|
143
143
|
db_name: database.name,
|
144
144
|
session: session
|
145
|
-
)
|
145
|
+
)
|
146
146
|
end
|
147
147
|
end
|
148
148
|
|
149
149
|
def generate(user, options)
|
150
150
|
user.is_a?(String) ? Auth::User.new({ user: user }.merge(options)) : user
|
151
151
|
end
|
152
|
+
|
153
|
+
def execute_operation(options)
|
154
|
+
client.send(:with_session, options) do |session|
|
155
|
+
op = yield session
|
156
|
+
op.execute(next_primary(nil, session), context: Operation::Context.new(client: client, session: session))
|
157
|
+
end
|
158
|
+
end
|
152
159
|
end
|
153
160
|
end
|
154
161
|
end
|
@@ -34,34 +34,13 @@ module Mongo
|
|
34
34
|
# @param [ Server::Connection ] connection The connection being
|
35
35
|
# authenticated.
|
36
36
|
#
|
37
|
-
# @return [ Protocol::
|
37
|
+
# @return [ Protocol::Message ] The first X.509 conversation message.
|
38
38
|
#
|
39
39
|
# @since 2.0.0
|
40
40
|
def start(connection)
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
# The only valid database for X.509 authentication is $external.
|
45
|
-
if user.auth_source != '$external'
|
46
|
-
user_name_msg = if user.name
|
47
|
-
" #{user.name}"
|
48
|
-
else
|
49
|
-
''
|
50
|
-
end
|
51
|
-
raise Auth::InvalidConfiguration, "User#{user_name_msg} specifies auth source '#{user.auth_source}', but the only valid auth source for X.509 is '$external'"
|
52
|
-
end
|
53
|
-
selector[Protocol::Msg::DATABASE_IDENTIFIER] = '$external'
|
54
|
-
cluster_time = connection.mongos? && connection.cluster_time
|
55
|
-
selector[Operation::CLUSTER_TIME] = cluster_time if cluster_time
|
56
|
-
Protocol::Msg.new([], {}, selector)
|
57
|
-
else
|
58
|
-
Protocol::Query.new(
|
59
|
-
Auth::EXTERNAL,
|
60
|
-
Database::COMMAND,
|
61
|
-
login,
|
62
|
-
limit: -1
|
63
|
-
)
|
64
|
-
end
|
41
|
+
validate_external_auth_source
|
42
|
+
selector = client_first_document
|
43
|
+
build_message(connection, '$external', selector)
|
65
44
|
end
|
66
45
|
|
67
46
|
# Returns the hash to provide to the server in the handshake
|
@@ -20,6 +20,17 @@ module Mongo
|
|
20
20
|
# compatibility reasons. However using these methods outside of the driver
|
21
21
|
# is deprecated.
|
22
22
|
#
|
23
|
+
# @note Do not start or stop background threads in finalizers. See
|
24
|
+
# https://jira.mongodb.org/browse/RUBY-2453 and
|
25
|
+
# https://bugs.ruby-lang.org/issues/16288. When interpreter exits,
|
26
|
+
# background threads are stopped first and finalizers are invoked next,
|
27
|
+
# and MRI's internal data structures are basically corrupt at this point
|
28
|
+
# if threads are being referenced. Prior to interpreter shutdown this
|
29
|
+
# means threads cannot be stopped by objects going out of scope, but
|
30
|
+
# most likely the threads hold references to said objects anyway if
|
31
|
+
# work is being performed thus the objects wouldn't go out of scope in
|
32
|
+
# the first place.
|
33
|
+
#
|
23
34
|
# @api private
|
24
35
|
module BackgroundThread
|
25
36
|
include Loggable
|
data/lib/mongo/bulk_write.rb
CHANGED
@@ -58,6 +58,7 @@ module Mongo
|
|
58
58
|
operations = op_combiner.combine
|
59
59
|
|
60
60
|
client.send(:with_session, @options) do |session|
|
61
|
+
context = Operation::Context.new(client: client, session: session)
|
61
62
|
operations.each do |operation|
|
62
63
|
if single_statement?(operation)
|
63
64
|
write_concern = write_concern(session)
|
@@ -67,6 +68,7 @@ module Mongo
|
|
67
68
|
operation.keys.first,
|
68
69
|
operation.values.flatten,
|
69
70
|
connection,
|
71
|
+
context,
|
70
72
|
operation_id,
|
71
73
|
result_combiner,
|
72
74
|
session,
|
@@ -80,6 +82,7 @@ module Mongo
|
|
80
82
|
operation.keys.first,
|
81
83
|
operation.values.flatten,
|
82
84
|
connection,
|
85
|
+
context,
|
83
86
|
operation_id,
|
84
87
|
result_combiner,
|
85
88
|
session)
|
@@ -177,28 +180,35 @@ module Mongo
|
|
177
180
|
}
|
178
181
|
end
|
179
182
|
|
180
|
-
def execute_operation(name, values, connection, operation_id, result_combiner, session, txn_num = nil)
|
183
|
+
def execute_operation(name, values, connection, context, operation_id, result_combiner, session, txn_num = nil)
|
181
184
|
validate_collation!(connection)
|
182
185
|
validate_array_filters!(connection)
|
183
186
|
validate_hint!(connection)
|
184
187
|
|
185
188
|
unpin_maybe(session) do
|
186
189
|
if values.size > connection.description.max_write_batch_size
|
187
|
-
split_execute(name, values, connection, operation_id, result_combiner, session, txn_num)
|
190
|
+
split_execute(name, values, connection, context, operation_id, result_combiner, session, txn_num)
|
188
191
|
else
|
189
|
-
result = send(name, values, connection, operation_id, session, txn_num)
|
192
|
+
result = send(name, values, connection, context, operation_id, session, txn_num)
|
190
193
|
|
191
194
|
add_server_diagnostics(connection) do
|
192
|
-
add_error_labels(
|
195
|
+
add_error_labels(connection, context) do
|
193
196
|
result_combiner.combine!(result, values.size)
|
194
197
|
end
|
195
198
|
end
|
196
199
|
end
|
197
200
|
end
|
201
|
+
# With OP_MSG (3.6+ servers), the size of each section in the message
|
202
|
+
# is independently capped at 16m and each bulk operation becomes
|
203
|
+
# its own section. The size of the entire bulk write is limited to 48m.
|
204
|
+
# With OP_QUERY (pre-3.6 servers), the entire bulk write is sent as a
|
205
|
+
# single document and is thus subject to the 16m document size limit.
|
206
|
+
# This means the splits differ between pre-3.6 and 3.6+ servers, with
|
207
|
+
# 3.6+ servers being able to split less.
|
198
208
|
rescue Error::MaxBSONSize, Error::MaxMessageSize => e
|
199
209
|
raise e if values.size <= 1
|
200
210
|
unpin_maybe(session) do
|
201
|
-
split_execute(name, values, connection, operation_id, result_combiner, session, txn_num)
|
211
|
+
split_execute(name, values, connection, context, operation_id, result_combiner, session, txn_num)
|
202
212
|
end
|
203
213
|
end
|
204
214
|
|
@@ -206,37 +216,47 @@ module Mongo
|
|
206
216
|
@op_combiner ||= ordered? ? OrderedCombiner.new(requests) : UnorderedCombiner.new(requests)
|
207
217
|
end
|
208
218
|
|
209
|
-
def split_execute(name, values, connection, operation_id, result_combiner, session, txn_num)
|
210
|
-
execute_operation(name, values.shift(values.size / 2), connection, operation_id, result_combiner, session, txn_num)
|
219
|
+
def split_execute(name, values, connection, context, operation_id, result_combiner, session, txn_num)
|
220
|
+
execute_operation(name, values.shift(values.size / 2), connection, context, operation_id, result_combiner, session, txn_num)
|
211
221
|
|
212
222
|
txn_num = session.next_txn_num if txn_num
|
213
|
-
execute_operation(name, values, connection, operation_id, result_combiner, session, txn_num)
|
223
|
+
execute_operation(name, values, connection, context, operation_id, result_combiner, session, txn_num)
|
214
224
|
end
|
215
225
|
|
216
|
-
def delete_one(documents, connection, operation_id, session, txn_num)
|
226
|
+
def delete_one(documents, connection, context, operation_id, session, txn_num)
|
227
|
+
QueryCache.clear_namespace(collection.namespace)
|
228
|
+
|
217
229
|
spec = base_spec(operation_id, session).merge(:deletes => documents, :txn_num => txn_num)
|
218
|
-
Operation::Delete.new(spec).bulk_execute(connection,
|
230
|
+
Operation::Delete.new(spec).bulk_execute(connection, context: context)
|
219
231
|
end
|
220
232
|
|
221
|
-
def delete_many(documents, connection, operation_id, session, txn_num)
|
233
|
+
def delete_many(documents, connection, context, operation_id, session, txn_num)
|
234
|
+
QueryCache.clear_namespace(collection.namespace)
|
235
|
+
|
222
236
|
spec = base_spec(operation_id, session).merge(:deletes => documents)
|
223
|
-
Operation::Delete.new(spec).bulk_execute(connection,
|
237
|
+
Operation::Delete.new(spec).bulk_execute(connection, context: context)
|
224
238
|
end
|
225
239
|
|
226
|
-
def insert_one(documents, connection, operation_id, session, txn_num)
|
240
|
+
def insert_one(documents, connection, context, operation_id, session, txn_num)
|
241
|
+
QueryCache.clear_namespace(collection.namespace)
|
242
|
+
|
227
243
|
spec = base_spec(operation_id, session).merge(:documents => documents, :txn_num => txn_num)
|
228
|
-
Operation::Insert.new(spec).bulk_execute(connection,
|
244
|
+
Operation::Insert.new(spec).bulk_execute(connection, context: context)
|
229
245
|
end
|
230
246
|
|
231
|
-
def update_one(documents, connection, operation_id, session, txn_num)
|
247
|
+
def update_one(documents, connection, context, operation_id, session, txn_num)
|
248
|
+
QueryCache.clear_namespace(collection.namespace)
|
249
|
+
|
232
250
|
spec = base_spec(operation_id, session).merge(:updates => documents, :txn_num => txn_num)
|
233
|
-
Operation::Update.new(spec).bulk_execute(connection,
|
251
|
+
Operation::Update.new(spec).bulk_execute(connection, context: context)
|
234
252
|
end
|
235
253
|
alias :replace_one :update_one
|
236
254
|
|
237
|
-
def update_many(documents, connection, operation_id, session, txn_num)
|
255
|
+
def update_many(documents, connection, context, operation_id, session, txn_num)
|
256
|
+
QueryCache.clear_namespace(collection.namespace)
|
257
|
+
|
238
258
|
spec = base_spec(operation_id, session).merge(:updates => documents)
|
239
|
-
Operation::Update.new(spec).bulk_execute(connection,
|
259
|
+
Operation::Update.new(spec).bulk_execute(connection, context: context)
|
240
260
|
end
|
241
261
|
|
242
262
|
private
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# Copyright (C) 2020 MongoDB Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module Mongo
|
16
|
+
|
17
|
+
# A Cursor that attempts to load documents from memory first before hitting
|
18
|
+
# the database if the same query has already been executed.
|
19
|
+
#
|
20
|
+
# @api semiprivate
|
21
|
+
class CachingCursor < Cursor
|
22
|
+
|
23
|
+
# @return [ Array <BSON::Document> ] The cursor's cached documents.
|
24
|
+
# @api private
|
25
|
+
attr_reader :cached_docs
|
26
|
+
|
27
|
+
# We iterate over the cached documents if they exist already in the
|
28
|
+
# cursor otherwise proceed as normal.
|
29
|
+
#
|
30
|
+
# @example Iterate over the documents.
|
31
|
+
# cursor.each do |doc|
|
32
|
+
# # ...
|
33
|
+
# end
|
34
|
+
def each
|
35
|
+
if @cached_docs
|
36
|
+
@cached_docs.each do |doc|
|
37
|
+
yield doc
|
38
|
+
end
|
39
|
+
|
40
|
+
unless closed?
|
41
|
+
# StopIteration raised by try_next ends this loop.
|
42
|
+
loop do
|
43
|
+
document = try_next
|
44
|
+
yield document if document
|
45
|
+
end
|
46
|
+
end
|
47
|
+
else
|
48
|
+
super
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# Get a human-readable string representation of +Cursor+.
|
53
|
+
#
|
54
|
+
# @example Inspect the cursor.
|
55
|
+
# cursor.inspect
|
56
|
+
#
|
57
|
+
# @return [ String ] A string representation of a +Cursor+ instance.
|
58
|
+
def inspect
|
59
|
+
"#<Mongo::CachingCursor:0x#{object_id} @view=#{@view.inspect}>"
|
60
|
+
end
|
61
|
+
|
62
|
+
# Acquires the next document for cursor iteration and then
|
63
|
+
# inserts that document in the @cached_docs array.
|
64
|
+
#
|
65
|
+
# @api private
|
66
|
+
def try_next
|
67
|
+
@cached_docs ||= []
|
68
|
+
document = super
|
69
|
+
@cached_docs << document if document
|
70
|
+
|
71
|
+
document
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
data/lib/mongo/client.rb
CHANGED
@@ -85,6 +85,7 @@ module Mongo
|
|
85
85
|
:retry_writes,
|
86
86
|
:scan,
|
87
87
|
:sdam_proc,
|
88
|
+
:server_api,
|
88
89
|
:server_selection_timeout,
|
89
90
|
:socket_timeout,
|
90
91
|
:ssl,
|
@@ -101,6 +102,7 @@ module Mongo
|
|
101
102
|
:ssl_verify,
|
102
103
|
:ssl_verify_certificate,
|
103
104
|
:ssl_verify_hostname,
|
105
|
+
:ssl_verify_ocsp_endpoint,
|
104
106
|
:truncate_logs,
|
105
107
|
:user,
|
106
108
|
:wait_queue_timeout,
|
@@ -113,7 +115,16 @@ module Mongo
|
|
113
115
|
# The compression algorithms supported by the driver.
|
114
116
|
#
|
115
117
|
# @since 2.5.0
|
116
|
-
VALID_COMPRESSORS = [
|
118
|
+
VALID_COMPRESSORS = [
|
119
|
+
Mongo::Protocol::Compressed::ZSTD,
|
120
|
+
Mongo::Protocol::Compressed::SNAPPY,
|
121
|
+
Mongo::Protocol::Compressed::ZLIB
|
122
|
+
].freeze
|
123
|
+
|
124
|
+
# The known server API versions.
|
125
|
+
VALID_SERVER_API_VERSIONS = %w(
|
126
|
+
1
|
127
|
+
).freeze
|
117
128
|
|
118
129
|
# @return [ Mongo::Cluster ] cluster The cluster of servers for the client.
|
119
130
|
attr_reader :cluster
|
@@ -222,7 +233,7 @@ module Mongo
|
|
222
233
|
# @option options [ Array<String> ] :compressors A list of potential
|
223
234
|
# compressors to use, in order of preference. The driver chooses the
|
224
235
|
# first compressor that is also supported by the server. Currently the
|
225
|
-
# driver only supports 'zlib'.
|
236
|
+
# driver only supports 'zstd, 'snappy' and 'zlib'.
|
226
237
|
# @option options [ true | false ] :direct_connection Whether to connect
|
227
238
|
# directly to the specified seed, bypassing topology discovery. Exactly
|
228
239
|
# one seed must be provided.
|
@@ -311,11 +322,16 @@ module Mongo
|
|
311
322
|
# in particular the cluster is nil at this time. sdam_proc should
|
312
323
|
# limit itself to calling #subscribe and #unsubscribe methods on the
|
313
324
|
# client only.
|
325
|
+
# @option options [ Hash ] :server_api The requested server API version.
|
326
|
+
# This hash can have the following items:
|
327
|
+
# - *:version* -- string
|
328
|
+
# - *:strict* -- boolean
|
329
|
+
# - *:deprecation_errors* -- boolean
|
314
330
|
# @option options [ Integer ] :server_selection_timeout The timeout in seconds
|
315
331
|
# for selecting a server for an operation.
|
316
332
|
# @option options [ Float ] :socket_timeout The timeout, in seconds, to
|
317
333
|
# execute operations on a socket.
|
318
|
-
# @option options [ true, false ] :ssl Whether to use
|
334
|
+
# @option options [ true, false ] :ssl Whether to use TLS.
|
319
335
|
# @option options [ String ] :ssl_ca_cert The file containing concatenated
|
320
336
|
# certificate authority certificates used to validate certs passed from the
|
321
337
|
# other end of the connection. Intermediate certificates should NOT be
|
@@ -462,11 +478,42 @@ module Mongo
|
|
462
478
|
@srv_records = nil
|
463
479
|
end
|
464
480
|
|
481
|
+
options = self.class.canonicalize_ruby_options(options)
|
482
|
+
|
483
|
+
# The server API version is specified to be a string.
|
484
|
+
# However, it is very annoying to always provide the number 1 as a string,
|
485
|
+
# therefore cast to the string type here.
|
486
|
+
if server_api = options[:server_api]
|
487
|
+
if server_api.is_a?(Hash)
|
488
|
+
server_api = Options::Redacted.new(server_api)
|
489
|
+
if (version = server_api[:version]).is_a?(Integer)
|
490
|
+
options[:server_api] = server_api.merge(version: version.to_s)
|
491
|
+
end
|
492
|
+
end
|
493
|
+
end
|
494
|
+
|
465
495
|
# Special handling for sdam_proc as it is only used during client
|
466
496
|
# construction
|
467
497
|
sdam_proc = options.delete(:sdam_proc)
|
468
498
|
|
469
|
-
|
499
|
+
# For gssapi service_name, the default option is given in a hash
|
500
|
+
# (one level down from the top level).
|
501
|
+
merged_options = default_options(options)
|
502
|
+
options.each do |k, v|
|
503
|
+
default_v = merged_options[k]
|
504
|
+
if Hash === default_v
|
505
|
+
v = default_v.merge(v)
|
506
|
+
end
|
507
|
+
merged_options[k] = v
|
508
|
+
end
|
509
|
+
options = merged_options
|
510
|
+
|
511
|
+
options.keys.each do |k|
|
512
|
+
if options[k].nil?
|
513
|
+
options.delete(k)
|
514
|
+
end
|
515
|
+
end
|
516
|
+
|
470
517
|
@options = validate_new_options!(options)
|
471
518
|
=begin WriteConcern object support
|
472
519
|
if @options[:write_concern].is_a?(WriteConcern::Base)
|
@@ -479,7 +526,9 @@ module Mongo
|
|
479
526
|
validate_options!(addresses)
|
480
527
|
validate_authentication_options!
|
481
528
|
|
482
|
-
|
529
|
+
database_options = @options.dup
|
530
|
+
database_options.delete(:server_api)
|
531
|
+
@database = Database.new(self, @options[:database], database_options)
|
483
532
|
|
484
533
|
# Temporarily set monitoring so that event subscriptions can be
|
485
534
|
# set up without there being a cluster
|
@@ -594,15 +643,12 @@ module Mongo
|
|
594
643
|
|
595
644
|
# Get a summary of the client state.
|
596
645
|
#
|
597
|
-
# @note
|
598
|
-
#
|
599
|
-
# @example Inspect the client.
|
600
|
-
# client.summary
|
646
|
+
# @note The exact format and layout of the returned summary string is
|
647
|
+
# not part of the driver's public API and may be changed at any time.
|
601
648
|
#
|
602
|
-
# @return [ String ]
|
649
|
+
# @return [ String ] The summary string.
|
603
650
|
#
|
604
651
|
# @since 2.7.0
|
605
|
-
# @api experimental
|
606
652
|
def summary
|
607
653
|
"#<Client cluster=#{cluster.summary}>"
|
608
654
|
end
|
@@ -632,7 +678,7 @@ module Mongo
|
|
632
678
|
#
|
633
679
|
# @return [ BSON::Document ] The user-defined read preference.
|
634
680
|
# The document may have the following fields:
|
635
|
-
# - *:
|
681
|
+
# - *:mode* -- read preference specified as a symbol; valid values are
|
636
682
|
# *:primary*, *:primary_preferred*, *:secondary*, *:secondary_preferred*
|
637
683
|
# and *:nearest*.
|
638
684
|
# - *:tag_sets* -- an array of hashes.
|
@@ -680,9 +726,9 @@ module Mongo
|
|
680
726
|
# @return [ Mongo::Client ] A new client instance.
|
681
727
|
#
|
682
728
|
# @since 2.0.0
|
683
|
-
def with(new_options =
|
729
|
+
def with(new_options = nil)
|
684
730
|
clone.tap do |client|
|
685
|
-
opts = client.update_options(new_options)
|
731
|
+
opts = client.update_options(new_options || Options::Redacted.new)
|
686
732
|
Database.create(client)
|
687
733
|
# We can't use the same cluster if some options that would affect it
|
688
734
|
# have changed.
|
@@ -709,6 +755,8 @@ module Mongo
|
|
709
755
|
def update_options(new_options)
|
710
756
|
old_options = @options
|
711
757
|
|
758
|
+
new_options = self.class.canonicalize_ruby_options(new_options || {})
|
759
|
+
|
712
760
|
validate_new_options!(new_options).tap do |opts|
|
713
761
|
# Our options are frozen
|
714
762
|
options = @options.dup
|
@@ -758,7 +806,6 @@ module Mongo
|
|
758
806
|
options[:read_concern]
|
759
807
|
end
|
760
808
|
|
761
|
-
|
762
809
|
# Get the write concern for this client. If no option was provided, then a
|
763
810
|
# default single server acknowledgement will be used.
|
764
811
|
#
|
@@ -1011,6 +1058,23 @@ module Mongo
|
|
1011
1058
|
end
|
1012
1059
|
end
|
1013
1060
|
|
1061
|
+
class << self
|
1062
|
+
# Lowercases auth mechanism properties, if given, in the specified
|
1063
|
+
# options, then converts the options to an instance of Options::Redacted.
|
1064
|
+
#
|
1065
|
+
# @api private
|
1066
|
+
def canonicalize_ruby_options(options)
|
1067
|
+
Options::Redacted.new(Hash[options.map do |k, v|
|
1068
|
+
if k == :auth_mech_properties || k == 'auth_mech_properties'
|
1069
|
+
if v
|
1070
|
+
v = Hash[v.map { |pk, pv| [pk.downcase, pv] }]
|
1071
|
+
end
|
1072
|
+
end
|
1073
|
+
[k, v]
|
1074
|
+
end])
|
1075
|
+
end
|
1076
|
+
end
|
1077
|
+
|
1014
1078
|
private
|
1015
1079
|
|
1016
1080
|
# Create a new encrypter object using the client's auto encryption options
|
@@ -1094,8 +1158,42 @@ module Mongo
|
|
1094
1158
|
# The argument may contain a subset of options that the client will
|
1095
1159
|
# eventually have; this method validates each of the provided options
|
1096
1160
|
# but does not check for interactions between combinations of options.
|
1097
|
-
def validate_new_options!(opts
|
1161
|
+
def validate_new_options!(opts)
|
1098
1162
|
return Options::Redacted.new unless opts
|
1163
|
+
if opts[:read_concern]
|
1164
|
+
# Raise an error for non user-settable options
|
1165
|
+
if opts[:read_concern][:after_cluster_time]
|
1166
|
+
raise Mongo::Error::InvalidReadConcern.new(
|
1167
|
+
'The after_cluster_time read_concern option cannot be specified by the user'
|
1168
|
+
)
|
1169
|
+
end
|
1170
|
+
|
1171
|
+
given_keys = opts[:read_concern].keys.map(&:to_s)
|
1172
|
+
allowed_keys = ['level']
|
1173
|
+
invalid_keys = given_keys - allowed_keys
|
1174
|
+
# Warn that options are invalid but keep it and forward to the server
|
1175
|
+
unless invalid_keys.empty?
|
1176
|
+
log_warn("Read concern has invalid keys: #{invalid_keys.join(',')}.")
|
1177
|
+
end
|
1178
|
+
end
|
1179
|
+
|
1180
|
+
if server_api = opts[:server_api]
|
1181
|
+
unless server_api.is_a?(Hash)
|
1182
|
+
raise ArgumentError, ":server_api value must be a hash: #{server_api}"
|
1183
|
+
end
|
1184
|
+
|
1185
|
+
extra_keys = server_api.keys - %w(version strict deprecation_errors)
|
1186
|
+
unless extra_keys.empty?
|
1187
|
+
raise ArgumentError, "Unknown keys under :server_api: #{extra_keys.map(&:inspect).join(', ')}"
|
1188
|
+
end
|
1189
|
+
|
1190
|
+
if version = server_api[:version]
|
1191
|
+
unless VALID_SERVER_API_VERSIONS.include?(version)
|
1192
|
+
raise ArgumentError, "Unknown server API version: #{version}"
|
1193
|
+
end
|
1194
|
+
end
|
1195
|
+
end
|
1196
|
+
|
1099
1197
|
Lint.validate_underscore_read_preference(opts[:read])
|
1100
1198
|
Lint.validate_read_concern_option(opts[:read_concern])
|
1101
1199
|
opts.each.inject(Options::Redacted.new) do |_options, (k, v)|
|
@@ -1105,6 +1203,15 @@ module Mongo
|
|
1105
1203
|
validate_read!(key, opts)
|
1106
1204
|
if key == :compressors
|
1107
1205
|
compressors = valid_compressors(v)
|
1206
|
+
|
1207
|
+
if compressors.include?('snappy')
|
1208
|
+
validate_snappy_compression!
|
1209
|
+
end
|
1210
|
+
|
1211
|
+
if compressors.include?('zstd')
|
1212
|
+
validate_zstd_compression!
|
1213
|
+
end
|
1214
|
+
|
1108
1215
|
_options[key] = compressors unless compressors.empty?
|
1109
1216
|
else
|
1110
1217
|
_options[key] = v
|
@@ -1261,11 +1368,30 @@ module Mongo
|
|
1261
1368
|
"This compressor will not be used.")
|
1262
1369
|
false
|
1263
1370
|
else
|
1371
|
+
|
1264
1372
|
true
|
1265
1373
|
end
|
1266
1374
|
end
|
1267
1375
|
end
|
1268
1376
|
|
1377
|
+
def validate_snappy_compression!
|
1378
|
+
return if defined?(Snappy)
|
1379
|
+
require 'snappy'
|
1380
|
+
rescue LoadError => e
|
1381
|
+
raise Error::UnmetDependency, "Cannot enable snappy compression because the snappy gem " \
|
1382
|
+
"has not been installed. Add \"gem 'snappy'\" to your Gemfile and run " \
|
1383
|
+
"\"bundle install\" to install the gem. (#{e.class}: #{e})"
|
1384
|
+
end
|
1385
|
+
|
1386
|
+
def validate_zstd_compression!
|
1387
|
+
return if defined?(Zstd)
|
1388
|
+
require 'zstd-ruby'
|
1389
|
+
rescue LoadError => e
|
1390
|
+
raise Error::UnmetDependency, "Cannot enable zstd compression because the zstd-ruby gem " \
|
1391
|
+
"has not been installed. Add \"gem 'zstd-ruby'\" to your Gemfile and run " \
|
1392
|
+
"\"bundle install\" to install the gem. (#{e.class}: #{e})"
|
1393
|
+
end
|
1394
|
+
|
1269
1395
|
def validate_max_min_pool_size!(option, opts)
|
1270
1396
|
if option == :min_pool_size && opts[:min_pool_size]
|
1271
1397
|
max = opts[:max_pool_size] || Server::ConnectionPool::DEFAULT_MAX_SIZE
|