mongo 2.16.4 → 2.20.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
- checksums.yaml.gz.sig +0 -0
- data/README.md +33 -39
- data/Rakefile +31 -157
- 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 +1 -1
- data/lib/mongo/auth/aws/conversation.rb +1 -5
- data/lib/mongo/{operation/get_more/command.rb → auth/aws/credentials.rb} +15 -20
- data/lib/mongo/auth/aws/credentials_cache.rb +75 -0
- data/lib/mongo/auth/aws/credentials_retriever.rb +172 -37
- data/lib/mongo/auth/aws/request.rb +1 -3
- 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 +118 -30
- data/lib/mongo/caching_cursor.rb +1 -1
- data/lib/mongo/client.rb +190 -22
- data/lib/mongo/client_encryption.rb +215 -11
- data/lib/mongo/cluster/periodic_executor.rb +1 -1
- data/lib/mongo/cluster/reapers/cursor_reaper.rb +34 -16
- data/lib/mongo/cluster/reapers/socket_reaper.rb +2 -2
- data/lib/mongo/cluster/sdam_flow.rb +42 -15
- 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 +82 -41
- 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.rb +68 -17
- data/lib/mongo/collection/view/builder/aggregation.rb +12 -14
- data/lib/mongo/collection/view/builder/map_reduce.rb +2 -2
- 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 +69 -23
- 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 +6 -6
- data/lib/mongo/collection/view/map_reduce.rb +21 -10
- data/lib/mongo/collection/view/readable.rb +54 -28
- data/lib/mongo/collection/view/writable.rb +153 -39
- data/lib/mongo/collection/view.rb +1 -1
- data/lib/mongo/collection.rb +332 -98
- 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 +140 -16
- 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 +72 -6
- data/lib/mongo/crypt/data_key_context.rb +13 -105
- data/lib/mongo/crypt/encryption_io.rb +95 -61
- data/lib/mongo/crypt/explicit_decryption_context.rb +1 -1
- data/lib/mongo/crypt/explicit_encrypter.rb +233 -30
- data/lib/mongo/crypt/explicit_encryption_context.rb +76 -22
- data/lib/mongo/{operation/drop/command.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 +122 -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 +58 -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/cursor/kill_spec.rb +42 -4
- data/lib/mongo/cursor.rb +68 -19
- data/lib/mongo/database/view.rb +51 -9
- data/lib/mongo/database.rb +65 -21
- 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/error/invalid_max_connecting.rb +28 -0
- 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 +35 -87
- 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/session_ended.rb +1 -1
- data/lib/mongo/error/session_not_materialized.rb +29 -0
- data/lib/mongo/error/sessions_not_supported.rb +1 -1
- data/lib/mongo/{operation/kill_cursors/legacy.rb → error/snapshot_session_invalid_server_version.rb} +9 -19
- data/lib/mongo/{operation/command/command.rb → error/snapshot_session_transaction_prohibited.rb} +8 -19
- data/lib/mongo/error/socket_error.rb +1 -1
- data/lib/mongo/error/socket_timeout_error.rb +1 -1
- 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 +7 -1
- data/lib/mongo/grid/stream/read.rb +7 -1
- data/lib/mongo/grid/stream/write.rb +1 -1
- 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 +24 -8
- 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 +25 -7
- 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 +2 -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 +1 -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 +1 -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 +7 -4
- data/lib/mongo/operation/insert/result.rb +7 -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 +1 -1
- 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 +17 -1
- data/lib/mongo/operation/map_reduce.rb +2 -3
- data/lib/mongo/operation/op_msg_base.rb +1 -1
- 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 +28 -6
- 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 +48 -13
- 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} +25 -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 +30 -31
- 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 +26 -7
- data/lib/mongo/operation/shared/specifiable.rb +8 -1
- data/lib/mongo/operation/shared/validatable.rb +1 -1
- data/lib/mongo/operation/shared/write.rb +19 -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 +4 -2
- 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 +5 -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 +5 -9
- data/lib/mongo/protocol/msg.rb +23 -2
- 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 +91 -0
- data/lib/mongo/retryable/read_worker.rb +297 -0
- data/lib/mongo/retryable/write_worker.rb +367 -0
- data/lib/mongo/retryable.rb +31 -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 +94 -20
- data/lib/mongo/server/connection_base.rb +3 -1
- 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 +736 -247
- data/lib/mongo/server/description/features.rb +7 -2
- data/lib/mongo/server/description/load_balancer.rb +1 -1
- data/lib/mongo/server/description.rb +14 -8
- 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 +36 -20
- data/lib/mongo/server/pending_connection.rb +1 -1
- 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 +1 -1
- data/lib/mongo/server.rb +105 -35
- data/lib/mongo/server_selector/base.rb +77 -8
- 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 +164 -37
- data/lib/mongo/socket/ocsp_cache.rb +3 -4
- data/lib/mongo/socket/ocsp_verifier.rb +5 -6
- data/lib/mongo/socket/ssl.rb +1 -1
- data/lib/mongo/socket/tcp.rb +4 -1
- data/lib/mongo/socket/unix.rb +1 -1
- data/lib/mongo/socket.rb +30 -7
- 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 +324 -81
- data/lib/mongo/uri/srv_protocol.rb +2 -2
- data/lib/mongo/uri.rb +61 -17
- data/lib/mongo/utils.rb +1 -7
- data/lib/mongo/version.rb +2 -2
- 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 +25 -1
- data/mongo.gemspec +10 -7
- data/spec/README.md +23 -5
- data/spec/atlas/atlas_connectivity_spec.rb +6 -10
- data/spec/atlas/operations_spec.rb +4 -13
- 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 +17 -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 +1 -2
- 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 +146 -3
- 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 +536 -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_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 +27 -7
- data/spec/integration/connection_spec.rb +1 -1
- data/spec/integration/crud_spec.rb +13 -1
- data/spec/integration/cursor_pinning_spec.rb +9 -5
- data/spec/integration/cursor_reaping_spec.rb +1 -1
- data/spec/integration/docs_examples_spec.rb +2 -2
- 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 +1 -1
- data/spec/integration/operation_failure_message_spec.rb +1 -0
- 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 +17 -13
- data/spec/integration/reconnect_spec.rb +6 -1
- data/spec/integration/retryable_errors_spec.rb +1 -1
- data/spec/integration/retryable_reads_errors_spec.rb +263 -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 +65 -4
- 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 +168 -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 +23 -26
- 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 +1 -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 +1 -1
- data/spec/lite_spec_helper.rb +61 -16
- 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 +1 -1
- data/spec/mongo/client_construction_spec.rb +734 -631
- data/spec/mongo/client_encryption_spec.rb +11 -23
- data/spec/mongo/client_spec.rb +389 -152
- data/spec/mongo/cluster/cursor_reaper_spec.rb +42 -17
- 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 +184 -84
- 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 +3 -3
- 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 +25 -2
- 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 +121 -15
- data/spec/mongo/collection_ddl_spec.rb +116 -66
- data/spec/mongo/collection_spec.rb +48 -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 +264 -6
- 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 +43 -115
- 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 +148 -14
- 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 +50 -1
- 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/create/op_msg_spec.rb +244 -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 +14 -5
- 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/indexes_spec.rb +1 -1
- data/spec/mongo/operation/insert/bulk_spec.rb +1 -1
- data/spec/mongo/operation/insert/op_msg_spec.rb +19 -11
- 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 +25 -2
- data/spec/mongo/operation/remove_user_spec.rb +1 -1
- data/spec/mongo/operation/result_spec.rb +21 -1
- 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 +2 -1
- data/spec/mongo/retryable/write_worker_spec.rb +39 -0
- data/spec/mongo/retryable_spec.rb +37 -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 +71 -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_averager_spec.rb +1 -1
- 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 +137 -16
- 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 +45 -72
- 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 -15
- 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 +1 -1
- 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 +14 -5
- 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 +10 -5
- 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 +15 -9
- 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/assertions.rb +162 -51
- data/spec/runners/unified/change_stream_operations.rb +26 -3
- data/spec/runners/unified/client_side_encryption_operations.rb +83 -0
- data/spec/runners/unified/crud_operations.rb +166 -28
- data/spec/runners/unified/ddl_operations.rb +152 -3
- data/spec/runners/unified/entity_map.rb +4 -4
- 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 +22 -1
- data/spec/runners/unified/search_index_operations.rb +63 -0
- data/spec/runners/unified/support_operations.rb +78 -8
- data/spec/runners/unified/test.rb +199 -31
- 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/shared/lib/mrss/constraints.rb +10 -17
- data/spec/shared/lib/mrss/docker_runner.rb +30 -3
- data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
- data/spec/shared/lib/mrss/event_subscriber.rb +15 -5
- data/spec/shared/lib/mrss/lite_constraints.rb +48 -1
- data/spec/shared/lib/mrss/server_version_registry.rb +16 -23
- data/spec/shared/lib/mrss/session_registry.rb +69 -0
- data/spec/shared/lib/mrss/session_registry_legacy.rb +60 -0
- data/spec/shared/lib/mrss/utils.rb +28 -6
- data/spec/shared/share/Dockerfile.erb +82 -124
- data/spec/shared/shlib/config.sh +27 -0
- data/spec/shared/shlib/distro.sh +2 -1
- data/spec/shared/shlib/server.sh +74 -24
- data/spec/shared/shlib/set_env.sh +45 -30
- data/spec/solo/clean_exit_spec.rb +5 -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/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 +41 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams-disambiguatedPaths.yml +103 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams-errors.yml +120 -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 +12 -2
- 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 +89 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Compact.yml +82 -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 +937 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-DecryptExistingData.yml +66 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Delete.yml +100 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-EncryptedFields-vs-EncryptedFieldsMap.yml +79 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-EncryptedFields-vs-jsonSchema.yml +102 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-EncryptedFieldsMap-defaults.yml +58 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-FindOneAndUpdate.yml +200 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-InsertFind-Indexed.yml +96 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-InsertFind-Unindexed.yml +89 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-MissingKey.yml +43 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-NoEncryption.yml +44 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Aggregate.yml +241 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Correctness.yml +422 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Delete.yml +182 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-FindOneAndUpdate.yml +239 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-InsertFind.yml +235 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Date-Update.yml +252 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Aggregate.yml +1687 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Correctness.yml +293 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Delete.yml +905 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-FindOneAndUpdate.yml +1684 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-InsertFind.yml +1680 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Decimal-Update.yml +1697 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Aggregate.yml +329 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Correctness.yml +424 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Delete.yml +226 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-FindOneAndUpdate.yml +327 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-InsertFind.yml +319 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DecimalPrecision-Update.yml +336 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Aggregate.yml +913 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Correctness.yml +292 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Delete.yml +518 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-FindOneAndUpdate.yml +911 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-InsertFind.yml +907 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Double-Update.yml +924 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Aggregate.yml +325 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Correctness.yml +424 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Delete.yml +224 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-FindOneAndUpdate.yml +323 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-InsertFind.yml +319 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-DoublePrecision-Update.yml +338 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Aggregate.yml +241 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Correctness.yml +423 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Delete.yml +182 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-FindOneAndUpdate.yml +239 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-InsertFind.yml +235 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Int-Update.yml +254 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Aggregate.yml +241 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Correctness.yml +422 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Delete.yml +182 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-FindOneAndUpdate.yml +239 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-InsertFind.yml +235 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-Long-Update.yml +254 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Range-WrongType.yml +43 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-Update.yml +210 -0
- data/spec/spec_tests/data/client_side_encryption/fle2v2-validatorAndPartialFieldExpression.yml +169 -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/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/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-let.yml +138 -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 +155 -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 +151 -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 +93 -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 +91 -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-let.yml +71 -0
- data/spec/spec_tests/data/crud_unified/find-test-all-options.yml +348 -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 +86 -0
- 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/findOneAndReplace-let.yml +94 -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/findOneAndUpdate-let.yml +96 -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 +107 -0
- 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 +102 -0
- 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/max_staleness/ReplicaSetNoPrimary/DefaultNoMaxStaleness.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/LastUpdateTime.yml +3 -3
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Nearest.yml +3 -3
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Nearest2.yml +3 -3
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred_tags.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/Secondary.yml +4 -4
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred_tags.yml +4 -4
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/ZeroMaxStaleness.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/DefaultNoMaxStaleness.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LastUpdateTime.yml +3 -3
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LongHeartbeat.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/LongHeartbeat2.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/MaxStalenessTooSmall.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/MaxStalenessWithModePrimary.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest.yml +3 -3
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest2.yml +3 -3
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Nearest_tags.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred.yml +2 -2
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags.yml +5 -5
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags2.yml +3 -3
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Secondary_tags.yml +5 -5
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/Secondary_tags2.yml +3 -3
- data/spec/spec_tests/data/max_staleness/ReplicaSetWithPrimary/ZeroMaxStaleness.yml +2 -2
- data/spec/spec_tests/data/max_staleness/Sharded/SmallMaxStaleness.yml +2 -2
- data/spec/spec_tests/data/max_staleness/Single/SmallMaxStaleness.yml +1 -1
- data/spec/spec_tests/data/max_staleness/Unknown/SmallMaxStaleness.yml +1 -1
- 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 +75 -0
- data/spec/spec_tests/data/sessions_unified/snapshot-sessions-not-supported-server-error.yml +102 -0
- data/spec/spec_tests/data/sessions_unified/snapshot-sessions-unsupported-ops.yml +258 -0
- data/spec/spec_tests/data/sessions_unified/snapshot-sessions.yml +482 -0
- 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 +1 -1
- data/spec/spec_tests/server_selection_spec.rb +1 -1
- data/spec/spec_tests/sessions_unified_spec.rb +13 -0
- 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 +1 -1
- 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 +67 -67
- data/spec/support/certificates/atlas-ocsp.crt +103 -103
- 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 +14 -9
- data/spec/support/common_shortcuts.rb +52 -5
- 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/faas/app/aws_lambda/mongodb/Gemfile.lock +19 -0
- 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 +14 -8
- data/spec/support/spec_config.rb +133 -2
- data/spec/support/spec_setup.rb +1 -1
- data/spec/support/using_hash.rb +11 -2
- data/spec/support/utils.rb +277 -228
- data.tar.gz.sig +0 -0
- metadata +1868 -1248
- metadata.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/drop_database/command.rb +0 -41
- 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/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/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/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
|
#
|
@@ -195,7 +229,20 @@ module Mongo
|
|
195
229
|
# being used by the queue.
|
196
230
|
#
|
197
231
|
# @api private
|
198
|
-
|
232
|
+
def_delegators :generation_manager, :generation, :generation_unlocked
|
233
|
+
|
234
|
+
# A connection pool is paused if it is not closed and it is not ready.
|
235
|
+
#
|
236
|
+
# @return [ true | false ] whether the connection pool is paused.
|
237
|
+
#
|
238
|
+
# @raise [ Error::PoolClosedError ] If the pool has been closed.
|
239
|
+
def paused?
|
240
|
+
raise_if_closed!
|
241
|
+
|
242
|
+
@lock.synchronize do
|
243
|
+
!@ready
|
244
|
+
end
|
245
|
+
end
|
199
246
|
|
200
247
|
# Size of the connection pool.
|
201
248
|
#
|
@@ -221,6 +268,14 @@ module Mongo
|
|
221
268
|
end
|
222
269
|
private :unsynchronized_size
|
223
270
|
|
271
|
+
# @return [ Integer ] The number of unavailable connections in the pool.
|
272
|
+
# Used to calculate whether we have hit max_pool_size.
|
273
|
+
#
|
274
|
+
# @api private
|
275
|
+
def unavailable_connections
|
276
|
+
@checked_out_connections.length + @pending_connections.length + @connection_requests
|
277
|
+
end
|
278
|
+
|
224
279
|
# Number of available connections in the pool.
|
225
280
|
#
|
226
281
|
# @return [ Integer ] Number of available connections.
|
@@ -243,14 +298,30 @@ module Mongo
|
|
243
298
|
!!@closed
|
244
299
|
end
|
245
300
|
|
301
|
+
# Whether the pool is ready.
|
302
|
+
#
|
303
|
+
# @return [ true | false ] Whether the pool is ready.
|
304
|
+
def ready?
|
305
|
+
@lock.synchronize do
|
306
|
+
@ready
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
246
310
|
# @note This method is experimental and subject to change.
|
247
311
|
#
|
248
312
|
# @api experimental
|
249
313
|
# @since 2.11.0
|
250
314
|
def summary
|
251
315
|
@lock.synchronize do
|
316
|
+
state = if closed?
|
317
|
+
'closed'
|
318
|
+
elsif !@ready
|
319
|
+
'paused'
|
320
|
+
else
|
321
|
+
'ready'
|
322
|
+
end
|
252
323
|
"#<ConnectionPool size=#{unsynchronized_size} (#{min_size}-#{max_size}) " +
|
253
|
-
"used=#{@checked_out_connections.length} avail=#{@available_connections.length} pending=#{@pending_connections.length}>"
|
324
|
+
"used=#{@checked_out_connections.length} avail=#{@available_connections.length} pending=#{@pending_connections.length} #{state}>"
|
254
325
|
end
|
255
326
|
end
|
256
327
|
|
@@ -260,6 +331,9 @@ module Mongo
|
|
260
331
|
# @api private
|
261
332
|
attr_reader :populator
|
262
333
|
|
334
|
+
# @api private
|
335
|
+
attr_reader :max_connecting
|
336
|
+
|
263
337
|
# Checks a connection out of the pool.
|
264
338
|
#
|
265
339
|
# If there are active connections in the pool, the most recently used
|
@@ -278,139 +352,17 @@ module Mongo
|
|
278
352
|
# and remains so for longer than the wait timeout.
|
279
353
|
#
|
280
354
|
# @since 2.9.0
|
281
|
-
def check_out(
|
355
|
+
def check_out(connection_global_id: nil)
|
282
356
|
check_invariants
|
283
357
|
|
284
358
|
publish_cmap_event(
|
285
359
|
Monitoring::Event::Cmap::ConnectionCheckOutStarted.new(@server.address)
|
286
360
|
)
|
287
361
|
|
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
|
362
|
+
raise_if_pool_closed!
|
363
|
+
raise_if_pool_paused_locked!
|
343
364
|
|
344
|
-
|
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
|
-
)
|
371
|
-
|
372
|
-
msg = @lock.synchronize do
|
373
|
-
service_id_msg = if service_id
|
374
|
-
" for service #{service_id}"
|
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
|
365
|
+
connection = retrieve_and_connect_connection(connection_global_id)
|
414
366
|
|
415
367
|
publish_cmap_event(
|
416
368
|
Monitoring::Event::Cmap::ConnectionCheckedOut.new(@server.address, connection.id, self),
|
@@ -438,67 +390,114 @@ module Mongo
|
|
438
390
|
check_invariants
|
439
391
|
|
440
392
|
@lock.synchronize do
|
441
|
-
|
442
|
-
|
443
|
-
|
393
|
+
do_check_in(connection)
|
394
|
+
end
|
395
|
+
ensure
|
396
|
+
check_invariants
|
397
|
+
end
|
444
398
|
|
445
|
-
|
446
|
-
|
447
|
-
|
399
|
+
# Executes the check in after having already acquired the lock.
|
400
|
+
#
|
401
|
+
# @param [ Mongo::Server::Connection ] connection The connection.
|
402
|
+
def do_check_in(connection)
|
403
|
+
# When a connection is interrupted it is checked back into the pool
|
404
|
+
# and closed. The operation that was using the connection before it was
|
405
|
+
# interrupted will attempt to check it back into the pool, and we
|
406
|
+
# should ignore it since its already been closed and removed from the pool.
|
407
|
+
return if connection.closed? && connection.interrupted?
|
408
|
+
|
409
|
+
unless connection.connection_pool == self
|
410
|
+
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})"
|
411
|
+
end
|
448
412
|
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
# Threads that begin waiting after this method completes (with
|
453
|
-
# the exception) should be fine.
|
413
|
+
unless @checked_out_connections.include?(connection)
|
414
|
+
raise ArgumentError, "Trying to check in a connection which is not currently checked out by this pool: #{connection} (for #{self})"
|
415
|
+
end
|
454
416
|
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
417
|
+
# Note: if an event handler raises, resource will not be signaled.
|
418
|
+
# This means threads waiting for a connection to free up when
|
419
|
+
# the pool is at max size may time out.
|
420
|
+
# Threads that begin waiting after this method completes (with
|
421
|
+
# the exception) should be fine.
|
459
422
|
|
460
|
-
|
461
|
-
|
462
|
-
return
|
463
|
-
end
|
423
|
+
@checked_out_connections.delete(connection)
|
424
|
+
@size_cv.signal
|
464
425
|
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
end
|
426
|
+
publish_cmap_event(
|
427
|
+
Monitoring::Event::Cmap::ConnectionCheckedIn.new(@server.address, connection.id, self)
|
428
|
+
)
|
469
429
|
|
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
|
430
|
+
if connection.interrupted?
|
431
|
+
connection.disconnect!(reason: :stale)
|
432
|
+
return
|
433
|
+
end
|
480
434
|
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
435
|
+
if connection.error?
|
436
|
+
connection.disconnect!(reason: :error)
|
437
|
+
return
|
438
|
+
end
|
439
|
+
|
440
|
+
if closed?
|
441
|
+
connection.disconnect!(reason: :pool_closed)
|
442
|
+
return
|
443
|
+
end
|
444
|
+
|
445
|
+
if connection.closed?
|
446
|
+
# Connection was closed - for example, because it experienced
|
447
|
+
# a network error. Nothing else needs to be done here.
|
448
|
+
@populate_semaphore.signal
|
449
|
+
elsif connection.generation != generation(service_id: connection.service_id) && !connection.pinned?
|
450
|
+
# If connection is marked as pinned, it is used by a transaction
|
451
|
+
# or a series of cursor operations in a load balanced setup.
|
452
|
+
# In this case connection should not be disconnected until
|
453
|
+
# unpinned.
|
454
|
+
connection.disconnect!(reason: :stale)
|
455
|
+
@populate_semaphore.signal
|
456
|
+
else
|
457
|
+
connection.record_checkin!
|
458
|
+
@available_connections << connection
|
459
|
+
|
460
|
+
@max_connecting_cv.signal
|
461
|
+
end
|
462
|
+
end
|
463
|
+
|
464
|
+
# Mark the connection pool as paused.
|
465
|
+
def pause
|
466
|
+
raise_if_closed!
|
467
|
+
|
468
|
+
check_invariants
|
469
|
+
|
470
|
+
@lock.synchronize do
|
471
|
+
do_pause
|
485
472
|
end
|
486
473
|
ensure
|
487
474
|
check_invariants
|
488
475
|
end
|
489
476
|
|
477
|
+
# Mark the connection pool as paused without acquiring the lock.
|
478
|
+
#
|
479
|
+
# @api private
|
480
|
+
def do_pause
|
481
|
+
if Lint.enabled? && !@server.unknown?
|
482
|
+
raise Error::LintError, "Attempting to pause pool for server #{@server.summary} which is known"
|
483
|
+
end
|
484
|
+
|
485
|
+
return if !@ready
|
486
|
+
|
487
|
+
@ready = false
|
488
|
+
end
|
489
|
+
|
490
490
|
# Closes all idle connections in the pool and schedules currently checked
|
491
491
|
# out connections to be closed when they are checked back into the pool.
|
492
|
-
# The pool
|
493
|
-
#
|
492
|
+
# The pool is paused, it will not create new connections in background
|
493
|
+
# and it will fail checkout requests until marked ready.
|
494
494
|
#
|
495
495
|
# @option options [ true | false ] :lazy If true, do not close any of
|
496
496
|
# 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.
|
497
|
+
# subsequent check out operation. Defaults to false.
|
498
|
+
# @option options [ true | false ] :interrupt_in_use_connections If true,
|
499
|
+
# close all checked out connections immediately. If it is false, do not
|
500
|
+
# close any of the checked out connections. Defaults to true.
|
502
501
|
# @option options [ Object ] :service_id Clear connections with
|
503
502
|
# the specified service id only.
|
504
503
|
#
|
@@ -508,56 +507,112 @@ module Mongo
|
|
508
507
|
def clear(options = nil)
|
509
508
|
raise_if_closed!
|
510
509
|
|
511
|
-
|
512
|
-
|
513
|
-
if options && options[:stop_populator]
|
514
|
-
stop_populator
|
510
|
+
if Lint.enabled? && !@server.unknown?
|
511
|
+
raise Error::LintError, "Attempting to clear pool for server #{@server.summary} which is known"
|
515
512
|
end
|
516
513
|
|
514
|
+
do_clear(options)
|
515
|
+
end
|
516
|
+
|
517
|
+
# Disconnects the pool.
|
518
|
+
#
|
519
|
+
# Does everything that +clear+ does, except if the pool is closed
|
520
|
+
# this method does nothing but +clear+ would raise PoolClosedError.
|
521
|
+
#
|
522
|
+
# @since 2.1.0
|
523
|
+
# @api private
|
524
|
+
def disconnect!(options = nil)
|
525
|
+
do_clear(options)
|
526
|
+
rescue Error::PoolClosedError
|
527
|
+
# The "disconnected" state is between closed and paused.
|
528
|
+
# When we are trying to disconnect the pool, permit the pool to be
|
529
|
+
# already closed.
|
530
|
+
end
|
531
|
+
|
532
|
+
def do_clear(options = nil)
|
533
|
+
check_invariants
|
534
|
+
|
517
535
|
service_id = options && options[:service_id]
|
518
536
|
|
519
537
|
@lock.synchronize do
|
538
|
+
# Generation must be bumped before emitting pool cleared event.
|
520
539
|
@generation_manager.bump(service_id: service_id)
|
521
540
|
|
522
|
-
publish_cmap_event(
|
523
|
-
Monitoring::Event::Cmap::PoolCleared.new(
|
524
|
-
@server.address,
|
525
|
-
service_id: service_id,
|
526
|
-
)
|
527
|
-
)
|
528
|
-
|
529
541
|
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
|
542
|
+
close_available_connections(service_id)
|
543
|
+
end
|
544
|
+
|
545
|
+
if options && options[:interrupt_in_use_connections]
|
546
|
+
schedule_for_interruption(@checked_out_connections, service_id)
|
547
|
+
schedule_for_interruption(@pending_connections, service_id)
|
548
|
+
end
|
549
|
+
|
550
|
+
if @ready
|
551
|
+
publish_cmap_event(
|
552
|
+
Monitoring::Event::Cmap::PoolCleared.new(
|
553
|
+
@server.address,
|
554
|
+
service_id: service_id,
|
555
|
+
interrupt_in_use_connections: options&.[](:interrupt_in_use_connections)
|
556
|
+
)
|
557
|
+
)
|
558
|
+
# Only pause the connection pool if the server was marked unknown,
|
559
|
+
# otherwise, allow the retry to be attempted with a ready pool.
|
560
|
+
do_pause if !@server.load_balancer? && @server.unknown?
|
550
561
|
end
|
562
|
+
|
563
|
+
# Broadcast here to cause all of the threads waiting on the max
|
564
|
+
# connecting to break out of the wait loop and error.
|
565
|
+
@max_connecting_cv.broadcast
|
566
|
+
# Broadcast here to cause all of the threads waiting on the pool size
|
567
|
+
# to break out of the wait loop and error.
|
568
|
+
@size_cv.broadcast
|
551
569
|
end
|
552
570
|
|
571
|
+
# "Schedule the background thread" after clearing. This is responsible
|
572
|
+
# for cleaning up stale threads, and interrupting in use connections.
|
573
|
+
@populate_semaphore.signal
|
553
574
|
true
|
554
575
|
ensure
|
555
576
|
check_invariants
|
556
577
|
end
|
557
578
|
|
558
|
-
#
|
559
|
-
|
560
|
-
|
579
|
+
# Instructs the pool to create and return connections.
|
580
|
+
def ready
|
581
|
+
raise_if_closed!
|
582
|
+
|
583
|
+
# TODO: Add this back in RUBY-3174.
|
584
|
+
# if Lint.enabled?
|
585
|
+
# unless @server.connected?
|
586
|
+
# raise Error::LintError, "Attempting to ready a pool for server #{@server.summary} which is disconnected"
|
587
|
+
# end
|
588
|
+
# end
|
589
|
+
|
590
|
+
@lock.synchronize do
|
591
|
+
return if @ready
|
592
|
+
|
593
|
+
@ready = true
|
594
|
+
end
|
595
|
+
|
596
|
+
# Note that the CMAP spec demands serialization of CMAP events for a
|
597
|
+
# pool. In order to implement this, event publication must be done into
|
598
|
+
# a queue which is synchronized, instead of subscribers being invoked
|
599
|
+
# from the trigger method like this one here inline. On MRI, assuming
|
600
|
+
# the threads yield to others when they stop having work to do, it is
|
601
|
+
# likely that the events would in practice always be published in the
|
602
|
+
# required order. JRuby, being truly concurrent with OS threads,
|
603
|
+
# would not offers such a guarantee.
|
604
|
+
publish_cmap_event(
|
605
|
+
Monitoring::Event::Cmap::PoolReady.new(@server.address, options, self)
|
606
|
+
)
|
607
|
+
|
608
|
+
if options.fetch(:populator_io, true)
|
609
|
+
if @populator.running?
|
610
|
+
@populate_semaphore.signal
|
611
|
+
else
|
612
|
+
@populator.run!
|
613
|
+
end
|
614
|
+
end
|
615
|
+
end
|
561
616
|
|
562
617
|
# Marks the pool closed, closes all idle connections in the pool and
|
563
618
|
# schedules currently checked out connections to be closed when they are
|
@@ -567,6 +622,8 @@ module Mongo
|
|
567
622
|
#
|
568
623
|
# @option options [ true | false ] :force Also close all checked out
|
569
624
|
# connections.
|
625
|
+
# @option options [ true | false ] :stay_ready For internal driver use
|
626
|
+
# only. Whether or not to mark the pool as closed.
|
570
627
|
#
|
571
628
|
# @return [ true ] Always true.
|
572
629
|
#
|
@@ -592,9 +649,15 @@ module Mongo
|
|
592
649
|
end
|
593
650
|
end
|
594
651
|
|
595
|
-
|
596
|
-
|
597
|
-
|
652
|
+
unless options && options[:stay_ready]
|
653
|
+
# mark pool as closed before releasing lock so
|
654
|
+
# no connections can be created, checked in, or checked out
|
655
|
+
@closed = true
|
656
|
+
@ready = false
|
657
|
+
end
|
658
|
+
|
659
|
+
@max_connecting_cv.broadcast
|
660
|
+
@size_cv.broadcast
|
598
661
|
end
|
599
662
|
|
600
663
|
publish_cmap_event(
|
@@ -616,6 +679,9 @@ module Mongo
|
|
616
679
|
if closed?
|
617
680
|
"#<Mongo::Server::ConnectionPool:0x#{object_id} min_size=#{min_size} max_size=#{max_size} " +
|
618
681
|
"wait_timeout=#{wait_timeout} closed>"
|
682
|
+
elsif !ready?
|
683
|
+
"#<Mongo::Server::ConnectionPool:0x#{object_id} min_size=#{min_size} max_size=#{max_size} " +
|
684
|
+
"wait_timeout=#{wait_timeout} paused>"
|
619
685
|
else
|
620
686
|
"#<Mongo::Server::ConnectionPool:0x#{object_id} min_size=#{min_size} max_size=#{max_size} " +
|
621
687
|
"wait_timeout=#{wait_timeout} current_size=#{size} available=#{available_count}>"
|
@@ -632,11 +698,13 @@ module Mongo
|
|
632
698
|
# @return [ Object ] The result of the block.
|
633
699
|
#
|
634
700
|
# @since 2.0.0
|
635
|
-
def with_connection(
|
701
|
+
def with_connection(connection_global_id: nil)
|
636
702
|
raise_if_closed!
|
637
703
|
|
638
|
-
connection = check_out(
|
704
|
+
connection = check_out(connection_global_id: connection_global_id)
|
639
705
|
yield(connection)
|
706
|
+
rescue Error::SocketError, Error::SocketTimeoutError, Error::ConnectionPerished => e
|
707
|
+
maybe_raise_pool_cleared!(connection, e)
|
640
708
|
ensure
|
641
709
|
if connection
|
642
710
|
check_in(connection)
|
@@ -685,17 +753,17 @@ module Mongo
|
|
685
753
|
# connections waiting to be connected, connections which have not yet
|
686
754
|
# been moved to available_connections, or connections moved to available_connections
|
687
755
|
# 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
|
756
|
+
clear_pending_connections
|
693
757
|
end
|
694
758
|
end
|
695
759
|
|
696
|
-
#
|
697
|
-
#
|
698
|
-
#
|
760
|
+
# This method does three things:
|
761
|
+
# 1. Creates and adds a connection to the pool, if the pool's size is
|
762
|
+
# below min_size. Retries once if a socket-related error is
|
763
|
+
# encountered during this process and raises if a second error or a
|
764
|
+
# non socket-related error occurs.
|
765
|
+
# 2. Removes stale connections from the connection pool.
|
766
|
+
# 3. Interrupts connections marked for interruption.
|
699
767
|
#
|
700
768
|
# Used by the pool populator background thread.
|
701
769
|
#
|
@@ -717,11 +785,6 @@ module Mongo
|
|
717
785
|
end
|
718
786
|
|
719
787
|
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
788
|
end
|
726
789
|
|
727
790
|
# Finalize the connection pool for garbage collection.
|
@@ -751,13 +814,15 @@ module Mongo
|
|
751
814
|
|
752
815
|
private
|
753
816
|
|
754
|
-
# Returns the next available connection, optionally
|
755
|
-
#
|
817
|
+
# Returns the next available connection, optionally with given
|
818
|
+
# global id. If no suitable connections are available,
|
756
819
|
# returns nil.
|
757
|
-
def next_available_connection(
|
758
|
-
|
820
|
+
def next_available_connection(connection_global_id)
|
821
|
+
raise_unless_locked!
|
822
|
+
|
823
|
+
if @server.load_balancer? && connection_global_id
|
759
824
|
conn = @available_connections.detect do |conn|
|
760
|
-
conn.
|
825
|
+
conn.global_id == connection_global_id
|
761
826
|
end
|
762
827
|
if conn
|
763
828
|
@available_connections.delete(conn)
|
@@ -769,18 +834,21 @@ module Mongo
|
|
769
834
|
end
|
770
835
|
|
771
836
|
def create_connection
|
837
|
+
r, _ = @generation_manager.pipe_fds(service_id: server.description.service_id)
|
772
838
|
opts = options.merge(
|
773
839
|
connection_pool: self,
|
840
|
+
pipe: r
|
774
841
|
# Do not pass app metadata - this will be retrieved by the connection
|
775
842
|
# based on the auth needs.
|
776
843
|
)
|
777
844
|
unless @server.load_balancer?
|
778
845
|
opts[:generation] = generation
|
779
846
|
end
|
780
|
-
|
847
|
+
Connection.new(@server, opts)
|
781
848
|
end
|
782
849
|
|
783
|
-
# Create a connection, connect it, and add it to the pool.
|
850
|
+
# Create a connection, connect it, and add it to the pool. Also
|
851
|
+
# check for stale and interruptable connections and deal with them.
|
784
852
|
#
|
785
853
|
# @return [ true | false ] True if a connection was created and
|
786
854
|
# added to the pool, false otherwise
|
@@ -789,10 +857,15 @@ module Mongo
|
|
789
857
|
connection = nil
|
790
858
|
|
791
859
|
@lock.synchronize do
|
792
|
-
if !closed? &&
|
860
|
+
if !closed? && @ready &&
|
861
|
+
(unsynchronized_size + @connection_requests) < min_size &&
|
862
|
+
@pending_connections.length < @max_connecting
|
863
|
+
then
|
793
864
|
connection = create_connection
|
794
865
|
@pending_connections << connection
|
795
866
|
else
|
867
|
+
return true if remove_interrupted_connections
|
868
|
+
return true if remove_stale_connection
|
796
869
|
return false
|
797
870
|
end
|
798
871
|
end
|
@@ -802,6 +875,8 @@ module Mongo
|
|
802
875
|
rescue Exception
|
803
876
|
@lock.synchronize do
|
804
877
|
@pending_connections.delete(connection)
|
878
|
+
@max_connecting_cv.signal
|
879
|
+
@size_cv.signal
|
805
880
|
end
|
806
881
|
raise
|
807
882
|
end
|
@@ -809,14 +884,65 @@ module Mongo
|
|
809
884
|
@lock.synchronize do
|
810
885
|
@available_connections << connection
|
811
886
|
@pending_connections.delete(connection)
|
887
|
+
@max_connecting_cv.signal
|
888
|
+
@size_cv.signal
|
889
|
+
end
|
890
|
+
|
891
|
+
true
|
892
|
+
end
|
893
|
+
|
894
|
+
# Removes and disconnects all stale available connections.
|
895
|
+
def remove_stale_connection
|
896
|
+
if conn = @available_connections.detect(&method(:connection_stale_unlocked?))
|
897
|
+
conn.disconnect!(reason: :stale)
|
898
|
+
@available_connections.delete(conn)
|
899
|
+
return true
|
900
|
+
end
|
901
|
+
end
|
812
902
|
|
813
|
-
|
814
|
-
|
903
|
+
# Interrupt connections scheduled for interruption.
|
904
|
+
def remove_interrupted_connections
|
905
|
+
return false if @interrupt_connections.empty?
|
906
|
+
|
907
|
+
gens = Set.new
|
908
|
+
while conn = @interrupt_connections.pop
|
909
|
+
if @checked_out_connections.include?(conn)
|
910
|
+
# If the connection has been checked out, mark it as interrupted and it will
|
911
|
+
# be disconnected on check in.
|
912
|
+
conn.interrupted!
|
913
|
+
do_check_in(conn)
|
914
|
+
elsif @pending_connections.include?(conn)
|
915
|
+
# If the connection is pending, disconnect with the interrupted flag.
|
916
|
+
conn.disconnect!(reason: :stale, interrupted: true)
|
917
|
+
@pending_connections.delete(conn)
|
918
|
+
end
|
919
|
+
gens << [ conn.generation, conn.service_id ]
|
920
|
+
end
|
921
|
+
|
922
|
+
# Close the write side of the pipe. Pending connections might be
|
923
|
+
# hanging on the Kernel#select call, so in order to interrupt that,
|
924
|
+
# we also listen for the read side of the pipe in Kernel#select and
|
925
|
+
# close the write side of the pipe here, which will cause select to
|
926
|
+
# wake up and raise an IOError now that the socket is closed.
|
927
|
+
# The read side of the pipe will be scheduled for closing on the next
|
928
|
+
# generation bump.
|
929
|
+
gens.each do |gen, service_id|
|
930
|
+
@generation_manager.remove_pipe_fds(gen, service_id: service_id)
|
815
931
|
end
|
816
932
|
|
817
933
|
true
|
818
934
|
end
|
819
935
|
|
936
|
+
# Checks whether a connection is stale.
|
937
|
+
#
|
938
|
+
# @param [ Mongo::Server::Connection ] connection The connection to check.
|
939
|
+
#
|
940
|
+
# @return [ true | false ] Whether the connection is stale.
|
941
|
+
def connection_stale_unlocked?(connection)
|
942
|
+
connection.generation != generation_unlocked(service_id: connection.service_id) &&
|
943
|
+
!connection.pinned?
|
944
|
+
end
|
945
|
+
|
820
946
|
# Asserts that the pool has not been closed.
|
821
947
|
#
|
822
948
|
# @raise [ Error::PoolClosedError ] If the pool has been closed.
|
@@ -828,6 +954,25 @@ module Mongo
|
|
828
954
|
end
|
829
955
|
end
|
830
956
|
|
957
|
+
# If the connection was interrupted, raise a pool cleared error. If it
|
958
|
+
# wasn't interrupted raise the original error.
|
959
|
+
#
|
960
|
+
# @param [ Connection ] The connection.
|
961
|
+
# @param [ Mongo::Error ] The original error.
|
962
|
+
#
|
963
|
+
# @raise [ Mongo::Error | Mongo::Error::PoolClearedError ] A PoolClearedError
|
964
|
+
# if the connection was interrupted, the original error if not.
|
965
|
+
def maybe_raise_pool_cleared!(connection, e)
|
966
|
+
if connection&.interrupted?
|
967
|
+
err = Error::PoolClearedError.new(connection.server.address, connection.server.pool_internal).tap do |err|
|
968
|
+
e.labels.each { |l| err.add_label(l) }
|
969
|
+
end
|
970
|
+
raise err
|
971
|
+
else
|
972
|
+
raise e
|
973
|
+
end
|
974
|
+
end
|
975
|
+
|
831
976
|
# Attempts to connect (handshake and auth) the connection. If an error is
|
832
977
|
# encountered, closes the connection and raises the error.
|
833
978
|
def connect_connection(connection)
|
@@ -867,6 +1012,350 @@ module Mongo
|
|
867
1012
|
end
|
868
1013
|
end
|
869
1014
|
end
|
1015
|
+
|
1016
|
+
# Close the available connections.
|
1017
|
+
#
|
1018
|
+
# @param [ Array<Connection> ] connections A list of connections.
|
1019
|
+
# @param [ Object ] service_id The service id.
|
1020
|
+
def close_available_connections(service_id)
|
1021
|
+
if @server.load_balancer? && service_id
|
1022
|
+
loop do
|
1023
|
+
conn = @available_connections.detect do |conn|
|
1024
|
+
conn.service_id == service_id &&
|
1025
|
+
conn.generation < @generation_manager.generation(service_id: service_id)
|
1026
|
+
end
|
1027
|
+
if conn
|
1028
|
+
@available_connections.delete(conn)
|
1029
|
+
conn.disconnect!(reason: :stale, interrupted: true)
|
1030
|
+
@populate_semaphore.signal
|
1031
|
+
else
|
1032
|
+
break
|
1033
|
+
end
|
1034
|
+
end
|
1035
|
+
else
|
1036
|
+
@available_connections.delete_if do |conn|
|
1037
|
+
if conn.generation < @generation_manager.generation(service_id: service_id)
|
1038
|
+
conn.disconnect!(reason: :stale, interrupted: true)
|
1039
|
+
@populate_semaphore.signal
|
1040
|
+
true
|
1041
|
+
end
|
1042
|
+
end
|
1043
|
+
end
|
1044
|
+
end
|
1045
|
+
|
1046
|
+
# Schedule connections of previous generations for interruption.
|
1047
|
+
#
|
1048
|
+
# @param [ Array<Connection> ] connections A list of connections.
|
1049
|
+
# @param [ Object ] service_id The service id.
|
1050
|
+
def schedule_for_interruption(connections, service_id)
|
1051
|
+
@interrupt_connections += connections.select do |conn|
|
1052
|
+
(!server.load_balancer? || conn.service_id == service_id) &&
|
1053
|
+
conn.generation < @generation_manager.generation(service_id: service_id)
|
1054
|
+
end
|
1055
|
+
end
|
1056
|
+
|
1057
|
+
# Clear and disconnect the pending connections.
|
1058
|
+
def clear_pending_connections
|
1059
|
+
until @pending_connections.empty?
|
1060
|
+
connection = @pending_connections.take(1).first
|
1061
|
+
connection.disconnect!
|
1062
|
+
@pending_connections.delete(connection)
|
1063
|
+
end
|
1064
|
+
end
|
1065
|
+
|
1066
|
+
# The lock should be acquired when calling this method.
|
1067
|
+
def raise_check_out_timeout!(connection_global_id)
|
1068
|
+
raise_unless_locked!
|
1069
|
+
|
1070
|
+
publish_cmap_event(
|
1071
|
+
Monitoring::Event::Cmap::ConnectionCheckOutFailed.new(
|
1072
|
+
@server.address,
|
1073
|
+
Monitoring::Event::Cmap::ConnectionCheckOutFailed::TIMEOUT,
|
1074
|
+
),
|
1075
|
+
)
|
1076
|
+
|
1077
|
+
connection_global_id_msg = if connection_global_id
|
1078
|
+
" for connection #{connection_global_id}"
|
1079
|
+
else
|
1080
|
+
''
|
1081
|
+
end
|
1082
|
+
|
1083
|
+
msg = "Timed out attempting to check out a connection " +
|
1084
|
+
"from pool for #{@server.address}#{connection_global_id_msg} after #{wait_timeout} sec. " +
|
1085
|
+
"Connections in pool: #{@available_connections.length} available, " +
|
1086
|
+
"#{@checked_out_connections.length} checked out, " +
|
1087
|
+
"#{@pending_connections.length} pending, " +
|
1088
|
+
"#{@connection_requests} connections requests " +
|
1089
|
+
"(max size: #{max_size})"
|
1090
|
+
raise Error::ConnectionCheckOutTimeout.new(msg, address: @server.address)
|
1091
|
+
end
|
1092
|
+
|
1093
|
+
def raise_check_out_timeout_locked!(connection_global_id)
|
1094
|
+
@lock.synchronize do
|
1095
|
+
raise_check_out_timeout!(connection_global_id)
|
1096
|
+
end
|
1097
|
+
end
|
1098
|
+
|
1099
|
+
def raise_if_pool_closed!
|
1100
|
+
if closed?
|
1101
|
+
publish_cmap_event(
|
1102
|
+
Monitoring::Event::Cmap::ConnectionCheckOutFailed.new(
|
1103
|
+
@server.address,
|
1104
|
+
Monitoring::Event::Cmap::ConnectionCheckOutFailed::POOL_CLOSED
|
1105
|
+
),
|
1106
|
+
)
|
1107
|
+
raise Error::PoolClosedError.new(@server.address, self)
|
1108
|
+
end
|
1109
|
+
end
|
1110
|
+
|
1111
|
+
def raise_if_pool_paused!
|
1112
|
+
raise_unless_locked!
|
1113
|
+
|
1114
|
+
if !@ready
|
1115
|
+
publish_cmap_event(
|
1116
|
+
Monitoring::Event::Cmap::ConnectionCheckOutFailed.new(
|
1117
|
+
@server.address,
|
1118
|
+
# CMAP spec decided to conflate pool paused with all the other
|
1119
|
+
# possible non-timeout errors.
|
1120
|
+
Monitoring::Event::Cmap::ConnectionCheckOutFailed::CONNECTION_ERROR,
|
1121
|
+
),
|
1122
|
+
)
|
1123
|
+
raise Error::PoolPausedError.new(@server.address, self)
|
1124
|
+
end
|
1125
|
+
end
|
1126
|
+
|
1127
|
+
def raise_if_pool_paused_locked!
|
1128
|
+
@lock.synchronize do
|
1129
|
+
raise_if_pool_paused!
|
1130
|
+
end
|
1131
|
+
end
|
1132
|
+
|
1133
|
+
# The lock should be acquired when calling this method.
|
1134
|
+
def raise_if_not_ready!
|
1135
|
+
raise_unless_locked!
|
1136
|
+
raise_if_pool_closed!
|
1137
|
+
raise_if_pool_paused!
|
1138
|
+
end
|
1139
|
+
|
1140
|
+
def raise_unless_locked!
|
1141
|
+
unless @lock.owned?
|
1142
|
+
raise ArgumentError, "the lock must be owned when calling this method"
|
1143
|
+
end
|
1144
|
+
end
|
1145
|
+
|
1146
|
+
def valid_available_connection?(connection, pid, connection_global_id)
|
1147
|
+
if connection.pid != pid
|
1148
|
+
log_warn("Detected PID change - Mongo client should have been reconnected (old pid #{connection.pid}, new pid #{pid}")
|
1149
|
+
connection.disconnect!(reason: :stale)
|
1150
|
+
@populate_semaphore.signal
|
1151
|
+
return false
|
1152
|
+
end
|
1153
|
+
|
1154
|
+
if !connection.pinned?
|
1155
|
+
# If connection is marked as pinned, it is used by a transaction
|
1156
|
+
# or a series of cursor operations in a load balanced setup.
|
1157
|
+
# In this case connection should not be disconnected until
|
1158
|
+
# unpinned.
|
1159
|
+
if connection.generation != generation(
|
1160
|
+
service_id: connection.service_id
|
1161
|
+
)
|
1162
|
+
# Stale connections should be disconnected in the clear
|
1163
|
+
# method, but if any don't, check again here
|
1164
|
+
connection.disconnect!(reason: :stale)
|
1165
|
+
@populate_semaphore.signal
|
1166
|
+
return false
|
1167
|
+
end
|
1168
|
+
|
1169
|
+
if max_idle_time && connection.last_checkin &&
|
1170
|
+
Time.now - connection.last_checkin > max_idle_time
|
1171
|
+
then
|
1172
|
+
connection.disconnect!(reason: :idle)
|
1173
|
+
@populate_semaphore.signal
|
1174
|
+
return false
|
1175
|
+
end
|
1176
|
+
end
|
1177
|
+
true
|
1178
|
+
end
|
1179
|
+
|
1180
|
+
# Retrieves a connection if one is available, otherwise we create a new
|
1181
|
+
# one. If no connection exists and the pool is at max size, wait until
|
1182
|
+
# a connection is checked back into the pool.
|
1183
|
+
#
|
1184
|
+
# @param [ Integer ] pid The current process id.
|
1185
|
+
# @param [ Integer ] connection_global_id The global id for the
|
1186
|
+
# connection to check out.
|
1187
|
+
#
|
1188
|
+
# @return [ Mongo::Server::Connection ] The checked out connection.
|
1189
|
+
#
|
1190
|
+
# @raise [ Error::PoolClosedError ] If the pool has been closed.
|
1191
|
+
# @raise [ Timeout::Error ] If the connection pool is at maximum size
|
1192
|
+
# and remains so for longer than the wait timeout.
|
1193
|
+
def get_connection(pid, connection_global_id)
|
1194
|
+
if connection = next_available_connection(connection_global_id)
|
1195
|
+
unless valid_available_connection?(connection, pid, connection_global_id)
|
1196
|
+
return nil
|
1197
|
+
end
|
1198
|
+
|
1199
|
+
# We've got a connection, so we decrement the number of connection
|
1200
|
+
# requests.
|
1201
|
+
# We do not need to signal condition variable here, because
|
1202
|
+
# because the execution will continue, and we signal later.
|
1203
|
+
@connection_requests -= 1
|
1204
|
+
|
1205
|
+
# If the connection is connected, it's not considered a
|
1206
|
+
# "pending connection". The pending_connections list represents
|
1207
|
+
# the set of connections that are awaiting connection.
|
1208
|
+
unless connection.connected?
|
1209
|
+
@pending_connections << connection
|
1210
|
+
end
|
1211
|
+
return connection
|
1212
|
+
elsif connection_global_id && @server.load_balancer?
|
1213
|
+
# A particular connection is requested, but it is not available.
|
1214
|
+
# If it is nether available not checked out, we should stop here.
|
1215
|
+
@checked_out_connections.detect do |conn|
|
1216
|
+
conn.global_id == connection_global_id
|
1217
|
+
end.tap do |conn|
|
1218
|
+
if conn.nil?
|
1219
|
+
publish_cmap_event(
|
1220
|
+
Monitoring::Event::Cmap::ConnectionCheckOutFailed.new(
|
1221
|
+
@server.address,
|
1222
|
+
Monitoring::Event::Cmap::ConnectionCheckOutFailed::CONNECTION_ERROR
|
1223
|
+
),
|
1224
|
+
)
|
1225
|
+
# We're going to raise, so we need to decrement the number of
|
1226
|
+
# connection requests.
|
1227
|
+
decrement_connection_requests_and_signal
|
1228
|
+
raise Error::MissingConnection.new
|
1229
|
+
end
|
1230
|
+
end
|
1231
|
+
# We need a particular connection, and if it is not available
|
1232
|
+
# we can wait for an in-progress operation to return
|
1233
|
+
# such a connection to the pool.
|
1234
|
+
nil
|
1235
|
+
else
|
1236
|
+
connection = create_connection
|
1237
|
+
@connection_requests -= 1
|
1238
|
+
@pending_connections << connection
|
1239
|
+
return connection
|
1240
|
+
end
|
1241
|
+
end
|
1242
|
+
|
1243
|
+
# Retrieves a connection and connects it.
|
1244
|
+
#
|
1245
|
+
# @param [ Integer ] connection_global_id The global id for the
|
1246
|
+
# connection to check out.
|
1247
|
+
#
|
1248
|
+
# @return [ Mongo::Server::Connection ] The checked out connection.
|
1249
|
+
#
|
1250
|
+
# @raise [ Error::PoolClosedError ] If the pool has been closed.
|
1251
|
+
# @raise [ Timeout::Error ] If the connection pool is at maximum size
|
1252
|
+
# and remains so for longer than the wait timeout.
|
1253
|
+
def retrieve_and_connect_connection(connection_global_id)
|
1254
|
+
deadline = Utils.monotonic_time + wait_timeout
|
1255
|
+
connection = nil
|
1256
|
+
|
1257
|
+
@lock.synchronize do
|
1258
|
+
# The first gate to checking out a connection. Make sure the number of
|
1259
|
+
# unavailable connections is less than the max pool size.
|
1260
|
+
until max_size == 0 || unavailable_connections < max_size
|
1261
|
+
wait = deadline - Utils.monotonic_time
|
1262
|
+
raise_check_out_timeout!(connection_global_id) if wait <= 0
|
1263
|
+
@size_cv.wait(wait)
|
1264
|
+
raise_if_not_ready!
|
1265
|
+
end
|
1266
|
+
@connection_requests += 1
|
1267
|
+
connection = wait_for_connection(connection_global_id, deadline)
|
1268
|
+
end
|
1269
|
+
|
1270
|
+
connect_or_raise(connection) unless connection.connected?
|
1271
|
+
|
1272
|
+
@lock.synchronize do
|
1273
|
+
@checked_out_connections << connection
|
1274
|
+
if @pending_connections.include?(connection)
|
1275
|
+
@pending_connections.delete(connection)
|
1276
|
+
end
|
1277
|
+
@max_connecting_cv.signal
|
1278
|
+
# no need to signal size_cv here since the number of unavailable
|
1279
|
+
# connections is unchanged.
|
1280
|
+
end
|
1281
|
+
|
1282
|
+
connection
|
1283
|
+
end
|
1284
|
+
|
1285
|
+
# Waits for a connection to become available, or raises is no connection
|
1286
|
+
# becomes available before the timeout.
|
1287
|
+
# @param [ Integer ] connection_global_id The global id for the
|
1288
|
+
# connection to check out.
|
1289
|
+
# @param [ Float ] deadline The time at which to stop waiting.
|
1290
|
+
#
|
1291
|
+
# @return [ Mongo::Server::Connection ] The checked out connection.
|
1292
|
+
def wait_for_connection(connection_global_id, deadline)
|
1293
|
+
connection = nil
|
1294
|
+
while connection.nil?
|
1295
|
+
# The second gate to checking out a connection. Make sure 1) there
|
1296
|
+
# exists an available connection and 2) we are under max_connecting.
|
1297
|
+
until @available_connections.any? || @pending_connections.length < @max_connecting
|
1298
|
+
wait = deadline - Utils.monotonic_time
|
1299
|
+
if wait <= 0
|
1300
|
+
# We are going to raise a timeout error, so the connection
|
1301
|
+
# request is not going to be fulfilled. Decrement the counter
|
1302
|
+
# here.
|
1303
|
+
decrement_connection_requests_and_signal
|
1304
|
+
raise_check_out_timeout!(connection_global_id)
|
1305
|
+
end
|
1306
|
+
@max_connecting_cv.wait(wait)
|
1307
|
+
# We do not need to decrement the connection_requests counter
|
1308
|
+
# or signal here because the pool is not ready yet.
|
1309
|
+
raise_if_not_ready!
|
1310
|
+
end
|
1311
|
+
|
1312
|
+
connection = get_connection(Process.pid, connection_global_id)
|
1313
|
+
wait = deadline - Utils.monotonic_time
|
1314
|
+
if connection.nil? && wait <= 0
|
1315
|
+
# connection is nil here, it means that get_connection method
|
1316
|
+
# did not create a new connection; therefore, it did not decrease
|
1317
|
+
# the connection_requests counter. We need to do it here.
|
1318
|
+
decrement_connection_requests_and_signal
|
1319
|
+
raise_check_out_timeout!(connection_global_id)
|
1320
|
+
end
|
1321
|
+
end
|
1322
|
+
|
1323
|
+
connection
|
1324
|
+
end
|
1325
|
+
|
1326
|
+
# Connects a connection and raises an exception if the connection
|
1327
|
+
# cannot be connected.
|
1328
|
+
# This method also publish corresponding event and ensures that counters
|
1329
|
+
# and condition variables are updated.
|
1330
|
+
def connect_or_raise(connection)
|
1331
|
+
connect_connection(connection)
|
1332
|
+
rescue Exception
|
1333
|
+
# Handshake or authentication failed
|
1334
|
+
@lock.synchronize do
|
1335
|
+
if @pending_connections.include?(connection)
|
1336
|
+
@pending_connections.delete(connection)
|
1337
|
+
end
|
1338
|
+
@max_connecting_cv.signal
|
1339
|
+
@size_cv.signal
|
1340
|
+
end
|
1341
|
+
@populate_semaphore.signal
|
1342
|
+
publish_cmap_event(
|
1343
|
+
Monitoring::Event::Cmap::ConnectionCheckOutFailed.new(
|
1344
|
+
@server.address,
|
1345
|
+
Monitoring::Event::Cmap::ConnectionCheckOutFailed::CONNECTION_ERROR
|
1346
|
+
),
|
1347
|
+
)
|
1348
|
+
raise
|
1349
|
+
end
|
1350
|
+
|
1351
|
+
|
1352
|
+
# Decrement connection requests counter and signal the condition
|
1353
|
+
# variables that the number of unavailable connections has decreased.
|
1354
|
+
def decrement_connection_requests_and_signal
|
1355
|
+
@connection_requests -= 1
|
1356
|
+
@max_connecting_cv.signal
|
1357
|
+
@size_cv.signal
|
1358
|
+
end
|
870
1359
|
end
|
871
1360
|
end
|
872
1361
|
end
|