mongo 2.17.4 → 2.21.0
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
- data/README.md +70 -37
- data/Rakefile +87 -177
- data/bin/mongo_console +2 -0
- data/lib/mongo/active_support.rb +1 -1
- data/lib/mongo/address/ipv4.rb +1 -1
- data/lib/mongo/address/ipv6.rb +1 -1
- data/lib/mongo/address/unix.rb +1 -1
- data/lib/mongo/address/validator.rb +1 -1
- data/lib/mongo/address.rb +23 -4
- data/lib/mongo/auth/aws/conversation.rb +1 -5
- data/lib/mongo/{operation/drop_database/command.rb → auth/aws/credentials.rb} +15 -18
- data/lib/mongo/auth/aws/credentials_cache.rb +75 -0
- data/lib/mongo/auth/aws/credentials_retriever.rb +232 -44
- data/lib/mongo/auth/aws/request.rb +1 -2
- data/lib/mongo/auth/aws.rb +6 -6
- data/lib/mongo/auth/base.rb +9 -2
- data/lib/mongo/auth/conversation_base.rb +1 -1
- data/lib/mongo/auth/cr/conversation.rb +1 -1
- data/lib/mongo/auth/cr.rb +1 -1
- data/lib/mongo/auth/credential_cache.rb +1 -1
- data/lib/mongo/auth/gssapi/conversation.rb +1 -1
- data/lib/mongo/auth/gssapi.rb +1 -1
- data/lib/mongo/auth/ldap/conversation.rb +1 -1
- data/lib/mongo/auth/ldap.rb +1 -1
- data/lib/mongo/auth/roles.rb +17 -17
- data/lib/mongo/auth/sasl_conversation_base.rb +1 -1
- data/lib/mongo/auth/scram/conversation.rb +1 -1
- data/lib/mongo/auth/scram.rb +1 -1
- data/lib/mongo/auth/scram256/conversation.rb +1 -1
- data/lib/mongo/auth/scram256.rb +1 -1
- data/lib/mongo/auth/scram_conversation_base.rb +1 -1
- data/lib/mongo/auth/stringprep/profiles/sasl.rb +1 -1
- data/lib/mongo/auth/stringprep/tables.rb +1 -1
- data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +1 -1
- data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +2 -1
- data/lib/mongo/auth/stringprep.rb +1 -1
- data/lib/mongo/auth/user/view.rb +1 -1
- data/lib/mongo/auth/user.rb +1 -1
- data/lib/mongo/auth/x509/conversation.rb +1 -1
- data/lib/mongo/auth/x509.rb +1 -1
- data/lib/mongo/auth.rb +13 -2
- data/lib/mongo/background_thread.rb +1 -1
- data/lib/mongo/bson.rb +1 -1
- data/lib/mongo/bulk_write/combineable.rb +1 -1
- data/lib/mongo/bulk_write/ordered_combiner.rb +1 -1
- data/lib/mongo/bulk_write/result.rb +11 -2
- data/lib/mongo/bulk_write/result_combiner.rb +3 -5
- data/lib/mongo/bulk_write/transformable.rb +1 -1
- data/lib/mongo/bulk_write/unordered_combiner.rb +1 -1
- data/lib/mongo/bulk_write/validatable.rb +1 -1
- data/lib/mongo/bulk_write.rb +152 -31
- data/lib/mongo/caching_cursor.rb +1 -1
- data/lib/mongo/client.rb +223 -27
- data/lib/mongo/client_encryption.rb +218 -11
- data/lib/mongo/cluster/periodic_executor.rb +1 -1
- data/lib/mongo/cluster/reapers/cursor_reaper.rb +14 -3
- data/lib/mongo/cluster/reapers/socket_reaper.rb +2 -2
- data/lib/mongo/cluster/sdam_flow.rb +62 -22
- data/lib/mongo/cluster/topology/base.rb +17 -1
- data/lib/mongo/cluster/topology/load_balanced.rb +1 -1
- data/lib/mongo/cluster/topology/no_replica_set_options.rb +1 -1
- data/lib/mongo/cluster/topology/replica_set_no_primary.rb +1 -1
- data/lib/mongo/cluster/topology/replica_set_with_primary.rb +1 -1
- data/lib/mongo/cluster/topology/sharded.rb +1 -1
- data/lib/mongo/cluster/topology/single.rb +1 -1
- data/lib/mongo/cluster/topology/unknown.rb +1 -1
- data/lib/mongo/cluster/topology.rb +1 -1
- data/lib/mongo/cluster.rb +95 -44
- data/lib/mongo/cluster_time.rb +1 -1
- data/lib/mongo/collection/helpers.rb +43 -0
- data/lib/mongo/collection/queryable_encryption.rb +162 -0
- data/lib/mongo/collection/view/aggregation/behavior.rb +131 -0
- data/lib/mongo/collection/view/aggregation.rb +51 -111
- data/lib/mongo/collection/view/builder/aggregation.rb +2 -8
- data/lib/mongo/collection/view/builder/map_reduce.rb +1 -1
- data/lib/mongo/collection/view/builder.rb +1 -1
- data/lib/mongo/collection/view/change_stream/retryable.rb +1 -1
- data/lib/mongo/collection/view/change_stream.rb +143 -48
- data/lib/mongo/collection/view/explainable.rb +2 -2
- data/lib/mongo/collection/view/immutable.rb +1 -1
- data/lib/mongo/collection/view/iterable.rb +79 -62
- data/lib/mongo/collection/view/map_reduce.rb +41 -15
- data/lib/mongo/collection/view/readable.rb +114 -62
- data/lib/mongo/collection/view/writable.rb +222 -70
- data/lib/mongo/collection/view.rb +44 -4
- data/lib/mongo/collection.rb +463 -114
- data/lib/mongo/condition_variable.rb +58 -0
- data/lib/mongo/config/options.rb +63 -0
- data/lib/mongo/config/validators/option.rb +27 -0
- data/lib/mongo/config.rb +43 -0
- data/lib/mongo/crypt/auto_decryption_context.rb +1 -1
- data/lib/mongo/crypt/auto_encrypter.rb +142 -20
- data/lib/mongo/crypt/auto_encryption_context.rb +1 -1
- data/lib/mongo/crypt/binary.rb +1 -1
- data/lib/mongo/crypt/binding.rb +715 -152
- data/lib/mongo/crypt/context.rb +83 -11
- data/lib/mongo/crypt/data_key_context.rb +13 -105
- data/lib/mongo/crypt/encryption_io.rb +133 -69
- data/lib/mongo/crypt/explicit_decryption_context.rb +1 -1
- data/lib/mongo/crypt/explicit_encrypter.rb +266 -34
- data/lib/mongo/crypt/explicit_encryption_context.rb +82 -22
- data/lib/mongo/{operation/kill_cursors/legacy.rb → crypt/explicit_encryption_expression_context.rb} +9 -20
- data/lib/mongo/crypt/handle.rb +169 -87
- data/lib/mongo/crypt/hooks.rb +26 -3
- data/lib/mongo/crypt/kms/aws/credentials.rb +83 -0
- data/lib/mongo/crypt/kms/aws/master_document.rb +78 -0
- data/lib/mongo/crypt/kms/aws.rb +20 -0
- data/lib/mongo/crypt/kms/azure/access_token.rb +54 -0
- data/lib/mongo/crypt/kms/azure/credentials.rb +103 -0
- data/lib/mongo/crypt/kms/azure/credentials_retriever.rb +138 -0
- data/lib/mongo/crypt/kms/azure/master_document.rb +79 -0
- data/lib/mongo/crypt/kms/azure.rb +21 -0
- data/lib/mongo/crypt/kms/credentials.rb +96 -0
- data/lib/mongo/crypt/kms/gcp/credentials.rb +127 -0
- data/lib/mongo/crypt/kms/gcp/credentials_retriever.rb +83 -0
- data/lib/mongo/crypt/kms/gcp/master_document.rb +99 -0
- data/lib/mongo/crypt/kms/gcp.rb +21 -0
- data/lib/mongo/crypt/kms/kmip/credentials.rb +68 -0
- data/lib/mongo/crypt/kms/kmip/master_document.rb +74 -0
- data/lib/mongo/crypt/kms/kmip.rb +19 -0
- data/lib/mongo/crypt/kms/local/credentials.rb +65 -0
- data/lib/mongo/crypt/kms/local/master_document.rb +43 -0
- data/lib/mongo/crypt/kms/local.rb +19 -0
- data/lib/mongo/crypt/kms/master_key_document.rb +65 -0
- data/lib/mongo/crypt/kms.rb +122 -0
- data/lib/mongo/crypt/kms_context.rb +1 -1
- data/lib/mongo/crypt/rewrap_many_data_key_context.rb +46 -0
- data/lib/mongo/crypt/rewrap_many_data_key_result.rb +37 -0
- data/lib/mongo/crypt/status.rb +9 -3
- data/lib/mongo/crypt.rb +16 -1
- data/lib/mongo/csot_timeout_holder.rb +119 -0
- data/lib/mongo/cursor/kill_spec.rb +31 -7
- data/lib/mongo/cursor/nontailable.rb +27 -0
- data/lib/mongo/cursor.rb +141 -35
- data/lib/mongo/cursor_host.rb +82 -0
- data/lib/mongo/database/view.rb +123 -16
- data/lib/mongo/database.rb +149 -35
- data/lib/mongo/dbref.rb +2 -106
- data/lib/mongo/distinguishing_semaphore.rb +2 -2
- data/lib/mongo/error/auth_error.rb +1 -1
- data/lib/mongo/error/bad_load_balancer_target.rb +1 -1
- data/lib/mongo/error/bulk_write_error.rb +32 -5
- data/lib/mongo/error/change_stream_resumable.rb +1 -1
- data/lib/mongo/error/client_closed.rb +24 -0
- data/lib/mongo/error/closed_stream.rb +1 -1
- data/lib/mongo/error/connection_check_out_timeout.rb +1 -1
- data/lib/mongo/error/connection_perished.rb +3 -1
- data/lib/mongo/error/connection_unavailable.rb +27 -0
- data/lib/mongo/error/credential_check_error.rb +1 -1
- data/lib/mongo/error/crypt_error.rb +1 -1
- data/lib/mongo/error/extra_file_chunk.rb +1 -1
- data/lib/mongo/error/failed_string_prep_validation.rb +1 -1
- data/lib/mongo/error/file_not_found.rb +1 -1
- data/lib/mongo/error/handshake_error.rb +1 -1
- data/lib/mongo/error/insufficient_iteration_count.rb +1 -1
- data/lib/mongo/error/internal_driver_error.rb +1 -1
- data/lib/mongo/error/invalid_address.rb +1 -1
- data/lib/mongo/error/invalid_application_name.rb +1 -1
- data/lib/mongo/error/invalid_bulk_operation.rb +1 -1
- data/lib/mongo/error/invalid_bulk_operation_type.rb +1 -1
- data/lib/mongo/error/invalid_collection_name.rb +1 -1
- data/lib/mongo/error/invalid_config_option.rb +21 -0
- data/lib/mongo/error/invalid_cursor_operation.rb +1 -1
- data/lib/mongo/error/invalid_database_name.rb +1 -1
- data/lib/mongo/error/invalid_document.rb +1 -1
- data/lib/mongo/error/invalid_file.rb +1 -1
- data/lib/mongo/error/invalid_file_revision.rb +1 -1
- data/lib/mongo/{operation/drop/command.rb → error/invalid_max_connecting.rb} +8 -21
- data/lib/mongo/error/invalid_min_pool_size.rb +1 -1
- data/lib/mongo/error/invalid_nonce.rb +1 -1
- data/lib/mongo/error/invalid_read_concern.rb +1 -1
- data/lib/mongo/error/invalid_read_option.rb +2 -2
- data/lib/mongo/error/invalid_replacement_document.rb +28 -10
- data/lib/mongo/error/invalid_server_auth_host.rb +1 -1
- data/lib/mongo/error/invalid_server_auth_response.rb +1 -1
- data/lib/mongo/error/invalid_server_preference.rb +1 -1
- data/lib/mongo/error/invalid_session.rb +1 -1
- data/lib/mongo/error/invalid_signature.rb +1 -1
- data/lib/mongo/error/invalid_transaction_operation.rb +1 -1
- data/lib/mongo/error/invalid_txt_record.rb +1 -1
- data/lib/mongo/error/invalid_update_document.rb +28 -8
- data/lib/mongo/error/invalid_uri.rb +1 -1
- data/lib/mongo/error/invalid_write_concern.rb +1 -1
- data/lib/mongo/error/kms_error.rb +1 -1
- data/lib/mongo/error/labelable.rb +72 -0
- data/lib/mongo/error/lint_error.rb +1 -1
- data/lib/mongo/error/max_bson_size.rb +1 -1
- data/lib/mongo/error/max_message_size.rb +1 -1
- data/lib/mongo/error/mismatched_domain.rb +1 -1
- data/lib/mongo/error/missing_connection.rb +27 -0
- data/lib/mongo/error/missing_file_chunk.rb +9 -3
- data/lib/mongo/error/missing_password.rb +1 -1
- data/lib/mongo/error/missing_resume_token.rb +1 -1
- data/lib/mongo/error/missing_scram_server_signature.rb +1 -1
- data/lib/mongo/error/missing_service_id.rb +1 -1
- data/lib/mongo/error/mongocryptd_spawn_error.rb +1 -1
- data/lib/mongo/error/multi_index_drop.rb +1 -1
- data/lib/mongo/error/need_primary_server.rb +1 -1
- data/lib/mongo/error/no_server_available.rb +1 -1
- data/lib/mongo/error/no_service_connection_available.rb +1 -1
- data/lib/mongo/error/no_srv_records.rb +1 -1
- data/lib/mongo/error/notable.rb +15 -1
- data/lib/mongo/error/operation_failure.rb +213 -260
- data/lib/mongo/error/parser.rb +1 -1
- data/lib/mongo/{operation/create_user/command.rb → error/pool_cleared_error.rb} +17 -23
- data/lib/mongo/error/pool_closed_error.rb +4 -17
- data/lib/mongo/{operation/update_user/command.rb → error/pool_error.rb} +21 -21
- data/lib/mongo/{operation/drop_index/command.rb → error/pool_paused_error.rb} +17 -22
- data/lib/mongo/error/raise_original_error.rb +1 -1
- data/lib/mongo/error/read_write_retryable.rb +108 -0
- data/lib/mongo/error/sdam_error_detection.rb +1 -1
- data/lib/mongo/error/server_api_conflict.rb +1 -1
- data/lib/mongo/error/server_api_not_supported.rb +1 -1
- data/lib/mongo/error/server_certificate_revoked.rb +1 -1
- data/lib/mongo/{operation/get_more/legacy.rb → error/server_not_usable.rb} +13 -16
- data/lib/mongo/error/server_timeout_error.rb +12 -0
- data/lib/mongo/error/session_ended.rb +1 -1
- data/lib/mongo/{operation/command/command.rb → error/session_not_materialized.rb} +8 -20
- data/lib/mongo/error/sessions_not_supported.rb +1 -1
- data/lib/mongo/error/snapshot_session_invalid_server_version.rb +1 -1
- data/lib/mongo/error/snapshot_session_transaction_prohibited.rb +1 -1
- data/lib/mongo/error/socket_error.rb +1 -1
- data/lib/mongo/error/socket_timeout_error.rb +4 -2
- data/lib/mongo/error/timeout_error.rb +23 -0
- data/lib/mongo/{operation/shared/op_msg_or_command.rb → error/transactions_not_supported.rb} +13 -20
- data/lib/mongo/error/unchangeable_collection_option.rb +1 -1
- data/lib/mongo/error/unexpected_chunk_length.rb +1 -1
- data/lib/mongo/error/unexpected_response.rb +1 -1
- data/lib/mongo/error/unknown_payload_type.rb +1 -1
- data/lib/mongo/error/unmet_dependency.rb +1 -1
- data/lib/mongo/error/unsupported_array_filters.rb +1 -1
- data/lib/mongo/error/unsupported_collation.rb +1 -1
- data/lib/mongo/error/unsupported_features.rb +1 -1
- data/lib/mongo/error/unsupported_message_type.rb +1 -1
- data/lib/mongo/error/unsupported_option.rb +1 -1
- data/lib/mongo/error/write_retryable.rb +1 -1
- data/lib/mongo/error.rb +16 -38
- data/lib/mongo/event/base.rb +1 -1
- data/lib/mongo/event/listeners.rb +1 -1
- data/lib/mongo/event/publisher.rb +1 -1
- data/lib/mongo/event/subscriber.rb +1 -1
- data/lib/mongo/event.rb +1 -1
- data/lib/mongo/grid/file/chunk.rb +3 -2
- data/lib/mongo/grid/file/info.rb +3 -2
- data/lib/mongo/grid/file.rb +1 -1
- data/lib/mongo/grid/fs_bucket.rb +49 -10
- data/lib/mongo/grid/stream/read.rb +22 -2
- data/lib/mongo/grid/stream/write.rb +22 -5
- data/lib/mongo/grid/stream.rb +1 -1
- data/lib/mongo/grid.rb +1 -1
- data/lib/mongo/id.rb +1 -1
- data/lib/mongo/index/view.rb +96 -19
- data/lib/mongo/index.rb +1 -1
- data/lib/mongo/lint.rb +1 -1
- data/lib/mongo/loggable.rb +3 -3
- data/lib/mongo/logger.rb +1 -1
- data/lib/mongo/monitoring/cmap_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/command_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/base.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/connection_closed.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/connection_created.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/connection_ready.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +9 -2
- data/lib/mongo/monitoring/event/cmap/pool_closed.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/pool_created.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/pool_ready.rb +67 -0
- data/lib/mongo/monitoring/event/cmap.rb +2 -1
- data/lib/mongo/monitoring/event/command_failed.rb +9 -3
- data/lib/mongo/monitoring/event/command_started.rb +2 -2
- data/lib/mongo/monitoring/event/command_succeeded.rb +10 -3
- data/lib/mongo/monitoring/event/secure.rb +2 -2
- data/lib/mongo/monitoring/event/server_closed.rb +1 -1
- data/lib/mongo/monitoring/event/server_description_changed.rb +1 -1
- data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +1 -1
- data/lib/mongo/monitoring/event/server_heartbeat_started.rb +1 -1
- data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +1 -1
- data/lib/mongo/monitoring/event/server_opening.rb +1 -1
- data/lib/mongo/monitoring/event/topology_changed.rb +1 -1
- data/lib/mongo/monitoring/event/topology_closed.rb +1 -1
- data/lib/mongo/monitoring/event/topology_opening.rb +1 -1
- data/lib/mongo/monitoring/event.rb +1 -1
- data/lib/mongo/monitoring/publishable.rb +10 -6
- data/lib/mongo/monitoring/sdam_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/server_closed_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/server_opening_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring.rb +1 -1
- data/lib/mongo/operation/aggregate/op_msg.rb +1 -1
- data/lib/mongo/operation/aggregate/result.rb +1 -1
- data/lib/mongo/operation/aggregate.rb +2 -3
- data/lib/mongo/operation/collections_info/result.rb +6 -3
- data/lib/mongo/operation/collections_info.rb +4 -16
- data/lib/mongo/operation/command/op_msg.rb +7 -1
- data/lib/mongo/operation/command.rb +2 -3
- data/lib/mongo/operation/context.rb +64 -8
- data/lib/mongo/operation/count/op_msg.rb +5 -2
- data/lib/mongo/operation/count.rb +2 -3
- data/lib/mongo/operation/create/op_msg.rb +5 -2
- data/lib/mongo/operation/create.rb +2 -3
- data/lib/mongo/operation/create_index/op_msg.rb +3 -2
- data/lib/mongo/operation/create_index.rb +2 -3
- data/lib/mongo/operation/create_search_indexes/op_msg.rb +31 -0
- data/lib/mongo/operation/create_search_indexes.rb +15 -0
- data/lib/mongo/operation/create_user/op_msg.rb +1 -1
- data/lib/mongo/operation/create_user.rb +2 -3
- data/lib/mongo/operation/delete/bulk_result.rb +1 -1
- data/lib/mongo/operation/delete/op_msg.rb +4 -2
- data/lib/mongo/operation/delete/result.rb +1 -1
- data/lib/mongo/operation/delete.rb +1 -3
- data/lib/mongo/operation/distinct/op_msg.rb +5 -2
- data/lib/mongo/operation/distinct.rb +2 -3
- data/lib/mongo/operation/drop/op_msg.rb +1 -1
- data/lib/mongo/operation/drop.rb +2 -3
- data/lib/mongo/operation/drop_database/op_msg.rb +1 -1
- data/lib/mongo/operation/drop_database.rb +2 -3
- data/lib/mongo/operation/drop_index/op_msg.rb +6 -2
- data/lib/mongo/operation/drop_index.rb +2 -3
- data/lib/mongo/operation/drop_search_index/op_msg.rb +33 -0
- data/lib/mongo/operation/drop_search_index.rb +15 -0
- data/lib/mongo/operation/explain/op_msg.rb +1 -1
- data/lib/mongo/operation/explain/result.rb +1 -1
- data/lib/mongo/operation/explain.rb +2 -4
- data/lib/mongo/operation/find/builder/command.rb +1 -1
- data/lib/mongo/operation/find/builder/flags.rb +1 -1
- data/lib/mongo/operation/find/builder/modifiers.rb +1 -1
- data/lib/mongo/operation/find/builder.rb +1 -2
- data/lib/mongo/operation/find/op_msg.rb +46 -1
- data/lib/mongo/operation/find/result.rb +1 -1
- data/lib/mongo/operation/find.rb +2 -4
- data/lib/mongo/operation/get_more/command_builder.rb +6 -2
- data/lib/mongo/operation/get_more/op_msg.rb +34 -1
- data/lib/mongo/operation/get_more/result.rb +1 -1
- data/lib/mongo/operation/get_more.rb +2 -4
- data/lib/mongo/operation/indexes/op_msg.rb +1 -1
- data/lib/mongo/operation/indexes/result.rb +1 -1
- data/lib/mongo/operation/indexes.rb +2 -18
- data/lib/mongo/operation/insert/bulk_result.rb +6 -2
- data/lib/mongo/operation/insert/op_msg.rb +9 -5
- data/lib/mongo/operation/insert/result.rb +9 -4
- data/lib/mongo/operation/insert.rb +1 -3
- data/lib/mongo/operation/kill_cursors/command_builder.rb +1 -1
- data/lib/mongo/operation/kill_cursors/op_msg.rb +1 -1
- data/lib/mongo/operation/kill_cursors.rb +2 -4
- data/lib/mongo/operation/list_collections/op_msg.rb +5 -2
- data/lib/mongo/operation/list_collections/result.rb +2 -2
- data/lib/mongo/operation/list_collections.rb +2 -3
- data/lib/mongo/operation/map_reduce/op_msg.rb +1 -1
- data/lib/mongo/operation/map_reduce/result.rb +18 -2
- data/lib/mongo/operation/map_reduce.rb +2 -3
- data/lib/mongo/operation/op_msg_base.rb +4 -2
- data/lib/mongo/operation/parallel_scan/op_msg.rb +1 -1
- data/lib/mongo/operation/parallel_scan/result.rb +1 -1
- data/lib/mongo/operation/parallel_scan.rb +2 -3
- data/lib/mongo/operation/remove_user/op_msg.rb +1 -1
- data/lib/mongo/operation/remove_user.rb +2 -3
- data/lib/mongo/operation/result.rb +47 -10
- data/lib/mongo/operation/shared/bypass_document_validation.rb +1 -1
- data/lib/mongo/operation/shared/causal_consistency_supported.rb +1 -1
- data/lib/mongo/operation/shared/executable.rb +60 -18
- data/lib/mongo/operation/shared/executable_no_validate.rb +1 -1
- data/lib/mongo/operation/shared/executable_transaction_label.rb +1 -1
- data/lib/mongo/operation/shared/idable.rb +1 -1
- data/lib/mongo/operation/shared/limited.rb +1 -1
- data/lib/mongo/operation/shared/object_id_generator.rb +1 -1
- data/lib/mongo/operation/shared/{polymorphic_operation.rb → op_msg_executable.rb} +28 -8
- data/lib/mongo/operation/shared/polymorphic_lookup.rb +1 -1
- data/lib/mongo/operation/shared/polymorphic_result.rb +1 -1
- data/lib/mongo/operation/shared/read_preference_supported.rb +1 -1
- data/lib/mongo/operation/shared/response_handling.rb +32 -33
- data/lib/mongo/operation/shared/result/aggregatable.rb +1 -1
- data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +1 -1
- data/lib/mongo/operation/shared/sessions_supported.rb +2 -3
- data/lib/mongo/operation/shared/specifiable.rb +8 -1
- data/lib/mongo/operation/shared/timed.rb +52 -0
- data/lib/mongo/operation/shared/validatable.rb +1 -1
- data/lib/mongo/operation/shared/write.rb +22 -13
- data/lib/mongo/operation/shared/write_concern_supported.rb +1 -1
- data/lib/mongo/operation/update/bulk_result.rb +1 -1
- data/lib/mongo/operation/update/op_msg.rb +5 -3
- data/lib/mongo/operation/update/result.rb +1 -1
- data/lib/mongo/operation/update.rb +1 -3
- data/lib/mongo/operation/update_search_index/op_msg.rb +34 -0
- data/lib/mongo/operation/update_search_index.rb +15 -0
- data/lib/mongo/operation/update_user/op_msg.rb +1 -1
- data/lib/mongo/operation/update_user.rb +2 -3
- data/lib/mongo/operation/users_info/op_msg.rb +1 -1
- data/lib/mongo/operation/users_info/result.rb +1 -1
- data/lib/mongo/operation/users_info.rb +2 -3
- data/lib/mongo/operation/write_command/op_msg.rb +1 -1
- data/lib/mongo/operation/write_command.rb +2 -3
- data/lib/mongo/operation.rb +6 -4
- data/lib/mongo/options/mapper.rb +1 -1
- data/lib/mongo/options/redacted.rb +1 -1
- data/lib/mongo/options.rb +1 -1
- data/lib/mongo/protocol/bit_vector.rb +4 -2
- data/lib/mongo/protocol/caching_hash.rb +52 -0
- data/lib/mongo/protocol/compressed.rb +1 -1
- data/lib/mongo/protocol/get_more.rb +1 -1
- data/lib/mongo/protocol/kill_cursors.rb +1 -1
- data/lib/mongo/protocol/message.rb +6 -13
- data/lib/mongo/protocol/msg.rb +25 -4
- data/lib/mongo/protocol/query.rb +1 -1
- data/lib/mongo/protocol/registry.rb +1 -1
- data/lib/mongo/protocol/reply.rb +1 -1
- data/lib/mongo/protocol/serializers.rb +25 -18
- data/lib/mongo/protocol.rb +2 -4
- data/lib/mongo/query_cache.rb +36 -21
- data/lib/mongo/retryable/base_worker.rb +116 -0
- data/lib/mongo/retryable/read_worker.rb +338 -0
- data/lib/mongo/retryable/write_worker.rb +398 -0
- data/lib/mongo/retryable.rb +37 -454
- data/lib/mongo/search_index/view.rb +232 -0
- data/lib/mongo/semaphore.rb +2 -2
- data/lib/mongo/server/app_metadata/environment.rb +314 -0
- data/lib/mongo/server/app_metadata/platform.rb +114 -0
- data/lib/mongo/server/app_metadata/truncator.rb +142 -0
- data/lib/mongo/server/app_metadata.rb +76 -108
- data/lib/mongo/server/connection.rb +102 -22
- data/lib/mongo/server/connection_base.rb +25 -3
- data/lib/mongo/server/connection_common.rb +5 -2
- data/lib/mongo/server/connection_pool/generation_manager.rb +56 -12
- data/lib/mongo/server/connection_pool/populator.rb +33 -31
- data/lib/mongo/server/connection_pool.rb +758 -251
- data/lib/mongo/server/description/features.rb +5 -2
- data/lib/mongo/server/description/load_balancer.rb +1 -1
- data/lib/mongo/server/description.rb +32 -13
- data/lib/mongo/server/monitor/app_metadata.rb +1 -1
- data/lib/mongo/server/monitor/connection.rb +2 -1
- data/lib/mongo/server/monitor.rb +43 -24
- data/lib/mongo/server/pending_connection.rb +26 -9
- data/lib/mongo/server/push_monitor/connection.rb +1 -1
- data/lib/mongo/server/push_monitor.rb +14 -4
- data/lib/mongo/server/{round_trip_time_averager.rb → round_trip_time_calculator.rb} +26 -8
- data/lib/mongo/server.rb +114 -39
- data/lib/mongo/server_selector/base.rb +75 -12
- data/lib/mongo/server_selector/nearest.rb +1 -1
- data/lib/mongo/server_selector/primary.rb +1 -1
- data/lib/mongo/server_selector/primary_preferred.rb +1 -1
- data/lib/mongo/server_selector/secondary.rb +1 -1
- data/lib/mongo/server_selector/secondary_preferred.rb +1 -1
- data/lib/mongo/server_selector.rb +1 -1
- data/lib/mongo/session/server_session/dirtyable.rb +52 -0
- data/lib/mongo/session/server_session.rb +4 -1
- data/lib/mongo/session/session_pool.rb +21 -19
- data/lib/mongo/session.rb +221 -44
- data/lib/mongo/socket/ocsp_cache.rb +1 -1
- data/lib/mongo/socket/ocsp_verifier.rb +5 -6
- data/lib/mongo/socket/ssl.rb +132 -19
- data/lib/mongo/socket/tcp.rb +44 -7
- data/lib/mongo/socket/unix.rb +1 -1
- data/lib/mongo/socket.rb +183 -27
- data/lib/mongo/srv/monitor.rb +1 -3
- data/lib/mongo/srv/resolver.rb +25 -4
- data/lib/mongo/srv/result.rb +1 -1
- data/lib/mongo/srv.rb +1 -1
- data/lib/mongo/timeout.rb +2 -2
- data/lib/mongo/topology_version.rb +1 -1
- data/lib/mongo/uri/options_mapper.rb +325 -81
- data/lib/mongo/uri/srv_protocol.rb +2 -2
- data/lib/mongo/uri.rb +61 -17
- data/lib/mongo/utils.rb +1 -1
- data/lib/mongo/version.rb +1 -5
- data/lib/mongo/write_concern/acknowledged.rb +1 -1
- data/lib/mongo/write_concern/base.rb +1 -1
- data/lib/mongo/write_concern/unacknowledged.rb +1 -1
- data/lib/mongo/write_concern.rb +1 -1
- data/lib/mongo.rb +26 -1
- data/mongo.gemspec +14 -14
- data/spec/README.md +23 -5
- data/spec/atlas/atlas_connectivity_spec.rb +10 -10
- data/spec/atlas/operations_spec.rb +7 -12
- data/spec/faas/ruby-sam-app/Gemfile +9 -0
- data/spec/faas/ruby-sam-app/mongodb/Gemfile +4 -0
- data/spec/faas/ruby-sam-app/mongodb/app.rb +149 -0
- data/spec/faas/ruby-sam-app/template.yaml +48 -0
- data/spec/integration/auth_spec.rb +1 -1
- data/spec/integration/awaited_ismaster_spec.rb +1 -1
- data/spec/integration/aws_auth_credentials_cache_spec.rb +51 -0
- data/spec/integration/aws_auth_request_spec.rb +2 -2
- data/spec/integration/aws_credentials_retriever_spec.rb +32 -2
- data/spec/integration/aws_lambda_examples_spec.rb +68 -0
- data/spec/integration/bson_symbol_spec.rb +1 -1
- data/spec/integration/bulk_insert_spec.rb +1 -1
- data/spec/integration/bulk_write_error_message_spec.rb +33 -0
- data/spec/integration/bulk_write_spec.rb +1 -1
- data/spec/integration/change_stream_examples_spec.rb +1 -1
- data/spec/integration/change_stream_spec.rb +12 -6
- data/spec/integration/check_clean_slate_spec.rb +1 -1
- data/spec/integration/client_authentication_options_spec.rb +1 -1
- data/spec/integration/client_connectivity_spec.rb +1 -1
- data/spec/integration/client_construction_aws_auth_spec.rb +12 -3
- data/spec/integration/client_construction_spec.rb +97 -9
- data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +10 -10
- data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +169 -169
- data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +3 -3
- data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +1 -1
- data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +41 -5
- data/spec/integration/client_side_encryption/auto_encryption_spec.rb +537 -387
- data/spec/integration/client_side_encryption/automatic_data_encryption_keys_prose_spec.rb +153 -0
- data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +3 -3
- data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +3 -3
- data/spec/integration/client_side_encryption/client_close_spec.rb +2 -2
- data/spec/integration/client_side_encryption/corpus_spec.rb +75 -38
- data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +40 -43
- data/spec/integration/client_side_encryption/data_key_spec.rb +98 -8
- data/spec/integration/client_side_encryption/decryption_events_prose_spec.rb +159 -0
- data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +60 -1
- data/spec/integration/client_side_encryption/explicit_queryable_encryption_spec.rb +150 -0
- data/spec/integration/client_side_encryption/external_key_vault_spec.rb +7 -7
- data/spec/integration/client_side_encryption/kms_tls_options_spec.rb +436 -0
- data/spec/integration/client_side_encryption/kms_tls_spec.rb +92 -0
- data/spec/integration/client_side_encryption/mongocryptd_prose_spec.rb +105 -0
- data/spec/integration/client_side_encryption/on_demand_aws_credentials_spec.rb +49 -0
- data/spec/integration/client_side_encryption/on_demand_azure_credentials_spec.rb +46 -0
- data/spec/integration/client_side_encryption/on_demand_gcp_credentials_spec.rb +47 -0
- data/spec/integration/client_side_encryption/queryable_encryption_examples_spec.rb +114 -0
- data/spec/integration/client_side_encryption/range_explicit_encryption_prose_spec.rb +583 -0
- data/spec/integration/client_side_encryption/rewrap_prose_spec.rb +114 -0
- data/spec/integration/client_side_encryption/unique_index_on_key_alt_names_prose_spec.rb +89 -0
- data/spec/integration/client_side_encryption/views_spec.rb +2 -2
- data/spec/integration/client_side_operations_timeout/encryption_prose_spec.rb +131 -0
- data/spec/integration/client_spec.rb +8 -3
- data/spec/integration/client_update_spec.rb +7 -3
- data/spec/integration/collection_indexes_prose_spec.rb +1 -1
- data/spec/integration/command_monitoring_spec.rb +1 -1
- data/spec/integration/command_spec.rb +2 -24
- data/spec/integration/connect_single_rs_name_spec.rb +1 -1
- data/spec/integration/connection/faas_env_spec.rb +62 -0
- data/spec/integration/connection_pool_populator_spec.rb +29 -7
- data/spec/integration/connection_spec.rb +1 -1
- data/spec/integration/crud_spec.rb +13 -1
- data/spec/integration/cursor_pinning_spec.rb +21 -62
- data/spec/integration/cursor_reaping_spec.rb +2 -2
- data/spec/integration/docs_examples_spec.rb +3 -3
- data/spec/integration/error_detection_spec.rb +1 -1
- data/spec/integration/fork_reconnect_spec.rb +17 -10
- data/spec/integration/get_more_spec.rb +1 -1
- data/spec/integration/grid_fs_bucket_spec.rb +4 -4
- data/spec/integration/heartbeat_events_spec.rb +1 -1
- data/spec/integration/map_reduce_spec.rb +5 -1
- data/spec/integration/mmapv1_spec.rb +1 -1
- data/spec/integration/mongos_pinning_spec.rb +1 -1
- data/spec/integration/ocsp_connectivity_spec.rb +1 -1
- data/spec/integration/ocsp_verifier_cache_spec.rb +1 -1
- data/spec/integration/ocsp_verifier_spec.rb +5 -2
- data/spec/integration/operation_failure_code_spec.rb +2 -2
- data/spec/integration/operation_failure_message_spec.rb +4 -3
- data/spec/integration/query_cache_spec.rb +124 -33
- data/spec/integration/query_cache_transactions_spec.rb +1 -1
- data/spec/integration/read_concern_spec.rb +1 -1
- data/spec/integration/read_preference_spec.rb +1 -1
- data/spec/integration/reconnect_spec.rb +6 -1
- data/spec/integration/retryable_errors_spec.rb +3 -3
- data/spec/integration/retryable_reads_errors_spec.rb +275 -0
- data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +2 -2
- data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +1 -1
- data/spec/integration/retryable_writes/shared/adds_diagnostics.rb +1 -1
- data/spec/integration/retryable_writes/shared/does_not_support_retries.rb +1 -1
- data/spec/integration/retryable_writes/shared/only_supports_legacy_retries.rb +1 -1
- data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +1 -1
- data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +1 -1
- data/spec/integration/retryable_writes/shared/performs_no_retries.rb +1 -1
- data/spec/integration/retryable_writes/shared/supports_legacy_retries.rb +1 -1
- data/spec/integration/retryable_writes/shared/supports_modern_retries.rb +1 -1
- data/spec/integration/retryable_writes/shared/supports_retries.rb +1 -1
- data/spec/integration/retryable_writes_errors_spec.rb +316 -2
- data/spec/integration/sdam_error_handling_spec.rb +69 -5
- data/spec/integration/sdam_events_spec.rb +1 -1
- data/spec/integration/sdam_prose_spec.rb +3 -3
- data/spec/integration/search_indexes_prose_spec.rb +172 -0
- data/spec/integration/secondary_reads_spec.rb +1 -0
- data/spec/integration/server_description_spec.rb +1 -1
- data/spec/integration/server_monitor_spec.rb +3 -2
- data/spec/integration/server_selection_spec.rb +1 -1
- data/spec/integration/server_selector_spec.rb +5 -3
- data/spec/integration/server_spec.rb +26 -28
- data/spec/integration/shell_examples_spec.rb +1 -1
- data/spec/integration/size_limit_spec.rb +5 -2
- data/spec/integration/snappy_compression_spec.rb +1 -1
- data/spec/integration/snapshot_query_examples_spec.rb +129 -0
- data/spec/integration/srv_monitoring_spec.rb +40 -1
- data/spec/integration/srv_spec.rb +4 -3
- data/spec/integration/ssl_uri_options_spec.rb +1 -1
- data/spec/integration/step_down_spec.rb +25 -7
- data/spec/integration/time_zone_querying_spec.rb +1 -1
- data/spec/integration/transaction_pinning_spec.rb +20 -6
- data/spec/integration/transactions_api_examples_spec.rb +3 -1
- data/spec/integration/transactions_examples_spec.rb +1 -1
- data/spec/integration/truncated_utf8_spec.rb +1 -1
- data/spec/integration/versioned_api_examples_spec.rb +38 -32
- data/spec/integration/x509_auth_spec.rb +1 -1
- data/spec/integration/zlib_compression_spec.rb +1 -1
- data/spec/integration/zstd_compression_spec.rb +1 -1
- data/spec/kerberos/kerberos_spec.rb +5 -1
- data/spec/lite_spec_helper.rb +63 -26
- data/spec/mongo/address/ipv4_spec.rb +1 -1
- data/spec/mongo/address/ipv6_spec.rb +8 -1
- data/spec/mongo/address/unix_spec.rb +1 -1
- data/spec/mongo/address/validator_spec.rb +1 -1
- data/spec/mongo/address_spec.rb +15 -2
- data/spec/mongo/auth/aws/credential_cache_spec.rb +63 -0
- data/spec/mongo/auth/aws/credentials_retriever_spec.rb +90 -0
- data/spec/mongo/auth/aws/credentials_spec.rb +46 -0
- data/spec/mongo/auth/aws/request_region_spec.rb +1 -1
- data/spec/mongo/auth/aws/request_spec.rb +1 -1
- data/spec/mongo/auth/cr_spec.rb +2 -22
- data/spec/mongo/auth/gssapi/conversation_spec.rb +1 -1
- data/spec/mongo/auth/invalid_mechanism_spec.rb +1 -1
- data/spec/mongo/auth/ldap/conversation_spec.rb +1 -1
- data/spec/mongo/auth/ldap_spec.rb +1 -1
- data/spec/mongo/auth/scram/conversation_spec.rb +24 -24
- data/spec/mongo/auth/scram256/conversation_spec.rb +21 -21
- data/spec/mongo/auth/scram_negotiation_spec.rb +2 -1
- data/spec/mongo/auth/scram_spec.rb +1 -1
- data/spec/mongo/auth/stringprep/profiles/sasl_spec.rb +1 -1
- data/spec/mongo/auth/stringprep_spec.rb +1 -1
- data/spec/mongo/auth/user/view_spec.rb +96 -1
- data/spec/mongo/auth/user_spec.rb +1 -1
- data/spec/mongo/auth/x509/conversation_spec.rb +1 -1
- data/spec/mongo/auth/x509_spec.rb +1 -1
- data/spec/mongo/auth_spec.rb +1 -1
- data/spec/mongo/bson_spec.rb +1 -1
- data/spec/mongo/bulk_write/ordered_combiner_spec.rb +1 -1
- data/spec/mongo/bulk_write/result_spec.rb +16 -2
- data/spec/mongo/bulk_write/unordered_combiner_spec.rb +1 -1
- data/spec/mongo/bulk_write_spec.rb +142 -21
- data/spec/mongo/caching_cursor_spec.rb +2 -2
- data/spec/mongo/client_construction_spec.rb +734 -631
- data/spec/mongo/client_encryption_spec.rb +12 -23
- data/spec/mongo/client_spec.rb +547 -156
- data/spec/mongo/cluster/cursor_reaper_spec.rb +22 -4
- data/spec/mongo/cluster/periodic_executor_spec.rb +1 -1
- data/spec/mongo/cluster/socket_reaper_spec.rb +1 -1
- 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 +1 -1
- 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 +193 -199
- data/spec/mongo/cluster_time_spec.rb +1 -1
- data/spec/mongo/collection/view/aggregation_spec.rb +142 -43
- data/spec/mongo/collection/view/builder/find_command_spec.rb +1 -1
- data/spec/mongo/collection/view/builder/op_query_spec.rb +1 -1
- data/spec/mongo/collection/view/change_stream_resume_spec.rb +1 -1
- data/spec/mongo/collection/view/change_stream_spec.rb +6 -6
- data/spec/mongo/collection/view/explainable_spec.rb +3 -1
- data/spec/mongo/collection/view/immutable_spec.rb +1 -1
- data/spec/mongo/collection/view/iterable_spec.rb +1 -1
- data/spec/mongo/collection/view/map_reduce_spec.rb +11 -1
- data/spec/mongo/collection/view/readable_spec.rb +744 -2
- data/spec/mongo/collection/view/writable_spec.rb +145 -33
- data/spec/mongo/collection/view_spec.rb +1 -1
- data/spec/mongo/collection_crud_spec.rb +122 -15
- data/spec/mongo/collection_ddl_spec.rb +116 -66
- data/spec/mongo/collection_spec.rb +47 -2
- data/spec/mongo/condition_variable_spec.rb +104 -0
- data/spec/mongo/config/options_spec.rb +76 -0
- data/spec/mongo/config_spec.rb +74 -0
- data/spec/mongo/crypt/auto_decryption_context_spec.rb +18 -2
- data/spec/mongo/crypt/auto_encrypter_spec.rb +272 -12
- data/spec/mongo/crypt/auto_encryption_context_spec.rb +18 -2
- data/spec/mongo/crypt/binary_spec.rb +1 -1
- data/spec/mongo/crypt/binding/binary_spec.rb +1 -1
- data/spec/mongo/crypt/binding/context_spec.rb +68 -18
- data/spec/mongo/crypt/binding/helpers_spec.rb +1 -1
- data/spec/mongo/crypt/binding/mongocrypt_spec.rb +18 -47
- data/spec/mongo/crypt/binding/status_spec.rb +1 -1
- data/spec/mongo/crypt/binding/version_spec.rb +48 -1
- data/spec/mongo/crypt/binding_unloaded_spec.rb +15 -1
- data/spec/mongo/crypt/data_key_context_spec.rb +46 -116
- data/spec/mongo/crypt/encryption_io_spec.rb +3 -1
- data/spec/mongo/crypt/explicit_decryption_context_spec.rb +33 -2
- data/spec/mongo/crypt/explicit_encryption_context_spec.rb +95 -2
- data/spec/mongo/crypt/handle_spec.rb +187 -156
- data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +1 -1
- data/spec/mongo/crypt/hooks_spec.rb +30 -0
- data/spec/mongo/crypt/kms/azure/credentials_retriever_spec.rb +86 -0
- data/spec/mongo/crypt/kms/credentials_spec.rb +373 -0
- data/spec/mongo/crypt/kms_spec.rb +62 -0
- data/spec/mongo/crypt/status_spec.rb +1 -1
- data/spec/mongo/crypt_spec.rb +21 -0
- data/spec/mongo/cursor/builder/get_more_command_spec.rb +1 -1
- data/spec/mongo/cursor/builder/op_get_more_spec.rb +1 -1
- data/spec/mongo/cursor_spec.rb +119 -19
- data/spec/mongo/database_spec.rb +67 -2
- data/spec/mongo/distinguishing_semaphore_spec.rb +7 -7
- data/spec/mongo/error/bulk_write_error_spec.rb +1 -1
- data/spec/mongo/error/crypt_error_spec.rb +1 -1
- data/spec/mongo/error/max_bson_size_spec.rb +1 -1
- data/spec/mongo/error/no_server_available_spec.rb +1 -1
- data/spec/mongo/error/notable_spec.rb +1 -1
- data/spec/mongo/error/operation_failure_heavy_spec.rb +51 -2
- data/spec/mongo/error/operation_failure_spec.rb +1 -1
- data/spec/mongo/error/parser_spec.rb +1 -1
- data/spec/mongo/error/unsupported_option_spec.rb +1 -1
- data/spec/mongo/event/publisher_spec.rb +1 -1
- data/spec/mongo/event/subscriber_spec.rb +1 -1
- data/spec/mongo/grid/file/chunk_spec.rb +1 -1
- data/spec/mongo/grid/file/info_spec.rb +1 -1
- data/spec/mongo/grid/file_spec.rb +1 -1
- data/spec/mongo/grid/fs_bucket_spec.rb +1 -1
- data/spec/mongo/grid/stream/read_spec.rb +1 -1
- data/spec/mongo/grid/stream/write_spec.rb +1 -1
- data/spec/mongo/grid/stream_spec.rb +1 -1
- data/spec/mongo/id_spec.rb +2 -2
- data/spec/mongo/index/view_spec.rb +126 -1
- data/spec/mongo/lint_spec.rb +2 -2
- data/spec/mongo/logger_spec.rb +1 -1
- data/spec/mongo/monitoring/command_log_subscriber_spec.rb +1 -1
- data/spec/mongo/monitoring/event/cmap/connection_check_out_failed_spec.rb +2 -2
- data/spec/mongo/monitoring/event/cmap/connection_check_out_started_spec.rb +2 -2
- data/spec/mongo/monitoring/event/cmap/connection_checked_in_spec.rb +2 -2
- data/spec/mongo/monitoring/event/cmap/connection_checked_out_spec.rb +2 -2
- data/spec/mongo/monitoring/event/cmap/connection_closed_spec.rb +2 -2
- data/spec/mongo/monitoring/event/cmap/connection_created_spec.rb +2 -2
- data/spec/mongo/monitoring/event/cmap/connection_ready_spec.rb +2 -2
- data/spec/mongo/monitoring/event/cmap/pool_cleared_spec.rb +2 -2
- data/spec/mongo/monitoring/event/cmap/pool_closed_spec.rb +2 -2
- data/spec/mongo/monitoring/event/cmap/pool_created_spec.rb +2 -2
- data/spec/mongo/monitoring/event/command_failed_spec.rb +1 -1
- data/spec/mongo/monitoring/event/command_started_spec.rb +1 -1
- data/spec/mongo/monitoring/event/command_succeeded_spec.rb +1 -1
- data/spec/mongo/monitoring/event/secure_spec.rb +1 -1
- data/spec/mongo/monitoring/event/server_closed_spec.rb +1 -1
- data/spec/mongo/monitoring/event/server_description_changed_spec.rb +1 -1
- data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +1 -1
- data/spec/mongo/monitoring/event/server_heartbeat_started_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/monitoring_spec.rb +1 -1
- data/spec/mongo/operation/aggregate/result_spec.rb +1 -1
- data/spec/mongo/operation/aggregate_spec.rb +1 -1
- data/spec/mongo/operation/collections_info_spec.rb +1 -1
- data/spec/mongo/operation/command_spec.rb +1 -1
- data/spec/mongo/operation/context_spec.rb +79 -0
- data/spec/mongo/operation/create/op_msg_spec.rb +240 -0
- data/spec/mongo/operation/create_index_spec.rb +1 -1
- data/spec/mongo/operation/create_user_spec.rb +1 -1
- data/spec/mongo/operation/delete/bulk_spec.rb +1 -1
- data/spec/mongo/operation/delete/op_msg_spec.rb +20 -10
- data/spec/mongo/operation/delete_spec.rb +1 -31
- data/spec/mongo/operation/drop_index_spec.rb +1 -1
- data/spec/mongo/operation/find/builder/flags_spec.rb +1 -1
- data/spec/mongo/operation/find/builder/modifiers_spec.rb +1 -1
- data/spec/mongo/operation/find/op_msg_spec.rb +66 -0
- data/spec/mongo/operation/get_more/op_msg_spec.rb +65 -0
- data/spec/mongo/operation/indexes_spec.rb +1 -1
- data/spec/mongo/operation/insert/bulk_spec.rb +1 -1
- data/spec/mongo/operation/insert/op_msg_spec.rb +131 -126
- data/spec/mongo/operation/insert_spec.rb +2 -34
- data/spec/mongo/operation/limited_spec.rb +1 -1
- data/spec/mongo/operation/map_reduce_spec.rb +1 -1
- data/spec/mongo/operation/read_preference_legacy_spec.rb +1 -1
- data/spec/mongo/operation/read_preference_op_msg_spec.rb +1 -1
- data/spec/mongo/operation/remove_user_spec.rb +1 -1
- data/spec/mongo/operation/result_spec.rb +21 -1
- data/spec/mongo/operation/shared/csot/examples.rb +113 -0
- data/spec/mongo/operation/specifiable_spec.rb +1 -1
- data/spec/mongo/operation/update/bulk_spec.rb +1 -1
- data/spec/mongo/operation/update/op_msg_spec.rb +14 -5
- data/spec/mongo/operation/update_spec.rb +1 -30
- data/spec/mongo/operation/update_user_spec.rb +1 -1
- data/spec/mongo/options/redacted_spec.rb +2 -2
- data/spec/mongo/protocol/caching_hash_spec.rb +37 -0
- data/spec/mongo/protocol/compressed_spec.rb +1 -1
- data/spec/mongo/protocol/get_more_spec.rb +1 -1
- data/spec/mongo/protocol/kill_cursors_spec.rb +1 -1
- data/spec/mongo/protocol/msg_spec.rb +45 -66
- data/spec/mongo/protocol/query_spec.rb +1 -1
- data/spec/mongo/protocol/registry_spec.rb +1 -1
- data/spec/mongo/protocol/reply_spec.rb +1 -1
- data/spec/mongo/query_cache_middleware_spec.rb +1 -1
- data/spec/mongo/query_cache_spec.rb +245 -226
- data/spec/mongo/retryable/write_worker_spec.rb +39 -0
- data/spec/mongo/retryable_spec.rb +38 -6
- data/spec/mongo/semaphore_spec.rb +7 -7
- data/spec/mongo/server/app_metadata/environment_spec.rb +344 -0
- data/spec/mongo/server/app_metadata/truncator_spec.rb +158 -0
- data/spec/mongo/server/app_metadata_spec.rb +53 -65
- data/spec/mongo/server/connection_auth_spec.rb +4 -2
- data/spec/mongo/server/connection_common_spec.rb +14 -2
- data/spec/mongo/server/connection_pool/populator_spec.rb +17 -3
- data/spec/mongo/server/connection_pool_spec.rb +567 -63
- data/spec/mongo/server/connection_spec.rb +93 -163
- data/spec/mongo/server/description/features_spec.rb +25 -1
- data/spec/mongo/server/description_query_methods_spec.rb +1 -1
- data/spec/mongo/server/description_spec.rb +1 -1
- data/spec/mongo/server/monitor/app_metadata_spec.rb +1 -1
- data/spec/mongo/server/monitor/connection_spec.rb +3 -3
- data/spec/mongo/server/monitor_spec.rb +6 -5
- data/spec/mongo/server/push_monitor_spec.rb +3 -9
- data/spec/mongo/server/round_trip_time_calculator_spec.rb +120 -0
- data/spec/mongo/server_selector/nearest_spec.rb +1 -1
- data/spec/mongo/server_selector/primary_preferred_spec.rb +1 -1
- data/spec/mongo/server_selector/primary_spec.rb +1 -1
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +1 -1
- data/spec/mongo/server_selector/secondary_spec.rb +1 -1
- data/spec/mongo/server_selector_spec.rb +1 -1
- data/spec/mongo/server_spec.rb +32 -5
- data/spec/mongo/session/server_session_spec.rb +1 -1
- data/spec/mongo/session/session_pool_spec.rb +2 -17
- data/spec/mongo/session_spec.rb +27 -7
- data/spec/mongo/session_transaction_spec.rb +19 -3
- data/spec/mongo/socket/ssl_spec.rb +21 -26
- data/spec/mongo/socket/tcp_spec.rb +1 -1
- data/spec/mongo/socket/unix_spec.rb +1 -1
- data/spec/mongo/socket_spec.rb +1 -1
- data/spec/mongo/srv/monitor_spec.rb +1 -1
- data/spec/mongo/srv/result_spec.rb +1 -1
- data/spec/mongo/timeout_spec.rb +1 -1
- data/spec/mongo/tls_context_hooks_spec.rb +1 -1
- data/spec/mongo/uri/options_mapper_spec.rb +1605 -0
- data/spec/mongo/uri/srv_protocol_spec.rb +263 -4
- data/spec/mongo/uri_option_parsing_spec.rb +1 -1
- data/spec/mongo/uri_spec.rb +168 -11
- data/spec/mongo/utils_spec.rb +1 -1
- data/spec/mongo/write_concern/acknowledged_spec.rb +1 -1
- data/spec/mongo/write_concern/unacknowledged_spec.rb +1 -1
- data/spec/mongo/write_concern_spec.rb +1 -1
- data/spec/runners/auth.rb +1 -1
- data/spec/runners/change_streams/outcome.rb +1 -1
- data/spec/runners/change_streams/spec.rb +1 -1
- data/spec/runners/change_streams/test.rb +3 -3
- data/spec/runners/cmap/verifier.rb +2 -2
- data/spec/runners/cmap.rb +188 -45
- data/spec/runners/command_monitoring.rb +1 -1
- data/spec/runners/connection_string.rb +9 -1
- data/spec/runners/crud/context.rb +1 -1
- data/spec/runners/crud/operation.rb +15 -6
- data/spec/runners/crud/outcome.rb +1 -1
- data/spec/runners/crud/requirement.rb +12 -7
- data/spec/runners/crud/spec.rb +6 -1
- data/spec/runners/crud/test.rb +2 -10
- data/spec/runners/crud/test_base.rb +2 -2
- data/spec/runners/crud/verifier.rb +12 -4
- data/spec/runners/crud.rb +2 -2
- data/spec/runners/gridfs.rb +1 -1
- data/spec/runners/read_write_concern_document.rb +1 -1
- data/spec/runners/sdam/verifier.rb +1 -1
- data/spec/runners/sdam.rb +1 -1
- data/spec/runners/server_selection.rb +1 -1
- data/spec/runners/server_selection_rtt.rb +1 -1
- data/spec/runners/transactions/operation.rb +19 -15
- data/spec/runners/transactions/spec.rb +3 -3
- data/spec/runners/transactions/test.rb +75 -22
- data/spec/runners/transactions.rb +12 -9
- data/spec/runners/unified/ambiguous_operations.rb +13 -0
- data/spec/runners/unified/assertions.rb +163 -50
- data/spec/runners/unified/change_stream_operations.rb +22 -9
- data/spec/runners/unified/client_side_encryption_operations.rb +83 -0
- data/spec/runners/unified/crud_operations.rb +129 -22
- data/spec/runners/unified/ddl_operations.rb +160 -8
- data/spec/runners/unified/entity_map.rb +1 -1
- data/spec/runners/unified/error.rb +3 -2
- data/spec/runners/unified/event_subscriber.rb +9 -3
- data/spec/runners/unified/exceptions.rb +1 -1
- data/spec/runners/unified/grid_fs_operations.rb +59 -3
- data/spec/runners/unified/search_index_operations.rb +63 -0
- data/spec/runners/unified/support_operations.rb +115 -11
- data/spec/runners/unified/test.rb +204 -36
- data/spec/runners/unified/test_group.rb +1 -1
- data/spec/runners/unified/thread_operations.rb +73 -0
- data/spec/runners/unified.rb +15 -5
- data/spec/solo/clean_exit_spec.rb +7 -7
- data/spec/spec_helper.rb +2 -3
- data/spec/spec_tests/auth_spec.rb +1 -1
- data/spec/spec_tests/change_streams_unified_spec.rb +2 -1
- data/spec/spec_tests/client_side_encryption_spec.rb +25 -2
- data/spec/spec_tests/client_side_encryption_unified_spec.rb +26 -0
- data/spec/spec_tests/client_side_operations_timeout_spec.rb +15 -0
- data/spec/spec_tests/cmap_spec.rb +29 -15
- data/spec/spec_tests/collection_management_spec.rb +1 -1
- data/spec/spec_tests/command_monitoring_unified_spec.rb +1 -1
- data/spec/spec_tests/connection_string_spec.rb +1 -1
- data/spec/spec_tests/crud_spec.rb +1 -11
- data/spec/spec_tests/crud_unified_spec.rb +1 -1
- data/spec/spec_tests/data/change_streams_unified/change-streams-clusterTime.yml +43 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams-disambiguatedPaths.yml +105 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams-errors.yml +122 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams-pre_and_post_images.yml +351 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams-resume-allowlist.yml +1169 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams-resume-errorLabels.yml +1069 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams-showExpandedEvents.yml +307 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams.yml +859 -4
- data/spec/spec_tests/data/client_side_encryption/aggregate.yml +3 -17
- data/spec/spec_tests/data/client_side_encryption/awsTemporary.yml +57 -0
- data/spec/spec_tests/data/client_side_encryption/azureKMS.yml +46 -0
- data/spec/spec_tests/data/client_side_encryption/badQueries.yml +14 -3
- data/spec/spec_tests/data/client_side_encryption/basic.yml +3 -17
- data/spec/spec_tests/data/client_side_encryption/bulk.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/bypassAutoEncryption.yml +2 -2
- data/spec/spec_tests/data/client_side_encryption/bypassedCommand.yml +5 -4
- data/spec/spec_tests/data/client_side_encryption/count.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/create-and-createIndexes.yml +58 -0
- data/spec/spec_tests/data/client_side_encryption/delete.yml +2 -16
- data/spec/spec_tests/data/client_side_encryption/distinct.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/explain.yml +3 -10
- data/spec/spec_tests/data/client_side_encryption/find.yml +2 -16
- data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/fle2v2-BypassQueryAnalysis.yml +90 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Compact.yml +83 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-CreateCollection-OldServer.yml +61 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-CreateCollection.yml +938 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-DecryptExistingData.yml +67 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Delete.yml +101 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-EncryptedFields-vs-EncryptedFieldsMap.yml +80 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-EncryptedFields-vs-jsonSchema.yml +103 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-EncryptedFieldsMap-defaults.yml +59 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-FindOneAndUpdate.yml +201 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-InsertFind-Indexed.yml +97 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-InsertFind-Unindexed.yml +90 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-MissingKey.yml +44 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-NoEncryption.yml +45 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Update.yml +211 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-validatorAndPartialFieldExpression.yml +170 -0
- data/spec/spec_tests/data/client_side_encryption/gcpKMS.yml +46 -0
- data/spec/spec_tests/data/client_side_encryption/getMore.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/insert.yml +2 -16
- data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/localKMS.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/localSchema.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +3 -1
- data/spec/spec_tests/data/client_side_encryption/missingKey.yml +2 -9
- data/spec/spec_tests/data/client_side_encryption/noSchema.yml +39 -0
- data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/timeoutMS.yml +67 -0
- data/spec/spec_tests/data/client_side_encryption/types.yml +44 -70
- data/spec/spec_tests/data/client_side_encryption/unified/addKeyAltName.yml +194 -0
- data/spec/spec_tests/data/client_side_encryption/unified/createDataKey-kms_providers-invalid.yml +67 -0
- data/spec/spec_tests/data/client_side_encryption/unified/createDataKey.yml +309 -0
- data/spec/spec_tests/data/client_side_encryption/unified/deleteKey.yml +159 -0
- data/spec/spec_tests/data/client_side_encryption/unified/getKey.yml +105 -0
- data/spec/spec_tests/data/client_side_encryption/unified/getKeyByAltName.yml +104 -0
- data/spec/spec_tests/data/client_side_encryption/unified/getKeys.yml +122 -0
- data/spec/spec_tests/data/client_side_encryption/unified/removeKeyAltName.yml +157 -0
- data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey-decrypt_failure.yml +69 -0
- data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey-encrypt_failure.yml +122 -0
- data/spec/spec_tests/data/client_side_encryption/unified/rewrapManyDataKey.yml +432 -0
- data/spec/spec_tests/data/client_side_encryption/updateMany.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/updateOne.yml +1 -8
- data/spec/spec_tests/data/client_side_encryption/validatorAndPartialFieldExpression.yml +166 -0
- data/spec/spec_tests/data/client_side_operations_timeout/bulkWrite.yml +87 -0
- data/spec/spec_tests/data/client_side_operations_timeout/change-streams.yml +358 -0
- data/spec/spec_tests/data/client_side_operations_timeout/close-cursors.yml +129 -0
- data/spec/spec_tests/data/client_side_operations_timeout/command-execution.yml +250 -0
- data/spec/spec_tests/data/client_side_operations_timeout/convenient-transactions.yml +113 -0
- data/spec/spec_tests/data/client_side_operations_timeout/cursors.yml +70 -0
- data/spec/spec_tests/data/client_side_operations_timeout/deprecated-options.yml +3982 -0
- data/spec/spec_tests/data/client_side_operations_timeout/error-transformations.yml +96 -0
- data/spec/spec_tests/data/client_side_operations_timeout/global-timeoutMS.yml +3236 -0
- data/spec/spec_tests/data/client_side_operations_timeout/gridfs-advanced.yml +207 -0
- data/spec/spec_tests/data/client_side_operations_timeout/gridfs-delete.yml +152 -0
- data/spec/spec_tests/data/client_side_operations_timeout/gridfs-download.yml +182 -0
- data/spec/spec_tests/data/client_side_operations_timeout/gridfs-find.yml +100 -0
- data/spec/spec_tests/data/client_side_operations_timeout/gridfs-upload.yml +249 -0
- data/spec/spec_tests/data/client_side_operations_timeout/legacy-timeouts.yml +204 -0
- data/spec/spec_tests/data/client_side_operations_timeout/non-tailable-cursors.yml +307 -0
- data/spec/spec_tests/data/client_side_operations_timeout/override-collection-timeoutMS.yml +1877 -0
- data/spec/spec_tests/data/client_side_operations_timeout/override-operation-timeoutMS.yml +1918 -0
- data/spec/spec_tests/data/client_side_operations_timeout/retryability-legacy-timeouts.yml +1676 -0
- data/spec/spec_tests/data/client_side_operations_timeout/retryability-timeoutMS.yml +2824 -0
- data/spec/spec_tests/data/client_side_operations_timeout/sessions-inherit-timeoutMS.yml +168 -0
- data/spec/spec_tests/data/client_side_operations_timeout/sessions-override-operation-timeoutMS.yml +171 -0
- data/spec/spec_tests/data/client_side_operations_timeout/sessions-override-timeoutMS.yml +168 -0
- data/spec/spec_tests/data/client_side_operations_timeout/tailable-awaitData.yml +247 -0
- data/spec/spec_tests/data/client_side_operations_timeout/tailable-non-awaitData.yml +181 -0
- data/spec/spec_tests/data/cmap/connection-must-have-id.yml +2 -0
- data/spec/spec_tests/data/cmap/connection-must-order-ids.yml +2 -0
- data/spec/spec_tests/data/cmap/pool-checkin-destroy-closed.yml +2 -0
- data/spec/spec_tests/data/cmap/pool-checkin-destroy-stale.yml +2 -0
- data/spec/spec_tests/data/cmap/pool-checkin-make-available.yml +3 -1
- data/spec/spec_tests/data/cmap/pool-checkin.yml +5 -0
- data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +2 -0
- data/spec/spec_tests/data/cmap/pool-checkout-custom-maxConnecting-is-enforced.yml +50 -0
- data/spec/spec_tests/data/cmap/pool-checkout-error-closed.yml +2 -0
- data/spec/spec_tests/data/cmap/pool-checkout-maxConnecting-is-enforced.yml +81 -0
- data/spec/spec_tests/data/cmap/pool-checkout-maxConnecting-timeout.yml +71 -0
- data/spec/spec_tests/data/cmap/pool-checkout-minPoolSize-connection-maxConnecting.yml +64 -0
- data/spec/spec_tests/data/cmap/pool-checkout-multiple.yml +2 -0
- data/spec/spec_tests/data/cmap/pool-checkout-no-idle.yml +6 -0
- data/spec/spec_tests/data/cmap/pool-checkout-no-stale.yml +8 -0
- data/spec/spec_tests/data/cmap/pool-checkout-returned-connection-maxConnecting.yml +88 -0
- data/spec/spec_tests/data/cmap/pool-clear-interrupting-pending-connections.yml +43 -0
- data/spec/spec_tests/data/cmap/pool-clear-min-size.yml +41 -0
- data/spec/spec_tests/data/cmap/pool-clear-paused.yml +18 -0
- data/spec/spec_tests/data/cmap/pool-clear-ready.yml +39 -0
- data/spec/spec_tests/data/cmap/pool-clear-schedule-run-interruptInUseConnections-false.yml +48 -0
- data/spec/spec_tests/data/cmap/pool-close-destroy-conns.yml +2 -0
- data/spec/spec_tests/data/cmap/pool-create-max-size.yml +2 -0
- data/spec/spec_tests/data/cmap/pool-create-min-size-error.yml +43 -0
- data/spec/spec_tests/data/cmap/pool-create-min-size.yml +9 -0
- data/spec/spec_tests/data/cmap/pool-ready-ready.yml +22 -0
- data/spec/spec_tests/data/cmap/pool-ready.yml +30 -0
- data/spec/spec_tests/data/cmap/wait-queue-fairness.yml +2 -0
- data/spec/spec_tests/data/cmap/wait-queue-timeout.yml +6 -1
- data/spec/spec_tests/data/collection_management/clustered-indexes.yml +135 -0
- data/spec/spec_tests/data/collection_management/createCollection-pre_and_post_images.yml +50 -0
- data/spec/spec_tests/data/collection_management/modifyCollection-errorResponse.yml +59 -0
- data/spec/spec_tests/data/collection_management/modifyCollection-pre_and_post_images.yml +58 -0
- data/spec/spec_tests/data/collection_management/timeseries-collection.yml +35 -0
- data/spec/spec_tests/data/command_monitoring_unified/bulkWrite.yml +68 -0
- data/spec/spec_tests/data/command_monitoring_unified/command.yml +50 -0
- data/spec/spec_tests/data/command_monitoring_unified/deleteMany.yml +79 -0
- data/spec/spec_tests/data/command_monitoring_unified/deleteOne.yml +79 -0
- data/spec/spec_tests/data/command_monitoring_unified/find.yml +254 -0
- data/spec/spec_tests/data/command_monitoring_unified/insertMany.yml +79 -0
- data/spec/spec_tests/data/command_monitoring_unified/insertOne.yml +77 -0
- data/spec/spec_tests/data/command_monitoring_unified/pre-42-server-connection-id.yml +56 -0
- data/spec/spec_tests/data/command_monitoring_unified/redacted-commands.yml +8 -0
- data/spec/spec_tests/data/command_monitoring_unified/server-connection-id.yml +56 -0
- data/spec/spec_tests/data/command_monitoring_unified/unacknowledgedBulkWrite.yml +55 -0
- data/spec/spec_tests/data/command_monitoring_unified/updateMany.yml +87 -0
- data/spec/spec_tests/data/command_monitoring_unified/updateOne.yml +118 -0
- data/spec/spec_tests/data/command_monitoring_unified/writeConcernError.yml +80 -0
- data/spec/spec_tests/data/connection_string/invalid-uris.yml +0 -10
- data/spec/spec_tests/data/connection_string/valid-options.yml +13 -0
- data/spec/spec_tests/data/crud/read/aggregate-collation.yml +1 -1
- data/spec/spec_tests/data/crud/read/count-collation.yml +1 -1
- data/spec/spec_tests/data/crud/read/distinct-collation.yml +1 -1
- data/spec/spec_tests/data/crud/read/find-collation.yml +1 -1
- data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +1 -1
- data/spec/spec_tests/data/crud/write/deleteMany-collation.yml +1 -1
- data/spec/spec_tests/data/crud/write/deleteOne-collation.yml +1 -1
- data/spec/spec_tests/data/crud/write/findOneAndDelete-collation.yml +1 -1
- data/spec/spec_tests/data/crud/write/findOneAndReplace-collation.yml +1 -1
- data/spec/spec_tests/data/crud/write/findOneAndUpdate-collation.yml +1 -1
- data/spec/spec_tests/data/crud/write/replaceOne-collation.yml +1 -1
- data/spec/spec_tests/data/crud/write/updateMany-collation.yml +1 -1
- data/spec/spec_tests/data/crud/write/updateOne-collation.yml +1 -1
- data/spec/spec_tests/data/crud_unified/aggregate-allowdiskuse.yml +75 -0
- data/spec/spec_tests/data/crud_unified/aggregate-merge-errorResponse.yml +42 -0
- data/spec/spec_tests/data/crud_unified/aggregate-merge.yml +185 -0
- data/spec/spec_tests/data/crud_unified/aggregate-out-readConcern.yml +171 -0
- data/spec/spec_tests/data/crud_unified/aggregate-write-readPreference.yml +6 -0
- data/spec/spec_tests/data/crud_unified/aggregate.yml +215 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-arrayFilters-clientError.yml +98 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-arrayFilters.yml +174 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-comment.yml +189 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint-clientError.yml +113 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint-serverError.yml +142 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-delete-hint.yml +154 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-deleteMany-hint-unacknowledged.yml +98 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-deleteMany-let.yml +86 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-deleteOne-hint-unacknowledged.yml +97 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-deleteOne-let.yml +86 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-errorResponse.yml +50 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-insertOne-dots_and_dollars.yml +138 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-dots_and_dollars.yml +165 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-hint-unacknowledged.yml +103 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-replaceOne-let.yml +93 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint-clientError.yml +148 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint-serverError.yml +239 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-update-hint.yml +256 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-update-validation.yml +73 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-dots_and_dollars.yml +150 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-hint-unacknowledged.yml +104 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-updateMany-let.yml +96 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-dots_and_dollars.yml +150 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-hint-unacknowledged.yml +103 -0
- data/spec/spec_tests/data/crud_unified/bulkWrite-updateOne-let.yml +95 -0
- data/spec/spec_tests/data/crud_unified/countDocuments-comment.yml +92 -0
- data/spec/spec_tests/data/crud_unified/db-aggregate-write-readPreference.yml +6 -0
- data/spec/spec_tests/data/crud_unified/db-aggregate.yml +73 -0
- data/spec/spec_tests/data/crud_unified/deleteMany-comment.yml +97 -0
- data/spec/spec_tests/data/crud_unified/deleteMany-hint-clientError.yml +87 -0
- data/spec/spec_tests/data/crud_unified/deleteMany-hint-serverError.yml +107 -0
- data/spec/spec_tests/data/crud_unified/deleteMany-hint-unacknowledged.yml +90 -0
- data/spec/spec_tests/data/crud_unified/deleteMany-hint.yml +99 -0
- data/spec/spec_tests/data/crud_unified/deleteMany-let.yml +2 -0
- data/spec/spec_tests/data/crud_unified/deleteOne-comment.yml +98 -0
- data/spec/spec_tests/data/crud_unified/deleteOne-errorResponse.yml +46 -0
- data/spec/spec_tests/data/crud_unified/deleteOne-hint-clientError.yml +80 -0
- data/spec/spec_tests/data/crud_unified/deleteOne-hint-serverError.yml +100 -0
- data/spec/spec_tests/data/crud_unified/deleteOne-hint-unacknowledged.yml +89 -0
- data/spec/spec_tests/data/crud_unified/deleteOne-hint.yml +95 -0
- data/spec/spec_tests/data/crud_unified/deleteOne-let.yml +2 -0
- data/spec/spec_tests/data/crud_unified/distinct-comment.yml +98 -0
- data/spec/spec_tests/data/crud_unified/estimatedDocumentCount-comment.yml +95 -0
- data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +49 -135
- data/spec/spec_tests/data/crud_unified/find-allowdiskuse-clientError.yml +55 -0
- data/spec/spec_tests/data/crud_unified/find-allowdiskuse-serverError.yml +68 -0
- data/spec/spec_tests/data/crud_unified/find-allowdiskuse.yml +79 -0
- data/spec/spec_tests/data/crud_unified/find-comment.yml +166 -0
- data/spec/spec_tests/data/crud_unified/find-test-all-options.yml +377 -0
- data/spec/spec_tests/data/crud_unified/find.yml +68 -0
- data/spec/spec_tests/data/crud_unified/findOneAndDelete-comment.yml +96 -0
- data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-clientError.yml +91 -0
- data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-serverError.yml +107 -0
- data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint-unacknowledged.yml +88 -0
- data/spec/spec_tests/data/crud_unified/findOneAndDelete-hint.yml +102 -0
- data/spec/spec_tests/data/crud_unified/findOneAndDelete-let.yml +2 -4
- data/spec/spec_tests/data/crud_unified/findOneAndReplace-comment.yml +101 -0
- data/spec/spec_tests/data/crud_unified/findOneAndReplace-dots_and_dollars.yml +140 -0
- data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-clientError.yml +83 -0
- data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-serverError.yml +99 -0
- data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint-unacknowledged.yml +96 -0
- data/spec/spec_tests/data/crud_unified/findOneAndReplace-hint.yml +98 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-comment.yml +95 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-dots_and_dollars.yml +127 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-errorResponse.yml +69 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-clientError.yml +84 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-serverError.yml +100 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint-unacknowledged.yml +92 -0
- data/spec/spec_tests/data/crud_unified/findOneAndUpdate-hint.yml +99 -0
- data/spec/spec_tests/data/crud_unified/insertMany-comment.yml +93 -0
- data/spec/spec_tests/data/crud_unified/insertMany-dots_and_dollars.yml +128 -0
- data/spec/spec_tests/data/crud_unified/insertOne-comment.yml +91 -0
- data/spec/spec_tests/data/crud_unified/insertOne-dots_and_dollars.yml +238 -0
- data/spec/spec_tests/data/crud_unified/insertOne-errorResponse.yml +46 -0
- data/spec/spec_tests/data/crud_unified/replaceOne-comment.yml +105 -0
- data/spec/spec_tests/data/crud_unified/replaceOne-dots_and_dollars.yml +180 -0
- data/spec/spec_tests/data/crud_unified/replaceOne-hint-unacknowledged.yml +95 -0
- data/spec/spec_tests/data/crud_unified/replaceOne-hint.yml +108 -0
- data/spec/spec_tests/data/crud_unified/replaceOne-let.yml +98 -0
- data/spec/spec_tests/data/crud_unified/replaceOne-validation.yml +37 -0
- data/spec/spec_tests/data/crud_unified/updateMany-comment.yml +104 -0
- data/spec/spec_tests/data/crud_unified/updateMany-dots_and_dollars.yml +138 -0
- data/spec/spec_tests/data/crud_unified/updateMany-hint-clientError.yml +91 -0
- data/spec/spec_tests/data/crud_unified/updateMany-hint-serverError.yml +115 -0
- data/spec/spec_tests/data/crud_unified/updateMany-hint-unacknowledged.yml +96 -0
- data/spec/spec_tests/data/crud_unified/updateMany-hint.yml +115 -0
- data/spec/spec_tests/data/crud_unified/updateMany-let.yml +5 -1
- data/spec/spec_tests/data/crud_unified/updateMany-validation.yml +39 -0
- data/spec/spec_tests/data/crud_unified/updateOne-comment.yml +104 -0
- data/spec/spec_tests/data/crud_unified/updateOne-dots_and_dollars.yml +138 -0
- data/spec/spec_tests/data/crud_unified/updateOne-errorResponse.yml +47 -0
- data/spec/spec_tests/data/crud_unified/updateOne-hint-clientError.yml +85 -0
- data/spec/spec_tests/data/crud_unified/updateOne-hint-serverError.yml +109 -0
- data/spec/spec_tests/data/crud_unified/updateOne-hint-unacknowledged.yml +95 -0
- data/spec/spec_tests/data/crud_unified/updateOne-hint.yml +109 -0
- data/spec/spec_tests/data/crud_unified/updateOne-let.yml +5 -1
- data/spec/spec_tests/data/crud_unified/updateOne-validation.yml +37 -0
- data/spec/spec_tests/data/crud_unified/updateWithPipelines.yml +8 -14
- data/spec/spec_tests/data/gridfs_unified/delete.yml +198 -0
- data/spec/spec_tests/data/gridfs_unified/download.yml +241 -0
- data/spec/spec_tests/data/gridfs_unified/downloadByName.yml +159 -0
- data/spec/spec_tests/data/gridfs_unified/upload-disableMD5.yml +92 -0
- data/spec/spec_tests/data/gridfs_unified/upload.yml +288 -0
- data/spec/spec_tests/data/index_management/createSearchIndex.yml +64 -0
- data/spec/spec_tests/data/index_management/createSearchIndexes.yml +86 -0
- data/spec/spec_tests/data/index_management/dropSearchIndex.yml +43 -0
- data/spec/spec_tests/data/index_management/listSearchIndexes.yml +91 -0
- data/spec/spec_tests/data/index_management/updateSearchIndex.yml +46 -0
- data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-serverErrors-pre4.9.yml → legacy/estimatedDocumentCount-serverErrors.yml} +0 -2
- data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount-pre4.9.yml → legacy/estimatedDocumentCount.yml} +0 -2
- data/spec/spec_tests/data/retryable_reads/unified/handshakeError.yml +1342 -0
- data/spec/spec_tests/data/retryable_writes/{bulkWrite-serverErrors.yml → legacy/bulkWrite-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_writes/{deleteOne-serverErrors.yml → legacy/deleteOne-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_writes/{findOneAndDelete-serverErrors.yml → legacy/findOneAndDelete-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_writes/{findOneAndReplace-serverErrors.yml → legacy/findOneAndReplace-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate-serverErrors.yml → legacy/findOneAndUpdate-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_writes/{insertMany-serverErrors.yml → legacy/insertMany-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_writes/{insertOne-serverErrors.yml → legacy/insertOne-serverErrors.yml} +5 -5
- data/spec/spec_tests/data/retryable_writes/{replaceOne-serverErrors.yml → legacy/replaceOne-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_writes/{updateOne-serverErrors.yml → legacy/updateOne-serverErrors.yml} +1 -1
- data/spec/spec_tests/data/retryable_writes/unified/bulkWrite-serverErrors.yml +93 -0
- data/spec/spec_tests/data/retryable_writes/unified/handshakeError.yml +785 -0
- data/spec/spec_tests/data/retryable_writes/unified/insertOne-noWritesPerformedError.yml +54 -0
- data/spec/spec_tests/data/retryable_writes/unified/insertOne-serverErrors.yml +75 -0
- data/spec/spec_tests/data/run_command_unified/runCommand.yml +319 -0
- data/spec/spec_tests/data/sdam/errors/prefer-error-code.yml +2 -2
- data/spec/spec_tests/data/sdam/rs/electionId_precedence_setVersion.yml +62 -0
- data/spec/spec_tests/data/sdam/rs/null_election_id-pre-6.0.yml +175 -0
- data/spec/spec_tests/data/sdam/rs/null_election_id.yml +20 -18
- data/spec/spec_tests/data/sdam/rs/secondary_ignore_ok_0-pre-6.0.yml +87 -0
- data/spec/spec_tests/data/sdam/rs/secondary_ignore_ok_0.yml +1 -1
- data/spec/spec_tests/data/sdam/rs/set_version_can_rollback.yml +101 -0
- data/spec/spec_tests/data/sdam/rs/setversion_equal_max_without_electionid.yml +78 -0
- data/spec/spec_tests/data/sdam/rs/setversion_greaterthan_max_without_electionid.yml +79 -0
- data/spec/spec_tests/data/sdam/rs/setversion_without_electionid-pre-6.0.yml +79 -0
- data/spec/spec_tests/data/sdam/rs/setversion_without_electionid.yml +9 -10
- data/spec/spec_tests/data/sdam/rs/use_setversion_without_electionid-pre-6.0.yml +117 -0
- data/spec/spec_tests/data/sdam/rs/use_setversion_without_electionid.yml +23 -21
- data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +1 -1
- data/spec/spec_tests/data/sdam_monitoring/replica_set_with_no_primary.yml +38 -39
- data/spec/spec_tests/data/sdam_monitoring/replica_set_with_primary.yml +38 -39
- data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +1 -1
- data/spec/spec_tests/data/sdam_monitoring/required_replica_set.yml +1 -1
- data/spec/spec_tests/data/sdam_monitoring/standalone.yml +1 -1
- data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +2 -2
- data/spec/spec_tests/data/sdam_unified/auth-error.yml +130 -0
- data/spec/spec_tests/data/sdam_unified/auth-misc-command-error.yml +132 -0
- data/spec/spec_tests/data/sdam_unified/auth-network-error.yml +132 -0
- data/spec/spec_tests/data/sdam_unified/auth-network-timeout-error.yml +138 -0
- data/spec/spec_tests/data/sdam_unified/auth-shutdown-error.yml +133 -0
- data/spec/spec_tests/data/sdam_unified/cancel-server-check.yml +143 -0
- data/spec/spec_tests/data/sdam_unified/connectTimeoutMS.yml +130 -0
- data/spec/spec_tests/data/sdam_unified/find-network-error.yml +135 -0
- data/spec/spec_tests/data/sdam_unified/find-network-timeout-error.yml +119 -0
- data/spec/spec_tests/data/sdam_unified/find-shutdown-error.yml +163 -0
- data/spec/spec_tests/data/sdam_unified/hello-command-error.yml +233 -0
- data/spec/spec_tests/data/sdam_unified/hello-network-error.yml +228 -0
- data/spec/spec_tests/data/sdam_unified/hello-timeout.yml +318 -0
- data/spec/spec_tests/data/sdam_unified/insert-network-error.yml +137 -0
- data/spec/spec_tests/data/sdam_unified/insert-shutdown-error.yml +162 -0
- data/spec/spec_tests/data/sdam_unified/interruptInUse-pool-clear.yml +340 -0
- data/spec/spec_tests/data/sdam_unified/minPoolSize-error.yml +125 -0
- data/spec/spec_tests/data/sdam_unified/pool-cleared-error.yml +239 -0
- data/spec/spec_tests/data/sdam_unified/rediscover-quickly-after-step-down.yml +144 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-directConnection.yml +6 -5
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-no-results.yml +5 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-replicaSet-errors.yml +2 -2
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-txt.yml +5 -4
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true-txt.yml +5 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true.yml +5 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero-txt.yml +11 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/srvMaxHosts-zero.yml +11 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srv-service-name.yml +11 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-conflicts_with_replicaSet-txt.yml +5 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-conflicts_with_replicaSet.yml +5 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-equal_to_srv_records.yml +16 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-greater_than_srv_records.yml +15 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-less_than_srv_records.yml +15 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-zero-txt.yml +15 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/srvMaxHosts-zero.yml +15 -0
- data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-equal_to_srv_records.yml +13 -0
- data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-greater_than_srv_records.yml +12 -0
- data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-less_than_srv_records.yml +10 -0
- data/spec/spec_tests/data/seed_list_discovery/sharded/srvMaxHosts-zero.yml +11 -0
- data/spec/spec_tests/data/server_selection/Unknown/read/ghost.yml +11 -0
- data/spec/spec_tests/data/server_selection/Unknown/write/ghost.yml +11 -0
- data/spec/spec_tests/data/sessions_unified/driver-sessions-dirty-session-errors.yml +351 -0
- data/spec/spec_tests/data/sessions_unified/driver-sessions-server-support.yml +123 -0
- data/spec/spec_tests/data/sessions_unified/implicit-sessions-default-causal-consistency.yml +119 -0
- data/spec/spec_tests/data/sessions_unified/snapshot-sessions-not-supported-client-error.yml +9 -3
- data/spec/spec_tests/data/sessions_unified/snapshot-sessions-unsupported-ops.yml +1 -1
- data/spec/spec_tests/data/sessions_unified/snapshot-sessions.yml +1 -1
- data/spec/spec_tests/data/transactions/error-labels.yml +1 -1
- data/spec/spec_tests/data/transactions/errors-client.yml +8 -9
- data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +1 -1
- data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +0 -2
- data/spec/spec_tests/data/transactions/retryable-abort.yml +7 -9
- data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +0 -2
- data/spec/spec_tests/data/transactions/retryable-commit.yml +7 -9
- data/spec/spec_tests/data/transactions/retryable-writes.yml +0 -2
- data/spec/spec_tests/data/transactions_unified/do-not-retry-read-in-transaction.yml +64 -0
- data/spec/spec_tests/data/transactions_unified/mongos-unpin.yml +1 -1
- data/spec/spec_tests/data/transactions_unified/retryable-abort-handshake.yml +118 -0
- data/spec/spec_tests/data/transactions_unified/retryable-commit-handshake.yml +118 -0
- data/spec/spec_tests/data/unified/valid-fail/entity-findCursor-malformed.yml +31 -0
- data/spec/spec_tests/data/unified/valid-fail/entity-findCursor.yml +31 -0
- data/spec/spec_tests/data/unified/valid-fail/ignoreResultAndError-malformed.yml +34 -0
- data/spec/spec_tests/data/unified/valid-fail/ignoreResultAndError.yml +35 -0
- data/spec/spec_tests/data/unified/valid-fail/operation-unsupported.yml +13 -0
- data/spec/spec_tests/data/unified/valid-pass/assertNumberConnectionsCheckedOut.yml +17 -0
- data/spec/spec_tests/data/unified/valid-pass/collectionData-createOptions.yml +37 -0
- data/spec/spec_tests/data/unified/valid-pass/entity-client-cmap-events.yml +40 -0
- data/spec/spec_tests/data/unified/valid-pass/entity-client-storeEventsAsEntities.yml +37 -0
- data/spec/spec_tests/data/unified/valid-pass/expectedError-errorResponse.yml +39 -0
- data/spec/spec_tests/data/unified/valid-pass/expectedEventsForClient-eventType.yml +66 -0
- data/spec/spec_tests/data/unified/valid-pass/expectedEventsForClient-ignoreExtraEvents.yml +78 -0
- data/spec/spec_tests/data/unified/valid-pass/ignoreResultAndError.yml +34 -0
- data/spec/spec_tests/data/unified/valid-pass/observeSensitiveCommands.yml +255 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +22 -1
- data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +3 -3
- data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +19 -13
- data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +3 -3
- data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +9 -9
- data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +3 -4
- data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +1 -1
- data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +1 -1
- data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +6 -5
- data/spec/spec_tests/data/uri_options/srv-options.yml +96 -0
- data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +6 -4
- data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +7 -5
- data/spec/spec_tests/data/versioned_api/transaction-handling.yml +4 -4
- data/spec/spec_tests/gridfs_spec.rb +1 -1
- data/spec/spec_tests/gridfs_unified_spec.rb +13 -0
- data/spec/spec_tests/index_management_unified_spec.rb +13 -0
- data/spec/spec_tests/load_balancers_spec.rb +1 -1
- data/spec/spec_tests/max_staleness_spec.rb +1 -1
- data/spec/spec_tests/read_write_concern_connection_string_spec.rb +1 -1
- data/spec/spec_tests/read_write_concern_document_spec.rb +1 -1
- data/spec/spec_tests/read_write_concern_operaton_spec.rb +1 -1
- data/spec/spec_tests/retryable_reads_spec.rb +7 -2
- data/spec/spec_tests/retryable_reads_unified_spec.rb +22 -0
- data/spec/spec_tests/retryable_writes_spec.rb +5 -2
- data/spec/spec_tests/retryable_writes_unified_spec.rb +21 -0
- data/spec/spec_tests/run_command_unified_spec.rb +13 -0
- data/spec/spec_tests/sdam_monitoring_spec.rb +1 -1
- data/spec/spec_tests/sdam_spec.rb +5 -1
- data/spec/spec_tests/sdam_unified_spec.rb +15 -0
- data/spec/spec_tests/seed_list_discovery_spec.rb +11 -2
- data/spec/spec_tests/server_selection_rtt_spec.rb +7 -7
- data/spec/spec_tests/server_selection_spec.rb +1 -1
- data/spec/spec_tests/sessions_unified_spec.rb +1 -1
- data/spec/spec_tests/transactions_api_spec.rb +1 -1
- data/spec/spec_tests/transactions_spec.rb +1 -1
- data/spec/spec_tests/transactions_unified_spec.rb +3 -2
- data/spec/spec_tests/unified_spec.rb +2 -2
- data/spec/spec_tests/uri_options_spec.rb +1 -1
- data/spec/spec_tests/versioned_api_spec.rb +1 -1
- data/spec/stress/cleanup_spec.rb +1 -1
- data/spec/stress/connection_pool_stress_spec.rb +1 -62
- data/spec/stress/connection_pool_timing_spec.rb +12 -36
- data/spec/stress/fork_reconnect_stress_spec.rb +10 -10
- data/spec/stress/push_monitor_close_spec.rb +1 -1
- data/spec/support/authorization.rb +2 -2
- data/spec/support/aws_utils/base.rb +1 -1
- data/spec/support/aws_utils/inspector.rb +1 -1
- data/spec/support/aws_utils/orchestrator.rb +20 -8
- data/spec/support/aws_utils/provisioner.rb +1 -1
- data/spec/support/aws_utils.rb +4 -3
- data/spec/support/background_thread_registry.rb +4 -14
- data/spec/support/certificates/atlas-ocsp-ca.crt +89 -79
- data/spec/support/certificates/atlas-ocsp.crt +117 -122
- data/spec/support/certificates/retrieve-atlas-cert +40 -0
- data/spec/support/client_registry.rb +6 -2
- data/spec/support/client_registry_macros.rb +1 -1
- data/spec/support/cluster_tools.rb +17 -12
- data/spec/support/common_shortcuts.rb +53 -6
- data/spec/support/constraints.rb +21 -1
- data/spec/support/crypt/corpus/corpus-encrypted.json +9515 -0
- data/spec/support/crypt/corpus/corpus-key-aws.json +32 -32
- data/spec/support/crypt/corpus/corpus-key-azure.json +33 -0
- data/spec/support/crypt/corpus/corpus-key-gcp.json +35 -0
- data/spec/support/crypt/corpus/corpus-key-kmip.json +32 -0
- data/spec/support/crypt/corpus/corpus-key-local.json +30 -30
- data/spec/support/crypt/corpus/corpus-schema.json +4399 -121
- data/spec/support/crypt/corpus/corpus.json +4999 -37
- data/spec/support/crypt/data_keys/key_document_azure.json +33 -0
- data/spec/support/crypt/data_keys/key_document_gcp.json +37 -0
- data/spec/support/crypt/data_keys/key_document_kmip.json +32 -0
- data/spec/support/crypt/encrypted_fields/encryptedFields.json +32 -0
- data/spec/support/crypt/encrypted_fields/range-encryptedFields-Date.json +30 -0
- data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalNoPrecision.json +21 -0
- data/spec/support/crypt/encrypted_fields/range-encryptedFields-DecimalPrecision.json +29 -0
- data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoubleNoPrecision.json +21 -0
- data/spec/support/crypt/encrypted_fields/range-encryptedFields-DoublePrecision.json +30 -0
- data/spec/support/crypt/encrypted_fields/range-encryptedFields-Int.json +27 -0
- data/spec/support/crypt/encrypted_fields/range-encryptedFields-Long.json +27 -0
- data/spec/support/crypt/keys/key1-document.json +30 -0
- data/spec/support/crypt/schema_maps/schema_map_azure.json +17 -0
- data/spec/support/crypt/schema_maps/schema_map_azure_key_alt_names.json +12 -0
- data/spec/support/crypt/schema_maps/schema_map_gcp.json +17 -0
- data/spec/support/crypt/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
- data/spec/support/crypt/schema_maps/schema_map_kmip.json +17 -0
- data/spec/support/crypt/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
- data/spec/support/crypt.rb +269 -14
- data/spec/support/dns.rb +1 -1
- data/spec/support/json_ext_formatter.rb +1 -1
- data/spec/support/keyword_struct.rb +1 -1
- data/spec/support/local_resource_registry.rb +1 -1
- data/spec/support/macros.rb +29 -0
- data/spec/support/matchers.rb +5 -5
- data/spec/support/mongos_macros.rb +24 -0
- data/spec/support/monitoring_ext.rb +1 -1
- data/spec/support/ocsp +1 -1
- data/spec/support/primary_socket.rb +1 -1
- data/spec/support/recording_logger.rb +27 -0
- data/spec/support/sdam_formatter_integration.rb +1 -1
- data/spec/support/shared/app_metadata.rb +15 -3
- data/spec/support/shared/auth_context.rb +1 -0
- data/spec/support/shared/protocol.rb +1 -1
- data/spec/support/shared/scram_conversation.rb +3 -2
- data/spec/support/shared/server_selector.rb +1 -1
- data/spec/support/shared/session.rb +16 -10
- data/spec/support/spec_config.rb +133 -2
- data/spec/support/spec_setup.rb +3 -3
- data/spec/support/using_hash.rb +11 -2
- data/spec/support/utils.rb +280 -229
- metadata +1790 -1289
- checksums.yaml.gz.sig +0 -0
- data/lib/mongo/operation/aggregate/command.rb +0 -55
- data/lib/mongo/operation/collections_info/command.rb +0 -48
- data/lib/mongo/operation/count/command.rb +0 -47
- data/lib/mongo/operation/create/command.rb +0 -47
- data/lib/mongo/operation/create_index/command.rb +0 -61
- data/lib/mongo/operation/delete/command.rb +0 -52
- data/lib/mongo/operation/delete/legacy.rb +0 -64
- data/lib/mongo/operation/distinct/command.rb +0 -47
- data/lib/mongo/operation/explain/command.rb +0 -58
- data/lib/mongo/operation/explain/legacy.rb +0 -52
- data/lib/mongo/operation/find/builder/legacy.rb +0 -123
- data/lib/mongo/operation/find/command.rb +0 -51
- data/lib/mongo/operation/find/legacy/result.rb +0 -46
- data/lib/mongo/operation/find/legacy.rb +0 -52
- data/lib/mongo/operation/get_more/command.rb +0 -43
- data/lib/mongo/operation/indexes/command.rb +0 -42
- data/lib/mongo/operation/indexes/legacy.rb +0 -48
- data/lib/mongo/operation/insert/command.rb +0 -59
- data/lib/mongo/operation/insert/legacy.rb +0 -68
- data/lib/mongo/operation/kill_cursors/command.rb +0 -48
- data/lib/mongo/operation/list_collections/command.rb +0 -46
- data/lib/mongo/operation/map_reduce/command.rb +0 -51
- data/lib/mongo/operation/parallel_scan/command.rb +0 -57
- data/lib/mongo/operation/remove_user/command.rb +0 -46
- data/lib/mongo/operation/shared/op_msg_or_find_command.rb +0 -44
- data/lib/mongo/operation/update/command.rb +0 -53
- data/lib/mongo/operation/update/legacy/result.rb +0 -112
- data/lib/mongo/operation/update/legacy.rb +0 -76
- data/lib/mongo/operation/users_info/command.rb +0 -46
- data/lib/mongo/operation/write_command/command.rb +0 -51
- data/lib/mongo/protocol/delete.rb +0 -172
- data/lib/mongo/protocol/insert.rb +0 -181
- data/lib/mongo/protocol/update.rb +0 -214
- data/spec/mongo/dbref_spec.rb +0 -152
- data/spec/mongo/operation/delete/command_spec.rb +0 -115
- data/spec/mongo/operation/find/legacy_spec.rb +0 -131
- data/spec/mongo/operation/get_more_spec.rb +0 -63
- data/spec/mongo/operation/insert/command_spec.rb +0 -118
- data/spec/mongo/operation/kill_cursors_spec.rb +0 -47
- data/spec/mongo/operation/update/command_spec.rb +0 -122
- data/spec/mongo/protocol/delete_spec.rb +0 -185
- data/spec/mongo/protocol/insert_spec.rb +0 -179
- data/spec/mongo/protocol/update_spec.rb +0 -204
- data/spec/mongo/server/round_trip_time_averager_spec.rb +0 -48
- data/spec/shared/LICENSE +0 -20
- data/spec/shared/bin/get-mongodb-download-url +0 -17
- data/spec/shared/bin/s3-copy +0 -45
- data/spec/shared/bin/s3-upload +0 -69
- data/spec/shared/lib/mrss/child_process_helper.rb +0 -80
- data/spec/shared/lib/mrss/cluster_config.rb +0 -231
- data/spec/shared/lib/mrss/constraints.rb +0 -385
- data/spec/shared/lib/mrss/docker_runner.rb +0 -271
- data/spec/shared/lib/mrss/event_subscriber.rb +0 -200
- data/spec/shared/lib/mrss/lite_constraints.rb +0 -191
- data/spec/shared/lib/mrss/server_version_registry.rb +0 -120
- data/spec/shared/lib/mrss/spec_organizer.rb +0 -179
- data/spec/shared/lib/mrss/utils.rb +0 -15
- data/spec/shared/share/Dockerfile.erb +0 -323
- data/spec/shared/share/haproxy-1.conf +0 -16
- data/spec/shared/share/haproxy-2.conf +0 -17
- data/spec/shared/shlib/distro.sh +0 -73
- data/spec/shared/shlib/server.sh +0 -367
- data/spec/shared/shlib/set_env.sh +0 -131
- data/spec/spec_tests/change_streams_spec.rb +0 -93
- data/spec/spec_tests/command_monitoring_spec.rb +0 -71
- data/spec/spec_tests/data/change_streams/change-streams-errors.yml +0 -101
- data/spec/spec_tests/data/change_streams/change-streams-resume-allowlist.yml +0 -1173
- data/spec/spec_tests/data/change_streams/change-streams-resume-errorLabels.yml +0 -1105
- data/spec/spec_tests/data/change_streams/change-streams.yml +0 -535
- data/spec/spec_tests/data/command_monitoring/bulkWrite.yml +0 -49
- data/spec/spec_tests/data/command_monitoring/command.yml +0 -61
- data/spec/spec_tests/data/command_monitoring/deleteMany.yml +0 -55
- data/spec/spec_tests/data/command_monitoring/deleteOne.yml +0 -55
- data/spec/spec_tests/data/command_monitoring/find.yml +0 -266
- data/spec/spec_tests/data/command_monitoring/insertMany.yml +0 -75
- data/spec/spec_tests/data/command_monitoring/insertOne.yml +0 -51
- data/spec/spec_tests/data/command_monitoring/unacknowledgedBulkWrite.yml +0 -34
- data/spec/spec_tests/data/command_monitoring/updateMany.yml +0 -65
- data/spec/spec_tests/data/command_monitoring/updateOne.yml +0 -90
- data/spec/spec_tests/data/crud_v2/aggregate-merge.yml +0 -103
- data/spec/spec_tests/data/crud_v2/aggregate-out-readConcern.yml +0 -111
- data/spec/spec_tests/data/crud_v2/bulkWrite-arrayFilters.yml +0 -103
- data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-clientError.yml +0 -63
- data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-serverError.yml +0 -92
- data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint.yml +0 -103
- data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-clientError.yml +0 -90
- data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-serverError.yml +0 -147
- data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint.yml +0 -164
- data/spec/spec_tests/data/crud_v2/db-aggregate.yml +0 -39
- data/spec/spec_tests/data/crud_v2/deleteMany-hint-clientError.yml +0 -43
- data/spec/spec_tests/data/crud_v2/deleteMany-hint-serverError.yml +0 -62
- data/spec/spec_tests/data/crud_v2/deleteMany-hint.yml +0 -58
- data/spec/spec_tests/data/crud_v2/deleteOne-hint-clientError.yml +0 -41
- data/spec/spec_tests/data/crud_v2/deleteOne-hint-serverError.yml +0 -60
- data/spec/spec_tests/data/crud_v2/deleteOne-hint.yml +0 -57
- data/spec/spec_tests/data/crud_v2/find-allowdiskuse-clientError.yml +0 -28
- data/spec/spec_tests/data/crud_v2/find-allowdiskuse-serverError.yml +0 -44
- data/spec/spec_tests/data/crud_v2/find-allowdiskuse.yml +0 -50
- data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-clientError.yml +0 -45
- data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-serverError.yml +0 -60
- data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint.yml +0 -56
- data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-clientError.yml +0 -40
- data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-serverError.yml +0 -59
- data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint.yml +0 -55
- data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-clientError.yml +0 -40
- data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-serverError.yml +0 -58
- data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint.yml +0 -55
- data/spec/spec_tests/data/crud_v2/replaceOne-hint.yml +0 -61
- data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-delete-hint-clientError.yml +0 -60
- data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-update-hint-clientError.yml +0 -88
- data/spec/spec_tests/data/crud_v2/unacknowledged-deleteMany-hint-clientError.yml +0 -40
- data/spec/spec_tests/data/crud_v2/unacknowledged-deleteOne-hint-clientError.yml +0 -38
- data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndDelete-hint-clientError.yml +0 -42
- data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndReplace-hint-clientError.yml +0 -40
- data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndUpdate-hint-clientError.yml +0 -40
- data/spec/spec_tests/data/crud_v2/unacknowledged-replaceOne-hint-clientError.yml +0 -40
- data/spec/spec_tests/data/crud_v2/unacknowledged-updateMany-hint-clientError.yml +0 -43
- data/spec/spec_tests/data/crud_v2/unacknowledged-updateOne-hint-clientError.yml +0 -40
- data/spec/spec_tests/data/crud_v2/updateMany-hint-clientError.yml +0 -45
- data/spec/spec_tests/data/crud_v2/updateMany-hint-serverError.yml +0 -66
- data/spec/spec_tests/data/crud_v2/updateMany-hint.yml +0 -65
- data/spec/spec_tests/data/crud_v2/updateOne-hint-clientError.yml +0 -43
- data/spec/spec_tests/data/crud_v2/updateOne-hint-serverError.yml +0 -62
- data/spec/spec_tests/data/crud_v2/updateOne-hint.yml +0 -61
- data/spec/spec_tests/data/crud_v2/updateWithPipelines.yml +0 -157
- data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +0 -60
- data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +0 -146
- data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +0 -96
- data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +0 -88
- data/spec/spec_tests/data/sdam_integration/find-network-error.yml +0 -85
- data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +0 -118
- data/spec/spec_tests/data/sdam_integration/hello-command-error.yml +0 -160
- data/spec/spec_tests/data/sdam_integration/hello-network-error.yml +0 -158
- data/spec/spec_tests/data/sdam_integration/hello-timeout.yml +0 -225
- data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +0 -88
- data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +0 -117
- data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +0 -98
- data/spec/spec_tests/sdam_integration_spec.rb +0 -16
- data/spec/support/crypt/corpus/corpus_encrypted.json +0 -4152
- data/spec/support/session_registry.rb +0 -55
- data.tar.gz.sig +0 -0
- metadata.gz.sig +0 -0
- /data/spec/spec_tests/data/retryable_reads/{aggregate-merge.yml → legacy/aggregate-merge.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{aggregate-serverErrors.yml → legacy/aggregate-serverErrors.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{aggregate.yml → legacy/aggregate.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{changeStreams-client.watch-serverErrors.yml → legacy/changeStreams-client.watch-serverErrors.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{changeStreams-client.watch.yml → legacy/changeStreams-client.watch.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{changeStreams-db.coll.watch-serverErrors.yml → legacy/changeStreams-db.coll.watch-serverErrors.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{changeStreams-db.coll.watch.yml → legacy/changeStreams-db.coll.watch.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{changeStreams-db.watch-serverErrors.yml → legacy/changeStreams-db.watch-serverErrors.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{changeStreams-db.watch.yml → legacy/changeStreams-db.watch.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{count-serverErrors.yml → legacy/count-serverErrors.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{count.yml → legacy/count.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{countDocuments-serverErrors.yml → legacy/countDocuments-serverErrors.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{countDocuments.yml → legacy/countDocuments.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{distinct-serverErrors.yml → legacy/distinct-serverErrors.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{distinct.yml → legacy/distinct.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{find-serverErrors.yml → legacy/find-serverErrors.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{find.yml → legacy/find.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{findOne-serverErrors.yml → legacy/findOne-serverErrors.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{findOne.yml → legacy/findOne.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{gridfs-download-serverErrors.yml → legacy/gridfs-download-serverErrors.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{gridfs-download.yml → legacy/gridfs-download.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{gridfs-downloadByName-serverErrors.yml → legacy/gridfs-downloadByName-serverErrors.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{gridfs-downloadByName.yml → legacy/gridfs-downloadByName.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{listCollectionNames-serverErrors.yml → legacy/listCollectionNames-serverErrors.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{listCollectionNames.yml → legacy/listCollectionNames.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{listCollectionObjects-serverErrors.yml → legacy/listCollectionObjects-serverErrors.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{listCollectionObjects.yml → legacy/listCollectionObjects.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{listCollections-serverErrors.yml → legacy/listCollections-serverErrors.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{listCollections.yml → legacy/listCollections.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{listDatabaseNames-serverErrors.yml → legacy/listDatabaseNames-serverErrors.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{listDatabaseNames.yml → legacy/listDatabaseNames.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{listDatabaseObjects-serverErrors.yml → legacy/listDatabaseObjects-serverErrors.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{listDatabaseObjects.yml → legacy/listDatabaseObjects.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{listDatabases-serverErrors.yml → legacy/listDatabases-serverErrors.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{listDatabases.yml → legacy/listDatabases.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{listIndexNames-serverErrors.yml → legacy/listIndexNames-serverErrors.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{listIndexNames.yml → legacy/listIndexNames.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{listIndexes-serverErrors.yml → legacy/listIndexes-serverErrors.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{listIndexes.yml → legacy/listIndexes.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{mapReduce.yml → legacy/mapReduce.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{bulkWrite-errorLabels.yml → legacy/bulkWrite-errorLabels.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{bulkWrite.yml → legacy/bulkWrite.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{deleteMany.yml → legacy/deleteMany.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{deleteOne-errorLabels.yml → legacy/deleteOne-errorLabels.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{deleteOne.yml → legacy/deleteOne.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{findOneAndDelete-errorLabels.yml → legacy/findOneAndDelete-errorLabels.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{findOneAndDelete.yml → legacy/findOneAndDelete.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{findOneAndReplace-errorLabels.yml → legacy/findOneAndReplace-errorLabels.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{findOneAndReplace.yml → legacy/findOneAndReplace.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate-errorLabels.yml → legacy/findOneAndUpdate-errorLabels.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{findOneAndUpdate.yml → legacy/findOneAndUpdate.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{insertMany-errorLabels.yml → legacy/insertMany-errorLabels.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{insertMany.yml → legacy/insertMany.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{insertOne-errorLabels.yml → legacy/insertOne-errorLabels.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{insertOne.yml → legacy/insertOne.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{replaceOne-errorLabels.yml → legacy/replaceOne-errorLabels.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{replaceOne.yml → legacy/replaceOne.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{updateMany.yml → legacy/updateMany.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{updateOne-errorLabels.yml → legacy/updateOne-errorLabels.yml} +0 -0
- /data/spec/spec_tests/data/retryable_writes/{updateOne.yml → legacy/updateOne.yml} +0 -0
@@ -1,5 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
#
|
2
|
+
# rubocop:todo all
|
3
3
|
|
4
4
|
# Copyright (C) 2014-2020 MongoDB Inc.
|
5
5
|
#
|
@@ -29,12 +29,16 @@ module Mongo
|
|
29
29
|
# The default max size for the connection pool.
|
30
30
|
#
|
31
31
|
# @since 2.9.0
|
32
|
-
DEFAULT_MAX_SIZE =
|
32
|
+
DEFAULT_MAX_SIZE = 20
|
33
33
|
|
34
34
|
# The default min size for the connection pool.
|
35
35
|
#
|
36
36
|
# @since 2.9.0
|
37
|
-
DEFAULT_MIN_SIZE = 0
|
37
|
+
DEFAULT_MIN_SIZE = 0
|
38
|
+
|
39
|
+
# The default maximum number of connections that can be connecting at
|
40
|
+
# any given time.
|
41
|
+
DEFAULT_MAX_CONNECTING = 2
|
38
42
|
|
39
43
|
# The default timeout, in seconds, to wait for a connection.
|
40
44
|
#
|
@@ -59,7 +63,13 @@ module Mongo
|
|
59
63
|
# @param [ Server ] server The server which this connection pool is for.
|
60
64
|
# @param [ Hash ] options The connection pool options.
|
61
65
|
#
|
62
|
-
# @option options [ Integer ] :max_size The maximum pool size.
|
66
|
+
# @option options [ Integer ] :max_size The maximum pool size. Setting
|
67
|
+
# this option to zero creates an unlimited connection pool.
|
68
|
+
# @option options [ Integer ] :max_connecting The maximum number of
|
69
|
+
# connections that can be connecting simultaneously. The default is 2.
|
70
|
+
# This option should be increased if there are many threads that share
|
71
|
+
# same connection pool and the application is experiencing timeouts
|
72
|
+
# while waiting for connections to be established.
|
63
73
|
# @option options [ Integer ] :max_pool_size Deprecated.
|
64
74
|
# The maximum pool size. If max_size is also given, max_size and
|
65
75
|
# max_pool_size must be identical.
|
@@ -74,11 +84,21 @@ module Mongo
|
|
74
84
|
# are given, their values must be identical.
|
75
85
|
# @option options [ Float ] :max_idle_time The time, in seconds,
|
76
86
|
# after which idle connections should be closed by the pool.
|
87
|
+
# @option options [ true, false ] :populator_io For internal driver
|
88
|
+
# use only. Set to false to prevent the populator threads from being
|
89
|
+
# created and started in the server's connection pool. It is intended
|
90
|
+
# for use in tests that also turn off monitoring_io, unless the populator
|
91
|
+
# is explicitly needed. If monitoring_io is off, but the populator_io
|
92
|
+
# is on, the populator needs to be manually closed at the end of the
|
93
|
+
# test, since a cluster without monitoring is considered not connected,
|
94
|
+
# and thus will not clean up the connection pool populator threads on
|
95
|
+
# close.
|
77
96
|
# Note: Additionally, options for connections created by this pool should
|
78
97
|
# be included in the options passed here, and they will be forwarded to
|
79
98
|
# any connections created by the pool.
|
80
99
|
#
|
81
100
|
# @since 2.0.0, API changed in 2.9.0
|
101
|
+
|
82
102
|
def initialize(server, options = {})
|
83
103
|
unless server.is_a?(Server)
|
84
104
|
raise ArgumentError, 'First argument must be a Server instance'
|
@@ -98,7 +118,7 @@ module Mongo
|
|
98
118
|
options[:max_size] ||= options[:max_pool_size]
|
99
119
|
options.delete(:max_pool_size)
|
100
120
|
if options[:min_size] && options[:max_size] &&
|
101
|
-
options[:min_size] > options[:max_size]
|
121
|
+
(options[:max_size] != 0 && options[:min_size] > options[:max_size])
|
102
122
|
then
|
103
123
|
raise ArgumentError, "Cannot have min size #{options[:min_size]} exceed max size #{options[:max_size]}"
|
104
124
|
end
|
@@ -111,6 +131,7 @@ module Mongo
|
|
111
131
|
@options = options.freeze
|
112
132
|
|
113
133
|
@generation_manager = GenerationManager.new(server: server)
|
134
|
+
@ready = false
|
114
135
|
@closed = false
|
115
136
|
|
116
137
|
# A connection owned by this pool should be either in the
|
@@ -119,6 +140,7 @@ module Mongo
|
|
119
140
|
@available_connections = available_connections = []
|
120
141
|
@checked_out_connections = Set.new
|
121
142
|
@pending_connections = Set.new
|
143
|
+
@interrupt_connections = []
|
122
144
|
|
123
145
|
# Mutex used for synchronizing access to @available_connections and
|
124
146
|
# @checked_out_connections. The pool object is thread-safe, thus
|
@@ -126,30 +148,42 @@ module Mongo
|
|
126
148
|
# must do so under this lock.
|
127
149
|
@lock = Mutex.new
|
128
150
|
|
129
|
-
# Condition variable broadcast when a connection is added to
|
130
|
-
# @available_connections, to wake up any threads waiting for an
|
131
|
-
# available connection when pool is at max size
|
132
|
-
@available_semaphore = Semaphore.new
|
133
|
-
|
134
151
|
# Background thread reponsible for maintaining the size of
|
135
152
|
# the pool to at least min_size
|
136
153
|
@populator = Populator.new(self, options)
|
137
154
|
@populate_semaphore = Semaphore.new
|
138
155
|
|
156
|
+
# Condition variable to enforce the first check in check_out: max_pool_size.
|
157
|
+
# This condition variable should be signaled when the number of
|
158
|
+
# unavailable connections decreases (pending + pending_connections +
|
159
|
+
# checked_out_connections).
|
160
|
+
@size_cv = Mongo::ConditionVariable.new(@lock)
|
161
|
+
# This represents the number of threads that have made it past the size_cv
|
162
|
+
# gate but have not acquired a connection to add to the pending_connections
|
163
|
+
# set.
|
164
|
+
@connection_requests = 0
|
165
|
+
|
166
|
+
# Condition variable to enforce the second check in check_out: max_connecting.
|
167
|
+
# Thei condition variable should be signaled when the number of pending
|
168
|
+
# connections decreases.
|
169
|
+
@max_connecting_cv = Mongo::ConditionVariable.new(@lock)
|
170
|
+
@max_connecting = options.fetch(:max_connecting, DEFAULT_MAX_CONNECTING)
|
171
|
+
|
139
172
|
ObjectSpace.define_finalizer(self, self.class.finalize(@available_connections, @pending_connections, @populator))
|
140
173
|
|
141
174
|
publish_cmap_event(
|
142
175
|
Monitoring::Event::Cmap::PoolCreated.new(@server.address, options, self)
|
143
176
|
)
|
144
|
-
|
145
|
-
@populator.run! if min_size > 0
|
146
177
|
end
|
147
178
|
|
148
179
|
# @return [ Hash ] options The pool options.
|
149
180
|
attr_reader :options
|
150
181
|
|
151
182
|
# @api private
|
152
|
-
|
183
|
+
attr_reader :server
|
184
|
+
|
185
|
+
# @api private
|
186
|
+
def_delegators :server, :address
|
153
187
|
|
154
188
|
# Get the maximum size of the connection pool.
|
155
189
|
#
|
@@ -171,11 +205,18 @@ module Mongo
|
|
171
205
|
|
172
206
|
# The time to wait, in seconds, for a connection to become available.
|
173
207
|
#
|
208
|
+
# @param [ Mongo::Operation:Context | nil ] context Context of the operation
|
209
|
+
# the connection is requested for, if any.
|
210
|
+
#
|
174
211
|
# @return [ Float ] The queue wait timeout.
|
175
212
|
#
|
176
213
|
# @since 2.9.0
|
177
|
-
def wait_timeout
|
178
|
-
|
214
|
+
def wait_timeout(context = nil)
|
215
|
+
if context&.remaining_timeout_sec.nil?
|
216
|
+
options[:wait_timeout] || DEFAULT_WAIT_TIMEOUT
|
217
|
+
else
|
218
|
+
context&.remaining_timeout_sec
|
219
|
+
end
|
179
220
|
end
|
180
221
|
|
181
222
|
# The maximum seconds a socket can remain idle since it has been
|
@@ -195,7 +236,20 @@ module Mongo
|
|
195
236
|
# being used by the queue.
|
196
237
|
#
|
197
238
|
# @api private
|
198
|
-
|
239
|
+
def_delegators :generation_manager, :generation, :generation_unlocked
|
240
|
+
|
241
|
+
# A connection pool is paused if it is not closed and it is not ready.
|
242
|
+
#
|
243
|
+
# @return [ true | false ] whether the connection pool is paused.
|
244
|
+
#
|
245
|
+
# @raise [ Error::PoolClosedError ] If the pool has been closed.
|
246
|
+
def paused?
|
247
|
+
raise_if_closed!
|
248
|
+
|
249
|
+
@lock.synchronize do
|
250
|
+
!@ready
|
251
|
+
end
|
252
|
+
end
|
199
253
|
|
200
254
|
# Size of the connection pool.
|
201
255
|
#
|
@@ -221,6 +275,14 @@ module Mongo
|
|
221
275
|
end
|
222
276
|
private :unsynchronized_size
|
223
277
|
|
278
|
+
# @return [ Integer ] The number of unavailable connections in the pool.
|
279
|
+
# Used to calculate whether we have hit max_pool_size.
|
280
|
+
#
|
281
|
+
# @api private
|
282
|
+
def unavailable_connections
|
283
|
+
@checked_out_connections.length + @pending_connections.length + @connection_requests
|
284
|
+
end
|
285
|
+
|
224
286
|
# Number of available connections in the pool.
|
225
287
|
#
|
226
288
|
# @return [ Integer ] Number of available connections.
|
@@ -243,14 +305,30 @@ module Mongo
|
|
243
305
|
!!@closed
|
244
306
|
end
|
245
307
|
|
308
|
+
# Whether the pool is ready.
|
309
|
+
#
|
310
|
+
# @return [ true | false ] Whether the pool is ready.
|
311
|
+
def ready?
|
312
|
+
@lock.synchronize do
|
313
|
+
@ready
|
314
|
+
end
|
315
|
+
end
|
316
|
+
|
246
317
|
# @note This method is experimental and subject to change.
|
247
318
|
#
|
248
319
|
# @api experimental
|
249
320
|
# @since 2.11.0
|
250
321
|
def summary
|
251
322
|
@lock.synchronize do
|
323
|
+
state = if closed?
|
324
|
+
'closed'
|
325
|
+
elsif !@ready
|
326
|
+
'paused'
|
327
|
+
else
|
328
|
+
'ready'
|
329
|
+
end
|
252
330
|
"#<ConnectionPool size=#{unsynchronized_size} (#{min_size}-#{max_size}) " +
|
253
|
-
"used=#{@checked_out_connections.length} avail=#{@available_connections.length} pending=#{@pending_connections.length}>"
|
331
|
+
"used=#{@checked_out_connections.length} avail=#{@available_connections.length} pending=#{@pending_connections.length} #{state}>"
|
254
332
|
end
|
255
333
|
end
|
256
334
|
|
@@ -260,6 +338,9 @@ module Mongo
|
|
260
338
|
# @api private
|
261
339
|
attr_reader :populator
|
262
340
|
|
341
|
+
# @api private
|
342
|
+
attr_reader :max_connecting
|
343
|
+
|
263
344
|
# Checks a connection out of the pool.
|
264
345
|
#
|
265
346
|
# If there are active connections in the pool, the most recently used
|
@@ -271,6 +352,10 @@ module Mongo
|
|
271
352
|
# The returned connection counts toward the pool's max size. When the
|
272
353
|
# caller is finished using the connection, the connection should be
|
273
354
|
# checked back in via the check_in method.
|
355
|
+
# @param [ Integer | nil ] :connection_global_id The global id for the
|
356
|
+
# connection to check out.
|
357
|
+
# @param [ Mongo::Operation:Context | nil ] :context Context of the operation
|
358
|
+
# the connection is requested for, if any.
|
274
359
|
#
|
275
360
|
# @return [ Mongo::Server::Connection ] The checked out connection.
|
276
361
|
# @raise [ Error::PoolClosedError ] If the pool has been closed.
|
@@ -278,139 +363,19 @@ module Mongo
|
|
278
363
|
# and remains so for longer than the wait timeout.
|
279
364
|
#
|
280
365
|
# @since 2.9.0
|
281
|
-
def check_out(
|
366
|
+
def check_out(connection_global_id: nil, context: nil)
|
282
367
|
check_invariants
|
283
368
|
|
284
369
|
publish_cmap_event(
|
285
370
|
Monitoring::Event::Cmap::ConnectionCheckOutStarted.new(@server.address)
|
286
371
|
)
|
287
372
|
|
288
|
-
|
289
|
-
|
290
|
-
Monitoring::Event::Cmap::ConnectionCheckOutFailed.new(
|
291
|
-
@server.address,
|
292
|
-
Monitoring::Event::Cmap::ConnectionCheckOutFailed::POOL_CLOSED
|
293
|
-
),
|
294
|
-
)
|
295
|
-
raise Error::PoolClosedError.new(@server.address, self)
|
296
|
-
end
|
297
|
-
|
298
|
-
deadline = Utils.monotonic_time + wait_timeout
|
299
|
-
pid = Process.pid
|
300
|
-
connection = nil
|
301
|
-
# It seems that synchronize sets up its own loop, thus a simple break
|
302
|
-
# is insufficient to break the outer loop
|
303
|
-
catch(:done) do
|
304
|
-
loop do
|
305
|
-
# Lock must be taken on each iteration, rather for the method
|
306
|
-
# overall, otherwise other threads will not be able to check in
|
307
|
-
# a connection while this thread is waiting for one.
|
308
|
-
@lock.synchronize do
|
309
|
-
until @available_connections.empty?
|
310
|
-
connection = next_available_connection(service_id: service_id)
|
311
|
-
|
312
|
-
# If service_id is not nil, connection may be nil here
|
313
|
-
# even if there are available connections in the pool
|
314
|
-
# (they could be to other services).
|
315
|
-
break unless connection
|
316
|
-
|
317
|
-
if connection.pid != pid
|
318
|
-
log_warn("Detected PID change - Mongo client should have been reconnected (old pid #{connection.pid}, new pid #{pid}")
|
319
|
-
connection.disconnect!(reason: :stale)
|
320
|
-
@populate_semaphore.signal
|
321
|
-
next
|
322
|
-
end
|
323
|
-
|
324
|
-
if connection.generation != generation(service_id: connection.service_id)
|
325
|
-
# Stale connections should be disconnected in the clear
|
326
|
-
# method, but if any don't, check again here
|
327
|
-
connection.disconnect!(reason: :stale)
|
328
|
-
@populate_semaphore.signal
|
329
|
-
next
|
330
|
-
end
|
331
|
-
|
332
|
-
if max_idle_time && connection.last_checkin &&
|
333
|
-
Time.now - connection.last_checkin > max_idle_time
|
334
|
-
then
|
335
|
-
connection.disconnect!(reason: :idle)
|
336
|
-
@populate_semaphore.signal
|
337
|
-
next
|
338
|
-
end
|
339
|
-
|
340
|
-
@pending_connections << connection
|
341
|
-
throw(:done)
|
342
|
-
end
|
343
|
-
|
344
|
-
if service_id
|
345
|
-
# If we need a connection to a particular service, we can't
|
346
|
-
# create one if we don't already have one, but we can wait
|
347
|
-
# for an in-progress operation to return such a connection
|
348
|
-
# to the pool, or for the populator to create a suitable
|
349
|
-
# connection.
|
350
|
-
else
|
351
|
-
# If we are below pool capacity, create a new connection.
|
352
|
-
#
|
353
|
-
# Ruby does not allow a thread to lock a mutex which it already
|
354
|
-
# holds.
|
355
|
-
if unsynchronized_size < max_size
|
356
|
-
connection = create_connection
|
357
|
-
@pending_connections << connection
|
358
|
-
throw(:done)
|
359
|
-
end
|
360
|
-
end
|
361
|
-
end
|
362
|
-
|
363
|
-
wait = deadline - Utils.monotonic_time
|
364
|
-
if wait <= 0
|
365
|
-
publish_cmap_event(
|
366
|
-
Monitoring::Event::Cmap::ConnectionCheckOutFailed.new(
|
367
|
-
@server.address,
|
368
|
-
Monitoring::Event::Cmap::ConnectionCheckOutFailed::TIMEOUT,
|
369
|
-
),
|
370
|
-
)
|
373
|
+
raise_if_pool_closed!
|
374
|
+
raise_if_pool_paused_locked!
|
371
375
|
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
else
|
376
|
-
''
|
377
|
-
end
|
378
|
-
|
379
|
-
"Timed out attempting to check out a connection " +
|
380
|
-
"from pool for #{@server.address}#{service_id_msg} after #{wait_timeout} sec. " +
|
381
|
-
"Connections in pool: #{@available_connections.length} available, " +
|
382
|
-
"#{@checked_out_connections.length} checked out, " +
|
383
|
-
"#{@pending_connections.length} pending " +
|
384
|
-
"(max size: #{max_size})"
|
385
|
-
end
|
386
|
-
raise Error::ConnectionCheckOutTimeout.new(msg, address: @server.address)
|
387
|
-
end
|
388
|
-
@available_semaphore.wait(wait)
|
389
|
-
end
|
390
|
-
end
|
391
|
-
|
392
|
-
begin
|
393
|
-
connect_connection(connection)
|
394
|
-
rescue Exception
|
395
|
-
# Handshake or authentication failed
|
396
|
-
@lock.synchronize do
|
397
|
-
@pending_connections.delete(connection)
|
398
|
-
end
|
399
|
-
@populate_semaphore.signal
|
400
|
-
|
401
|
-
publish_cmap_event(
|
402
|
-
Monitoring::Event::Cmap::ConnectionCheckOutFailed.new(
|
403
|
-
@server.address,
|
404
|
-
Monitoring::Event::Cmap::ConnectionCheckOutFailed::CONNECTION_ERROR
|
405
|
-
),
|
406
|
-
)
|
407
|
-
raise
|
408
|
-
end
|
409
|
-
|
410
|
-
@lock.synchronize do
|
411
|
-
@checked_out_connections << connection
|
412
|
-
@pending_connections.delete(connection)
|
413
|
-
end
|
376
|
+
connection = retrieve_and_connect_connection(
|
377
|
+
connection_global_id, context
|
378
|
+
)
|
414
379
|
|
415
380
|
publish_cmap_event(
|
416
381
|
Monitoring::Event::Cmap::ConnectionCheckedOut.new(@server.address, connection.id, self),
|
@@ -438,67 +403,114 @@ module Mongo
|
|
438
403
|
check_invariants
|
439
404
|
|
440
405
|
@lock.synchronize do
|
441
|
-
|
442
|
-
|
443
|
-
|
406
|
+
do_check_in(connection)
|
407
|
+
end
|
408
|
+
ensure
|
409
|
+
check_invariants
|
410
|
+
end
|
444
411
|
|
445
|
-
|
446
|
-
|
447
|
-
|
412
|
+
# Executes the check in after having already acquired the lock.
|
413
|
+
#
|
414
|
+
# @param [ Mongo::Server::Connection ] connection The connection.
|
415
|
+
def do_check_in(connection)
|
416
|
+
# When a connection is interrupted it is checked back into the pool
|
417
|
+
# and closed. The operation that was using the connection before it was
|
418
|
+
# interrupted will attempt to check it back into the pool, and we
|
419
|
+
# should ignore it since its already been closed and removed from the pool.
|
420
|
+
return if connection.closed? && connection.interrupted?
|
421
|
+
|
422
|
+
unless connection.connection_pool == self
|
423
|
+
raise ArgumentError, "Trying to check in a connection which was not checked out by this pool: #{connection} checked out from pool #{connection.connection_pool} (for #{self})"
|
424
|
+
end
|
448
425
|
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
# Threads that begin waiting after this method completes (with
|
453
|
-
# the exception) should be fine.
|
426
|
+
unless @checked_out_connections.include?(connection)
|
427
|
+
raise ArgumentError, "Trying to check in a connection which is not currently checked out by this pool: #{connection} (for #{self})"
|
428
|
+
end
|
454
429
|
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
430
|
+
# Note: if an event handler raises, resource will not be signaled.
|
431
|
+
# This means threads waiting for a connection to free up when
|
432
|
+
# the pool is at max size may time out.
|
433
|
+
# Threads that begin waiting after this method completes (with
|
434
|
+
# the exception) should be fine.
|
459
435
|
|
460
|
-
|
461
|
-
|
462
|
-
return
|
463
|
-
end
|
436
|
+
@checked_out_connections.delete(connection)
|
437
|
+
@size_cv.signal
|
464
438
|
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
end
|
439
|
+
publish_cmap_event(
|
440
|
+
Monitoring::Event::Cmap::ConnectionCheckedIn.new(@server.address, connection.id, self)
|
441
|
+
)
|
469
442
|
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
elsif connection.generation != generation(service_id: connection.service_id)
|
475
|
-
connection.disconnect!(reason: :stale)
|
476
|
-
@populate_semaphore.signal
|
477
|
-
else
|
478
|
-
connection.record_checkin!
|
479
|
-
@available_connections << connection
|
443
|
+
if connection.interrupted?
|
444
|
+
connection.disconnect!(reason: :stale)
|
445
|
+
return
|
446
|
+
end
|
480
447
|
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
448
|
+
if connection.error?
|
449
|
+
connection.disconnect!(reason: :error)
|
450
|
+
return
|
451
|
+
end
|
452
|
+
|
453
|
+
if closed?
|
454
|
+
connection.disconnect!(reason: :pool_closed)
|
455
|
+
return
|
456
|
+
end
|
457
|
+
|
458
|
+
if connection.closed?
|
459
|
+
# Connection was closed - for example, because it experienced
|
460
|
+
# a network error. Nothing else needs to be done here.
|
461
|
+
@populate_semaphore.signal
|
462
|
+
elsif connection.generation != generation(service_id: connection.service_id) && !connection.pinned?
|
463
|
+
# If connection is marked as pinned, it is used by a transaction
|
464
|
+
# or a series of cursor operations in a load balanced setup.
|
465
|
+
# In this case connection should not be disconnected until
|
466
|
+
# unpinned.
|
467
|
+
connection.disconnect!(reason: :stale)
|
468
|
+
@populate_semaphore.signal
|
469
|
+
else
|
470
|
+
connection.record_checkin!
|
471
|
+
@available_connections << connection
|
472
|
+
|
473
|
+
@max_connecting_cv.signal
|
474
|
+
end
|
475
|
+
end
|
476
|
+
|
477
|
+
# Mark the connection pool as paused.
|
478
|
+
def pause
|
479
|
+
raise_if_closed!
|
480
|
+
|
481
|
+
check_invariants
|
482
|
+
|
483
|
+
@lock.synchronize do
|
484
|
+
do_pause
|
485
485
|
end
|
486
486
|
ensure
|
487
487
|
check_invariants
|
488
488
|
end
|
489
489
|
|
490
|
+
# Mark the connection pool as paused without acquiring the lock.
|
491
|
+
#
|
492
|
+
# @api private
|
493
|
+
def do_pause
|
494
|
+
if Lint.enabled? && !@server.unknown?
|
495
|
+
raise Error::LintError, "Attempting to pause pool for server #{@server.summary} which is known"
|
496
|
+
end
|
497
|
+
|
498
|
+
return if !@ready
|
499
|
+
|
500
|
+
@ready = false
|
501
|
+
end
|
502
|
+
|
490
503
|
# Closes all idle connections in the pool and schedules currently checked
|
491
504
|
# out connections to be closed when they are checked back into the pool.
|
492
|
-
# The pool
|
493
|
-
#
|
505
|
+
# The pool is paused, it will not create new connections in background
|
506
|
+
# and it will fail checkout requests until marked ready.
|
494
507
|
#
|
495
508
|
# @option options [ true | false ] :lazy If true, do not close any of
|
496
509
|
# the idle connections and instead let them be closed during a
|
497
|
-
# subsequent check out operation.
|
498
|
-
# @option options [
|
499
|
-
#
|
500
|
-
#
|
501
|
-
# the populator background thread. For internal driver use only.
|
510
|
+
# subsequent check out operation. Defaults to false.
|
511
|
+
# @option options [ true | false ] :interrupt_in_use_connections If true,
|
512
|
+
# close all checked out connections immediately. If it is false, do not
|
513
|
+
# close any of the checked out connections. Defaults to true.
|
502
514
|
# @option options [ Object ] :service_id Clear connections with
|
503
515
|
# the specified service id only.
|
504
516
|
#
|
@@ -508,56 +520,112 @@ module Mongo
|
|
508
520
|
def clear(options = nil)
|
509
521
|
raise_if_closed!
|
510
522
|
|
511
|
-
|
512
|
-
|
513
|
-
if options && options[:stop_populator]
|
514
|
-
stop_populator
|
523
|
+
if Lint.enabled? && !@server.unknown?
|
524
|
+
raise Error::LintError, "Attempting to clear pool for server #{@server.summary} which is known"
|
515
525
|
end
|
516
526
|
|
527
|
+
do_clear(options)
|
528
|
+
end
|
529
|
+
|
530
|
+
# Disconnects the pool.
|
531
|
+
#
|
532
|
+
# Does everything that +clear+ does, except if the pool is closed
|
533
|
+
# this method does nothing but +clear+ would raise PoolClosedError.
|
534
|
+
#
|
535
|
+
# @since 2.1.0
|
536
|
+
# @api private
|
537
|
+
def disconnect!(options = nil)
|
538
|
+
do_clear(options)
|
539
|
+
rescue Error::PoolClosedError
|
540
|
+
# The "disconnected" state is between closed and paused.
|
541
|
+
# When we are trying to disconnect the pool, permit the pool to be
|
542
|
+
# already closed.
|
543
|
+
end
|
544
|
+
|
545
|
+
def do_clear(options = nil)
|
546
|
+
check_invariants
|
547
|
+
|
517
548
|
service_id = options && options[:service_id]
|
518
549
|
|
519
550
|
@lock.synchronize do
|
551
|
+
# Generation must be bumped before emitting pool cleared event.
|
520
552
|
@generation_manager.bump(service_id: service_id)
|
521
553
|
|
522
|
-
publish_cmap_event(
|
523
|
-
Monitoring::Event::Cmap::PoolCleared.new(
|
524
|
-
@server.address,
|
525
|
-
service_id: service_id,
|
526
|
-
)
|
527
|
-
)
|
528
|
-
|
529
554
|
unless options && options[:lazy]
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
|
549
|
-
end
|
555
|
+
close_available_connections(service_id)
|
556
|
+
end
|
557
|
+
|
558
|
+
if options && options[:interrupt_in_use_connections]
|
559
|
+
schedule_for_interruption(@checked_out_connections, service_id)
|
560
|
+
schedule_for_interruption(@pending_connections, service_id)
|
561
|
+
end
|
562
|
+
|
563
|
+
if @ready
|
564
|
+
publish_cmap_event(
|
565
|
+
Monitoring::Event::Cmap::PoolCleared.new(
|
566
|
+
@server.address,
|
567
|
+
service_id: service_id,
|
568
|
+
interrupt_in_use_connections: options&.[](:interrupt_in_use_connections)
|
569
|
+
)
|
570
|
+
)
|
571
|
+
# Only pause the connection pool if the server was marked unknown,
|
572
|
+
# otherwise, allow the retry to be attempted with a ready pool.
|
573
|
+
do_pause if !@server.load_balancer? && @server.unknown?
|
550
574
|
end
|
575
|
+
|
576
|
+
# Broadcast here to cause all of the threads waiting on the max
|
577
|
+
# connecting to break out of the wait loop and error.
|
578
|
+
@max_connecting_cv.broadcast
|
579
|
+
# Broadcast here to cause all of the threads waiting on the pool size
|
580
|
+
# to break out of the wait loop and error.
|
581
|
+
@size_cv.broadcast
|
551
582
|
end
|
552
583
|
|
584
|
+
# "Schedule the background thread" after clearing. This is responsible
|
585
|
+
# for cleaning up stale threads, and interrupting in use connections.
|
586
|
+
@populate_semaphore.signal
|
553
587
|
true
|
554
588
|
ensure
|
555
589
|
check_invariants
|
556
590
|
end
|
557
591
|
|
558
|
-
#
|
559
|
-
|
560
|
-
|
592
|
+
# Instructs the pool to create and return connections.
|
593
|
+
def ready
|
594
|
+
raise_if_closed!
|
595
|
+
|
596
|
+
# TODO: Add this back in RUBY-3174.
|
597
|
+
# if Lint.enabled?
|
598
|
+
# unless @server.connected?
|
599
|
+
# raise Error::LintError, "Attempting to ready a pool for server #{@server.summary} which is disconnected"
|
600
|
+
# end
|
601
|
+
# end
|
602
|
+
|
603
|
+
@lock.synchronize do
|
604
|
+
return if @ready
|
605
|
+
|
606
|
+
@ready = true
|
607
|
+
end
|
608
|
+
|
609
|
+
# Note that the CMAP spec demands serialization of CMAP events for a
|
610
|
+
# pool. In order to implement this, event publication must be done into
|
611
|
+
# a queue which is synchronized, instead of subscribers being invoked
|
612
|
+
# from the trigger method like this one here inline. On MRI, assuming
|
613
|
+
# the threads yield to others when they stop having work to do, it is
|
614
|
+
# likely that the events would in practice always be published in the
|
615
|
+
# required order. JRuby, being truly concurrent with OS threads,
|
616
|
+
# would not offers such a guarantee.
|
617
|
+
publish_cmap_event(
|
618
|
+
Monitoring::Event::Cmap::PoolReady.new(@server.address, options, self)
|
619
|
+
)
|
620
|
+
|
621
|
+
if options.fetch(:populator_io, true)
|
622
|
+
if @populator.running?
|
623
|
+
@populate_semaphore.signal
|
624
|
+
else
|
625
|
+
@populator.run!
|
626
|
+
end
|
627
|
+
end
|
628
|
+
end
|
561
629
|
|
562
630
|
# Marks the pool closed, closes all idle connections in the pool and
|
563
631
|
# schedules currently checked out connections to be closed when they are
|
@@ -567,6 +635,8 @@ module Mongo
|
|
567
635
|
#
|
568
636
|
# @option options [ true | false ] :force Also close all checked out
|
569
637
|
# connections.
|
638
|
+
# @option options [ true | false ] :stay_ready For internal driver use
|
639
|
+
# only. Whether or not to mark the pool as closed.
|
570
640
|
#
|
571
641
|
# @return [ true ] Always true.
|
572
642
|
#
|
@@ -592,9 +662,15 @@ module Mongo
|
|
592
662
|
end
|
593
663
|
end
|
594
664
|
|
595
|
-
|
596
|
-
|
597
|
-
|
665
|
+
unless options && options[:stay_ready]
|
666
|
+
# mark pool as closed before releasing lock so
|
667
|
+
# no connections can be created, checked in, or checked out
|
668
|
+
@closed = true
|
669
|
+
@ready = false
|
670
|
+
end
|
671
|
+
|
672
|
+
@max_connecting_cv.broadcast
|
673
|
+
@size_cv.broadcast
|
598
674
|
end
|
599
675
|
|
600
676
|
publish_cmap_event(
|
@@ -616,6 +692,9 @@ module Mongo
|
|
616
692
|
if closed?
|
617
693
|
"#<Mongo::Server::ConnectionPool:0x#{object_id} min_size=#{min_size} max_size=#{max_size} " +
|
618
694
|
"wait_timeout=#{wait_timeout} closed>"
|
695
|
+
elsif !ready?
|
696
|
+
"#<Mongo::Server::ConnectionPool:0x#{object_id} min_size=#{min_size} max_size=#{max_size} " +
|
697
|
+
"wait_timeout=#{wait_timeout} paused>"
|
619
698
|
else
|
620
699
|
"#<Mongo::Server::ConnectionPool:0x#{object_id} min_size=#{min_size} max_size=#{max_size} " +
|
621
700
|
"wait_timeout=#{wait_timeout} current_size=#{size} available=#{available_count}>"
|
@@ -632,11 +711,16 @@ module Mongo
|
|
632
711
|
# @return [ Object ] The result of the block.
|
633
712
|
#
|
634
713
|
# @since 2.0.0
|
635
|
-
def with_connection(
|
714
|
+
def with_connection(connection_global_id: nil, context: nil)
|
636
715
|
raise_if_closed!
|
637
716
|
|
638
|
-
connection = check_out(
|
717
|
+
connection = check_out(
|
718
|
+
connection_global_id: connection_global_id,
|
719
|
+
context: context
|
720
|
+
)
|
639
721
|
yield(connection)
|
722
|
+
rescue Error::SocketError, Error::SocketTimeoutError, Error::ConnectionPerished => e
|
723
|
+
maybe_raise_pool_cleared!(connection, e)
|
640
724
|
ensure
|
641
725
|
if connection
|
642
726
|
check_in(connection)
|
@@ -685,17 +769,17 @@ module Mongo
|
|
685
769
|
# connections waiting to be connected, connections which have not yet
|
686
770
|
# been moved to available_connections, or connections moved to available_connections
|
687
771
|
# but not deleted from pending_connections. These should be cleaned up.
|
688
|
-
|
689
|
-
connection = @pending_connections.take(1).first
|
690
|
-
connection.disconnect!
|
691
|
-
@pending_connections.delete(connection)
|
692
|
-
end
|
772
|
+
clear_pending_connections
|
693
773
|
end
|
694
774
|
end
|
695
775
|
|
696
|
-
#
|
697
|
-
#
|
698
|
-
#
|
776
|
+
# This method does three things:
|
777
|
+
# 1. Creates and adds a connection to the pool, if the pool's size is
|
778
|
+
# below min_size. Retries once if a socket-related error is
|
779
|
+
# encountered during this process and raises if a second error or a
|
780
|
+
# non socket-related error occurs.
|
781
|
+
# 2. Removes stale connections from the connection pool.
|
782
|
+
# 3. Interrupts connections marked for interruption.
|
699
783
|
#
|
700
784
|
# Used by the pool populator background thread.
|
701
785
|
#
|
@@ -717,11 +801,6 @@ module Mongo
|
|
717
801
|
end
|
718
802
|
|
719
803
|
return create_and_add_connection
|
720
|
-
rescue Error::AuthError, Error
|
721
|
-
# wake up one thread waiting for connections, since one could not
|
722
|
-
# be created here, and can instead be created in flow
|
723
|
-
@available_semaphore.signal
|
724
|
-
raise
|
725
804
|
end
|
726
805
|
|
727
806
|
# Finalize the connection pool for garbage collection.
|
@@ -751,13 +830,15 @@ module Mongo
|
|
751
830
|
|
752
831
|
private
|
753
832
|
|
754
|
-
# Returns the next available connection, optionally
|
755
|
-
#
|
833
|
+
# Returns the next available connection, optionally with given
|
834
|
+
# global id. If no suitable connections are available,
|
756
835
|
# returns nil.
|
757
|
-
def next_available_connection(
|
758
|
-
|
836
|
+
def next_available_connection(connection_global_id)
|
837
|
+
raise_unless_locked!
|
838
|
+
|
839
|
+
if @server.load_balancer? && connection_global_id
|
759
840
|
conn = @available_connections.detect do |conn|
|
760
|
-
conn.
|
841
|
+
conn.global_id == connection_global_id
|
761
842
|
end
|
762
843
|
if conn
|
763
844
|
@available_connections.delete(conn)
|
@@ -769,18 +850,21 @@ module Mongo
|
|
769
850
|
end
|
770
851
|
|
771
852
|
def create_connection
|
853
|
+
r, _ = @generation_manager.pipe_fds(service_id: server.description.service_id)
|
772
854
|
opts = options.merge(
|
773
855
|
connection_pool: self,
|
856
|
+
pipe: r
|
774
857
|
# Do not pass app metadata - this will be retrieved by the connection
|
775
858
|
# based on the auth needs.
|
776
859
|
)
|
777
860
|
unless @server.load_balancer?
|
778
861
|
opts[:generation] = generation
|
779
862
|
end
|
780
|
-
|
863
|
+
Connection.new(@server, opts)
|
781
864
|
end
|
782
865
|
|
783
|
-
# Create a connection, connect it, and add it to the pool.
|
866
|
+
# Create a connection, connect it, and add it to the pool. Also
|
867
|
+
# check for stale and interruptable connections and deal with them.
|
784
868
|
#
|
785
869
|
# @return [ true | false ] True if a connection was created and
|
786
870
|
# added to the pool, false otherwise
|
@@ -789,10 +873,15 @@ module Mongo
|
|
789
873
|
connection = nil
|
790
874
|
|
791
875
|
@lock.synchronize do
|
792
|
-
if !closed? &&
|
876
|
+
if !closed? && @ready &&
|
877
|
+
(unsynchronized_size + @connection_requests) < min_size &&
|
878
|
+
@pending_connections.length < @max_connecting
|
879
|
+
then
|
793
880
|
connection = create_connection
|
794
881
|
@pending_connections << connection
|
795
882
|
else
|
883
|
+
return true if remove_interrupted_connections
|
884
|
+
return true if remove_stale_connection
|
796
885
|
return false
|
797
886
|
end
|
798
887
|
end
|
@@ -802,6 +891,8 @@ module Mongo
|
|
802
891
|
rescue Exception
|
803
892
|
@lock.synchronize do
|
804
893
|
@pending_connections.delete(connection)
|
894
|
+
@max_connecting_cv.signal
|
895
|
+
@size_cv.signal
|
805
896
|
end
|
806
897
|
raise
|
807
898
|
end
|
@@ -809,14 +900,65 @@ module Mongo
|
|
809
900
|
@lock.synchronize do
|
810
901
|
@available_connections << connection
|
811
902
|
@pending_connections.delete(connection)
|
903
|
+
@max_connecting_cv.signal
|
904
|
+
@size_cv.signal
|
905
|
+
end
|
812
906
|
|
813
|
-
|
814
|
-
|
907
|
+
true
|
908
|
+
end
|
909
|
+
|
910
|
+
# Removes and disconnects all stale available connections.
|
911
|
+
def remove_stale_connection
|
912
|
+
if conn = @available_connections.detect(&method(:connection_stale_unlocked?))
|
913
|
+
conn.disconnect!(reason: :stale)
|
914
|
+
@available_connections.delete(conn)
|
915
|
+
return true
|
916
|
+
end
|
917
|
+
end
|
918
|
+
|
919
|
+
# Interrupt connections scheduled for interruption.
|
920
|
+
def remove_interrupted_connections
|
921
|
+
return false if @interrupt_connections.empty?
|
922
|
+
|
923
|
+
gens = Set.new
|
924
|
+
while conn = @interrupt_connections.pop
|
925
|
+
if @checked_out_connections.include?(conn)
|
926
|
+
# If the connection has been checked out, mark it as interrupted and it will
|
927
|
+
# be disconnected on check in.
|
928
|
+
conn.interrupted!
|
929
|
+
do_check_in(conn)
|
930
|
+
elsif @pending_connections.include?(conn)
|
931
|
+
# If the connection is pending, disconnect with the interrupted flag.
|
932
|
+
conn.disconnect!(reason: :stale, interrupted: true)
|
933
|
+
@pending_connections.delete(conn)
|
934
|
+
end
|
935
|
+
gens << [ conn.generation, conn.service_id ]
|
936
|
+
end
|
937
|
+
|
938
|
+
# Close the write side of the pipe. Pending connections might be
|
939
|
+
# hanging on the Kernel#select call, so in order to interrupt that,
|
940
|
+
# we also listen for the read side of the pipe in Kernel#select and
|
941
|
+
# close the write side of the pipe here, which will cause select to
|
942
|
+
# wake up and raise an IOError now that the socket is closed.
|
943
|
+
# The read side of the pipe will be scheduled for closing on the next
|
944
|
+
# generation bump.
|
945
|
+
gens.each do |gen, service_id|
|
946
|
+
@generation_manager.remove_pipe_fds(gen, service_id: service_id)
|
815
947
|
end
|
816
948
|
|
817
949
|
true
|
818
950
|
end
|
819
951
|
|
952
|
+
# Checks whether a connection is stale.
|
953
|
+
#
|
954
|
+
# @param [ Mongo::Server::Connection ] connection The connection to check.
|
955
|
+
#
|
956
|
+
# @return [ true | false ] Whether the connection is stale.
|
957
|
+
def connection_stale_unlocked?(connection)
|
958
|
+
connection.generation != generation_unlocked(service_id: connection.service_id) &&
|
959
|
+
!connection.pinned?
|
960
|
+
end
|
961
|
+
|
820
962
|
# Asserts that the pool has not been closed.
|
821
963
|
#
|
822
964
|
# @raise [ Error::PoolClosedError ] If the pool has been closed.
|
@@ -828,11 +970,30 @@ module Mongo
|
|
828
970
|
end
|
829
971
|
end
|
830
972
|
|
973
|
+
# If the connection was interrupted, raise a pool cleared error. If it
|
974
|
+
# wasn't interrupted raise the original error.
|
975
|
+
#
|
976
|
+
# @param [ Connection ] The connection.
|
977
|
+
# @param [ Mongo::Error ] The original error.
|
978
|
+
#
|
979
|
+
# @raise [ Mongo::Error | Mongo::Error::PoolClearedError ] A PoolClearedError
|
980
|
+
# if the connection was interrupted, the original error if not.
|
981
|
+
def maybe_raise_pool_cleared!(connection, e)
|
982
|
+
if connection&.interrupted?
|
983
|
+
err = Error::PoolClearedError.new(connection.server.address, connection.server.pool_internal).tap do |err|
|
984
|
+
e.labels.each { |l| err.add_label(l) }
|
985
|
+
end
|
986
|
+
raise err
|
987
|
+
else
|
988
|
+
raise e
|
989
|
+
end
|
990
|
+
end
|
991
|
+
|
831
992
|
# Attempts to connect (handshake and auth) the connection. If an error is
|
832
993
|
# encountered, closes the connection and raises the error.
|
833
|
-
def connect_connection(connection)
|
994
|
+
def connect_connection(connection, context = nil)
|
834
995
|
begin
|
835
|
-
connection.connect!
|
996
|
+
connection.connect!(context)
|
836
997
|
rescue Exception
|
837
998
|
connection.disconnect!(reason: :error)
|
838
999
|
raise
|
@@ -867,6 +1028,352 @@ module Mongo
|
|
867
1028
|
end
|
868
1029
|
end
|
869
1030
|
end
|
1031
|
+
|
1032
|
+
# Close the available connections.
|
1033
|
+
#
|
1034
|
+
# @param [ Array<Connection> ] connections A list of connections.
|
1035
|
+
# @param [ Object ] service_id The service id.
|
1036
|
+
def close_available_connections(service_id)
|
1037
|
+
if @server.load_balancer? && service_id
|
1038
|
+
loop do
|
1039
|
+
conn = @available_connections.detect do |conn|
|
1040
|
+
conn.service_id == service_id &&
|
1041
|
+
conn.generation < @generation_manager.generation(service_id: service_id)
|
1042
|
+
end
|
1043
|
+
if conn
|
1044
|
+
@available_connections.delete(conn)
|
1045
|
+
conn.disconnect!(reason: :stale, interrupted: true)
|
1046
|
+
@populate_semaphore.signal
|
1047
|
+
else
|
1048
|
+
break
|
1049
|
+
end
|
1050
|
+
end
|
1051
|
+
else
|
1052
|
+
@available_connections.delete_if do |conn|
|
1053
|
+
if conn.generation < @generation_manager.generation(service_id: service_id)
|
1054
|
+
conn.disconnect!(reason: :stale, interrupted: true)
|
1055
|
+
@populate_semaphore.signal
|
1056
|
+
true
|
1057
|
+
end
|
1058
|
+
end
|
1059
|
+
end
|
1060
|
+
end
|
1061
|
+
|
1062
|
+
# Schedule connections of previous generations for interruption.
|
1063
|
+
#
|
1064
|
+
# @param [ Array<Connection> ] connections A list of connections.
|
1065
|
+
# @param [ Object ] service_id The service id.
|
1066
|
+
def schedule_for_interruption(connections, service_id)
|
1067
|
+
@interrupt_connections += connections.select do |conn|
|
1068
|
+
(!server.load_balancer? || conn.service_id == service_id) &&
|
1069
|
+
conn.generation < @generation_manager.generation(service_id: service_id)
|
1070
|
+
end
|
1071
|
+
end
|
1072
|
+
|
1073
|
+
# Clear and disconnect the pending connections.
|
1074
|
+
def clear_pending_connections
|
1075
|
+
until @pending_connections.empty?
|
1076
|
+
connection = @pending_connections.take(1).first
|
1077
|
+
connection.disconnect!
|
1078
|
+
@pending_connections.delete(connection)
|
1079
|
+
end
|
1080
|
+
end
|
1081
|
+
|
1082
|
+
# The lock should be acquired when calling this method.
|
1083
|
+
def raise_check_out_timeout!(connection_global_id)
|
1084
|
+
raise_unless_locked!
|
1085
|
+
|
1086
|
+
publish_cmap_event(
|
1087
|
+
Monitoring::Event::Cmap::ConnectionCheckOutFailed.new(
|
1088
|
+
@server.address,
|
1089
|
+
Monitoring::Event::Cmap::ConnectionCheckOutFailed::TIMEOUT,
|
1090
|
+
),
|
1091
|
+
)
|
1092
|
+
|
1093
|
+
connection_global_id_msg = if connection_global_id
|
1094
|
+
" for connection #{connection_global_id}"
|
1095
|
+
else
|
1096
|
+
''
|
1097
|
+
end
|
1098
|
+
|
1099
|
+
msg = "Timed out attempting to check out a connection " +
|
1100
|
+
"from pool for #{@server.address}#{connection_global_id_msg} after #{wait_timeout} sec. " +
|
1101
|
+
"Connections in pool: #{@available_connections.length} available, " +
|
1102
|
+
"#{@checked_out_connections.length} checked out, " +
|
1103
|
+
"#{@pending_connections.length} pending, " +
|
1104
|
+
"#{@connection_requests} connections requests " +
|
1105
|
+
"(max size: #{max_size})"
|
1106
|
+
raise Error::ConnectionCheckOutTimeout.new(msg, address: @server.address)
|
1107
|
+
end
|
1108
|
+
|
1109
|
+
def raise_check_out_timeout_locked!(connection_global_id)
|
1110
|
+
@lock.synchronize do
|
1111
|
+
raise_check_out_timeout!(connection_global_id)
|
1112
|
+
end
|
1113
|
+
end
|
1114
|
+
|
1115
|
+
def raise_if_pool_closed!
|
1116
|
+
if closed?
|
1117
|
+
publish_cmap_event(
|
1118
|
+
Monitoring::Event::Cmap::ConnectionCheckOutFailed.new(
|
1119
|
+
@server.address,
|
1120
|
+
Monitoring::Event::Cmap::ConnectionCheckOutFailed::POOL_CLOSED
|
1121
|
+
),
|
1122
|
+
)
|
1123
|
+
raise Error::PoolClosedError.new(@server.address, self)
|
1124
|
+
end
|
1125
|
+
end
|
1126
|
+
|
1127
|
+
def raise_if_pool_paused!
|
1128
|
+
raise_unless_locked!
|
1129
|
+
|
1130
|
+
if !@ready
|
1131
|
+
publish_cmap_event(
|
1132
|
+
Monitoring::Event::Cmap::ConnectionCheckOutFailed.new(
|
1133
|
+
@server.address,
|
1134
|
+
# CMAP spec decided to conflate pool paused with all the other
|
1135
|
+
# possible non-timeout errors.
|
1136
|
+
Monitoring::Event::Cmap::ConnectionCheckOutFailed::CONNECTION_ERROR,
|
1137
|
+
),
|
1138
|
+
)
|
1139
|
+
raise Error::PoolPausedError.new(@server.address, self)
|
1140
|
+
end
|
1141
|
+
end
|
1142
|
+
|
1143
|
+
def raise_if_pool_paused_locked!
|
1144
|
+
@lock.synchronize do
|
1145
|
+
raise_if_pool_paused!
|
1146
|
+
end
|
1147
|
+
end
|
1148
|
+
|
1149
|
+
# The lock should be acquired when calling this method.
|
1150
|
+
def raise_if_not_ready!
|
1151
|
+
raise_unless_locked!
|
1152
|
+
raise_if_pool_closed!
|
1153
|
+
raise_if_pool_paused!
|
1154
|
+
end
|
1155
|
+
|
1156
|
+
def raise_unless_locked!
|
1157
|
+
unless @lock.owned?
|
1158
|
+
raise ArgumentError, "the lock must be owned when calling this method"
|
1159
|
+
end
|
1160
|
+
end
|
1161
|
+
|
1162
|
+
def valid_available_connection?(connection, pid, connection_global_id)
|
1163
|
+
if connection.pid != pid
|
1164
|
+
log_warn("Detected PID change - Mongo client should have been reconnected (old pid #{connection.pid}, new pid #{pid}")
|
1165
|
+
connection.disconnect!(reason: :stale)
|
1166
|
+
@populate_semaphore.signal
|
1167
|
+
return false
|
1168
|
+
end
|
1169
|
+
|
1170
|
+
if !connection.pinned?
|
1171
|
+
# If connection is marked as pinned, it is used by a transaction
|
1172
|
+
# or a series of cursor operations in a load balanced setup.
|
1173
|
+
# In this case connection should not be disconnected until
|
1174
|
+
# unpinned.
|
1175
|
+
if connection.generation != generation(
|
1176
|
+
service_id: connection.service_id
|
1177
|
+
)
|
1178
|
+
# Stale connections should be disconnected in the clear
|
1179
|
+
# method, but if any don't, check again here
|
1180
|
+
connection.disconnect!(reason: :stale)
|
1181
|
+
@populate_semaphore.signal
|
1182
|
+
return false
|
1183
|
+
end
|
1184
|
+
|
1185
|
+
if max_idle_time && connection.last_checkin &&
|
1186
|
+
Time.now - connection.last_checkin > max_idle_time
|
1187
|
+
then
|
1188
|
+
connection.disconnect!(reason: :idle)
|
1189
|
+
@populate_semaphore.signal
|
1190
|
+
return false
|
1191
|
+
end
|
1192
|
+
end
|
1193
|
+
true
|
1194
|
+
end
|
1195
|
+
|
1196
|
+
# Retrieves a connection if one is available, otherwise we create a new
|
1197
|
+
# one. If no connection exists and the pool is at max size, wait until
|
1198
|
+
# a connection is checked back into the pool.
|
1199
|
+
#
|
1200
|
+
# @param [ Integer ] pid The current process id.
|
1201
|
+
# @param [ Integer ] connection_global_id The global id for the
|
1202
|
+
# connection to check out.
|
1203
|
+
#
|
1204
|
+
# @return [ Mongo::Server::Connection ] The checked out connection.
|
1205
|
+
#
|
1206
|
+
# @raise [ Error::PoolClosedError ] If the pool has been closed.
|
1207
|
+
# @raise [ Timeout::Error ] If the connection pool is at maximum size
|
1208
|
+
# and remains so for longer than the wait timeout.
|
1209
|
+
def get_connection(pid, connection_global_id)
|
1210
|
+
if connection = next_available_connection(connection_global_id)
|
1211
|
+
unless valid_available_connection?(connection, pid, connection_global_id)
|
1212
|
+
return nil
|
1213
|
+
end
|
1214
|
+
|
1215
|
+
# We've got a connection, so we decrement the number of connection
|
1216
|
+
# requests.
|
1217
|
+
# We do not need to signal condition variable here, because
|
1218
|
+
# because the execution will continue, and we signal later.
|
1219
|
+
@connection_requests -= 1
|
1220
|
+
|
1221
|
+
# If the connection is connected, it's not considered a
|
1222
|
+
# "pending connection". The pending_connections list represents
|
1223
|
+
# the set of connections that are awaiting connection.
|
1224
|
+
unless connection.connected?
|
1225
|
+
@pending_connections << connection
|
1226
|
+
end
|
1227
|
+
return connection
|
1228
|
+
elsif connection_global_id && @server.load_balancer?
|
1229
|
+
# A particular connection is requested, but it is not available.
|
1230
|
+
# If it is nether available not checked out, we should stop here.
|
1231
|
+
@checked_out_connections.detect do |conn|
|
1232
|
+
conn.global_id == connection_global_id
|
1233
|
+
end.tap do |conn|
|
1234
|
+
if conn.nil?
|
1235
|
+
publish_cmap_event(
|
1236
|
+
Monitoring::Event::Cmap::ConnectionCheckOutFailed.new(
|
1237
|
+
@server.address,
|
1238
|
+
Monitoring::Event::Cmap::ConnectionCheckOutFailed::CONNECTION_ERROR
|
1239
|
+
),
|
1240
|
+
)
|
1241
|
+
# We're going to raise, so we need to decrement the number of
|
1242
|
+
# connection requests.
|
1243
|
+
decrement_connection_requests_and_signal
|
1244
|
+
raise Error::MissingConnection.new
|
1245
|
+
end
|
1246
|
+
end
|
1247
|
+
# We need a particular connection, and if it is not available
|
1248
|
+
# we can wait for an in-progress operation to return
|
1249
|
+
# such a connection to the pool.
|
1250
|
+
nil
|
1251
|
+
else
|
1252
|
+
connection = create_connection
|
1253
|
+
@connection_requests -= 1
|
1254
|
+
@pending_connections << connection
|
1255
|
+
return connection
|
1256
|
+
end
|
1257
|
+
end
|
1258
|
+
|
1259
|
+
# Retrieves a connection and connects it.
|
1260
|
+
#
|
1261
|
+
# @param [ Integer | nil ] connection_global_id The global id for the
|
1262
|
+
# connection to check out.
|
1263
|
+
# @param [ Mongo::Operation:Context | nil ] context Context of the operation
|
1264
|
+
# the connection is requested for, if any.
|
1265
|
+
#
|
1266
|
+
# @return [ Mongo::Server::Connection ] The checked out connection.
|
1267
|
+
#
|
1268
|
+
# @raise [ Error::PoolClosedError ] If the pool has been closed.
|
1269
|
+
# @raise [ Timeout::Error ] If the connection pool is at maximum size
|
1270
|
+
# and remains so for longer than the wait timeout.
|
1271
|
+
def retrieve_and_connect_connection(connection_global_id, context = nil)
|
1272
|
+
deadline = Utils.monotonic_time + wait_timeout(context)
|
1273
|
+
connection = nil
|
1274
|
+
|
1275
|
+
@lock.synchronize do
|
1276
|
+
# The first gate to checking out a connection. Make sure the number of
|
1277
|
+
# unavailable connections is less than the max pool size.
|
1278
|
+
until max_size == 0 || unavailable_connections < max_size
|
1279
|
+
wait = deadline - Utils.monotonic_time
|
1280
|
+
raise_check_out_timeout!(connection_global_id) if wait <= 0
|
1281
|
+
@size_cv.wait(wait)
|
1282
|
+
raise_if_not_ready!
|
1283
|
+
end
|
1284
|
+
@connection_requests += 1
|
1285
|
+
connection = wait_for_connection(connection_global_id, deadline)
|
1286
|
+
end
|
1287
|
+
|
1288
|
+
connect_or_raise(connection, context) unless connection.connected?
|
1289
|
+
|
1290
|
+
@lock.synchronize do
|
1291
|
+
@checked_out_connections << connection
|
1292
|
+
if @pending_connections.include?(connection)
|
1293
|
+
@pending_connections.delete(connection)
|
1294
|
+
end
|
1295
|
+
@max_connecting_cv.signal
|
1296
|
+
# no need to signal size_cv here since the number of unavailable
|
1297
|
+
# connections is unchanged.
|
1298
|
+
end
|
1299
|
+
|
1300
|
+
connection
|
1301
|
+
end
|
1302
|
+
|
1303
|
+
# Waits for a connection to become available, or raises is no connection
|
1304
|
+
# becomes available before the timeout.
|
1305
|
+
# @param [ Integer ] connection_global_id The global id for the
|
1306
|
+
# connection to check out.
|
1307
|
+
# @param [ Float ] deadline The time at which to stop waiting.
|
1308
|
+
#
|
1309
|
+
# @return [ Mongo::Server::Connection ] The checked out connection.
|
1310
|
+
def wait_for_connection(connection_global_id, deadline)
|
1311
|
+
connection = nil
|
1312
|
+
while connection.nil?
|
1313
|
+
# The second gate to checking out a connection. Make sure 1) there
|
1314
|
+
# exists an available connection and 2) we are under max_connecting.
|
1315
|
+
until @available_connections.any? || @pending_connections.length < @max_connecting
|
1316
|
+
wait = deadline - Utils.monotonic_time
|
1317
|
+
if wait <= 0
|
1318
|
+
# We are going to raise a timeout error, so the connection
|
1319
|
+
# request is not going to be fulfilled. Decrement the counter
|
1320
|
+
# here.
|
1321
|
+
decrement_connection_requests_and_signal
|
1322
|
+
raise_check_out_timeout!(connection_global_id)
|
1323
|
+
end
|
1324
|
+
@max_connecting_cv.wait(wait)
|
1325
|
+
# We do not need to decrement the connection_requests counter
|
1326
|
+
# or signal here because the pool is not ready yet.
|
1327
|
+
raise_if_not_ready!
|
1328
|
+
end
|
1329
|
+
|
1330
|
+
connection = get_connection(Process.pid, connection_global_id)
|
1331
|
+
wait = deadline - Utils.monotonic_time
|
1332
|
+
if connection.nil? && wait <= 0
|
1333
|
+
# connection is nil here, it means that get_connection method
|
1334
|
+
# did not create a new connection; therefore, it did not decrease
|
1335
|
+
# the connection_requests counter. We need to do it here.
|
1336
|
+
decrement_connection_requests_and_signal
|
1337
|
+
raise_check_out_timeout!(connection_global_id)
|
1338
|
+
end
|
1339
|
+
end
|
1340
|
+
|
1341
|
+
connection
|
1342
|
+
end
|
1343
|
+
|
1344
|
+
# Connects a connection and raises an exception if the connection
|
1345
|
+
# cannot be connected.
|
1346
|
+
# This method also publish corresponding event and ensures that counters
|
1347
|
+
# and condition variables are updated.
|
1348
|
+
def connect_or_raise(connection, context)
|
1349
|
+
connect_connection(connection, context)
|
1350
|
+
rescue Exception
|
1351
|
+
# Handshake or authentication failed
|
1352
|
+
@lock.synchronize do
|
1353
|
+
if @pending_connections.include?(connection)
|
1354
|
+
@pending_connections.delete(connection)
|
1355
|
+
end
|
1356
|
+
@max_connecting_cv.signal
|
1357
|
+
@size_cv.signal
|
1358
|
+
end
|
1359
|
+
@populate_semaphore.signal
|
1360
|
+
publish_cmap_event(
|
1361
|
+
Monitoring::Event::Cmap::ConnectionCheckOutFailed.new(
|
1362
|
+
@server.address,
|
1363
|
+
Monitoring::Event::Cmap::ConnectionCheckOutFailed::CONNECTION_ERROR
|
1364
|
+
),
|
1365
|
+
)
|
1366
|
+
raise
|
1367
|
+
end
|
1368
|
+
|
1369
|
+
|
1370
|
+
# Decrement connection requests counter and signal the condition
|
1371
|
+
# variables that the number of unavailable connections has decreased.
|
1372
|
+
def decrement_connection_requests_and_signal
|
1373
|
+
@connection_requests -= 1
|
1374
|
+
@max_connecting_cv.signal
|
1375
|
+
@size_cv.signal
|
1376
|
+
end
|
870
1377
|
end
|
871
1378
|
end
|
872
1379
|
end
|