mongo 2.13.1 → 2.19.1
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 +36 -39
- data/Rakefile +49 -20
- data/bin/mongo_console +2 -0
- data/lib/mongo/active_support.rb +3 -0
- data/lib/mongo/address/ipv4.rb +4 -1
- data/lib/mongo/address/ipv6.rb +4 -1
- data/lib/mongo/address/unix.rb +3 -0
- data/lib/mongo/address/validator.rb +3 -0
- data/lib/mongo/address.rb +4 -1
- data/lib/mongo/auth/aws/conversation.rb +4 -8
- data/lib/mongo/auth/aws/credentials.rb +38 -0
- data/lib/mongo/auth/aws/credentials_cache.rb +75 -0
- data/lib/mongo/auth/aws/credentials_retriever.rb +174 -36
- data/lib/mongo/auth/aws/request.rb +3 -2
- data/lib/mongo/auth/aws.rb +8 -5
- data/lib/mongo/auth/base.rb +25 -9
- data/lib/mongo/auth/conversation_base.rb +35 -0
- data/lib/mongo/auth/cr/conversation.rb +9 -29
- data/lib/mongo/auth/cr.rb +3 -0
- data/lib/mongo/auth/credential_cache.rb +3 -0
- data/lib/mongo/auth/gssapi/conversation.rb +7 -15
- data/lib/mongo/auth/gssapi.rb +3 -0
- data/lib/mongo/auth/ldap/conversation.rb +6 -14
- data/lib/mongo/auth/ldap.rb +3 -0
- data/lib/mongo/auth/roles.rb +19 -16
- data/lib/mongo/auth/sasl_conversation_base.rb +4 -13
- data/lib/mongo/auth/scram/conversation.rb +3 -0
- data/lib/mongo/auth/scram.rb +5 -2
- data/lib/mongo/auth/scram256/conversation.rb +3 -0
- data/lib/mongo/auth/scram256.rb +3 -0
- data/lib/mongo/auth/scram_conversation_base.rb +10 -34
- data/lib/mongo/auth/stringprep/profiles/sasl.rb +3 -0
- data/lib/mongo/auth/stringprep/tables.rb +3 -0
- data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +2 -2
- data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +2 -1
- data/lib/mongo/auth/stringprep.rb +4 -1
- data/lib/mongo/auth/user/view.rb +19 -9
- data/lib/mongo/auth/user.rb +3 -0
- data/lib/mongo/auth/x509/conversation.rb +7 -25
- data/lib/mongo/auth/x509.rb +3 -0
- data/lib/mongo/auth.rb +16 -2
- data/lib/mongo/background_thread.rb +16 -2
- data/lib/mongo/bson.rb +3 -0
- data/lib/mongo/bulk_write/combineable.rb +3 -0
- data/lib/mongo/bulk_write/ordered_combiner.rb +3 -0
- data/lib/mongo/bulk_write/result.rb +13 -1
- data/lib/mongo/bulk_write/result_combiner.rb +5 -4
- data/lib/mongo/bulk_write/transformable.rb +3 -0
- data/lib/mongo/bulk_write/unordered_combiner.rb +3 -0
- data/lib/mongo/bulk_write/validatable.rb +3 -0
- data/lib/mongo/bulk_write.rb +156 -45
- data/lib/mongo/caching_cursor.rb +77 -0
- data/lib/mongo/client.rb +367 -41
- data/lib/mongo/client_encryption.rb +217 -10
- data/lib/mongo/cluster/periodic_executor.rb +7 -3
- data/lib/mongo/cluster/reapers/cursor_reaper.rb +101 -43
- data/lib/mongo/cluster/reapers/socket_reaper.rb +4 -1
- data/lib/mongo/cluster/sdam_flow.rb +67 -17
- data/lib/mongo/cluster/topology/base.rb +16 -9
- data/lib/mongo/cluster/topology/load_balanced.rb +102 -0
- data/lib/mongo/cluster/topology/no_replica_set_options.rb +3 -0
- data/lib/mongo/cluster/topology/replica_set_no_primary.rb +3 -0
- data/lib/mongo/cluster/topology/replica_set_with_primary.rb +3 -0
- data/lib/mongo/cluster/topology/sharded.rb +3 -0
- data/lib/mongo/cluster/topology/single.rb +4 -1
- data/lib/mongo/cluster/topology/unknown.rb +3 -0
- data/lib/mongo/cluster/topology.rb +31 -8
- data/lib/mongo/cluster.rb +210 -116
- data/lib/mongo/cluster_time.rb +3 -0
- data/lib/mongo/collection/helpers.rb +43 -0
- data/lib/mongo/collection/queryable_encryption.rb +162 -0
- data/lib/mongo/collection/view/aggregation.rb +94 -24
- data/lib/mongo/collection/view/builder/aggregation.rb +19 -17
- data/lib/mongo/collection/view/builder/map_reduce.rb +18 -49
- data/lib/mongo/collection/view/builder.rb +3 -4
- data/lib/mongo/collection/view/change_stream/retryable.rb +3 -0
- data/lib/mongo/collection/view/change_stream.rb +71 -22
- data/lib/mongo/collection/view/explainable.rb +30 -8
- data/lib/mongo/collection/view/immutable.rb +3 -0
- data/lib/mongo/collection/view/iterable.rb +121 -24
- data/lib/mongo/collection/view/map_reduce.rb +76 -25
- data/lib/mongo/collection/view/readable.rb +147 -67
- data/lib/mongo/collection/view/writable.rb +296 -162
- data/lib/mongo/collection/view.rb +42 -41
- data/lib/mongo/collection.rb +356 -89
- 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 +3 -0
- data/lib/mongo/crypt/auto_encrypter.rb +142 -15
- data/lib/mongo/crypt/auto_encryption_context.rb +3 -0
- data/lib/mongo/crypt/binary.rb +3 -0
- data/lib/mongo/crypt/binding.rb +717 -151
- data/lib/mongo/crypt/context.rb +74 -5
- data/lib/mongo/crypt/data_key_context.rb +15 -104
- data/lib/mongo/crypt/encryption_io.rb +101 -64
- data/lib/mongo/crypt/explicit_decryption_context.rb +3 -0
- data/lib/mongo/crypt/explicit_encrypter.rb +235 -29
- data/lib/mongo/crypt/explicit_encryption_context.rb +78 -21
- data/lib/mongo/crypt/explicit_encryption_expression_context.rb +30 -0
- data/lib/mongo/crypt/handle.rb +171 -86
- data/lib/mongo/crypt/hooks.rb +28 -2
- 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 +3 -0
- 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 +11 -2
- data/lib/mongo/crypt.rb +18 -0
- data/lib/mongo/cursor/kill_spec.rb +76 -0
- data/lib/mongo/cursor.rb +150 -43
- data/lib/mongo/database/view.rb +55 -10
- data/lib/mongo/database.rb +95 -25
- data/lib/mongo/dbref.rb +4 -105
- data/lib/mongo/distinguishing_semaphore.rb +4 -1
- data/lib/mongo/error/auth_error.rb +3 -0
- data/lib/mongo/error/bad_load_balancer_target.rb +26 -0
- data/lib/mongo/error/bulk_write_error.rb +49 -5
- data/lib/mongo/error/change_stream_resumable.rb +3 -0
- data/lib/mongo/error/client_closed.rb +24 -0
- data/lib/mongo/error/closed_stream.rb +3 -0
- data/lib/mongo/error/connection_check_out_timeout.rb +3 -0
- data/lib/mongo/error/connection_perished.rb +5 -0
- data/lib/mongo/error/connection_unavailable.rb +27 -0
- data/lib/mongo/error/credential_check_error.rb +3 -0
- data/lib/mongo/error/crypt_error.rb +3 -0
- data/lib/mongo/error/extra_file_chunk.rb +3 -0
- data/lib/mongo/error/failed_string_prep_validation.rb +3 -0
- data/lib/mongo/error/file_not_found.rb +3 -0
- data/lib/mongo/error/handshake_error.rb +3 -0
- data/lib/mongo/error/insufficient_iteration_count.rb +3 -0
- data/lib/mongo/error/internal_driver_error.rb +25 -0
- data/lib/mongo/error/invalid_address.rb +3 -0
- data/lib/mongo/error/invalid_application_name.rb +3 -0
- data/lib/mongo/error/invalid_bulk_operation.rb +3 -0
- data/lib/mongo/error/invalid_bulk_operation_type.rb +3 -0
- data/lib/mongo/error/invalid_collection_name.rb +3 -0
- data/lib/mongo/error/invalid_config_option.rb +21 -0
- data/lib/mongo/error/invalid_cursor_operation.rb +3 -0
- data/lib/mongo/error/invalid_database_name.rb +3 -0
- data/lib/mongo/error/invalid_document.rb +3 -0
- data/lib/mongo/error/invalid_file.rb +3 -0
- data/lib/mongo/error/invalid_file_revision.rb +3 -0
- data/lib/mongo/error/invalid_max_connecting.rb +28 -0
- data/lib/mongo/error/invalid_min_pool_size.rb +3 -0
- data/lib/mongo/error/invalid_nonce.rb +3 -0
- data/lib/mongo/error/invalid_read_concern.rb +31 -0
- data/lib/mongo/error/invalid_read_option.rb +4 -1
- data/lib/mongo/error/invalid_replacement_document.rb +30 -9
- data/lib/mongo/error/invalid_server_auth_host.rb +3 -0
- data/lib/mongo/error/invalid_server_auth_response.rb +3 -0
- data/lib/mongo/error/invalid_server_preference.rb +3 -0
- data/lib/mongo/error/invalid_session.rb +3 -0
- data/lib/mongo/error/invalid_signature.rb +3 -0
- data/lib/mongo/error/invalid_transaction_operation.rb +3 -0
- data/lib/mongo/error/invalid_txt_record.rb +3 -0
- data/lib/mongo/error/invalid_update_document.rb +30 -7
- data/lib/mongo/error/invalid_uri.rb +3 -0
- data/lib/mongo/error/invalid_write_concern.rb +3 -0
- data/lib/mongo/error/kms_error.rb +3 -0
- data/lib/mongo/error/labelable.rb +72 -0
- data/lib/mongo/error/lint_error.rb +3 -0
- data/lib/mongo/error/max_bson_size.rb +3 -0
- data/lib/mongo/error/max_message_size.rb +3 -0
- data/lib/mongo/error/mismatched_domain.rb +3 -0
- data/lib/mongo/error/missing_connection.rb +27 -0
- data/lib/mongo/error/missing_file_chunk.rb +11 -2
- data/lib/mongo/error/missing_password.rb +3 -0
- data/lib/mongo/error/missing_resume_token.rb +3 -0
- data/lib/mongo/error/missing_scram_server_signature.rb +3 -0
- data/lib/mongo/error/missing_service_id.rb +26 -0
- data/lib/mongo/error/mongocryptd_spawn_error.rb +3 -0
- data/lib/mongo/error/multi_index_drop.rb +3 -0
- data/lib/mongo/error/need_primary_server.rb +3 -0
- data/lib/mongo/error/no_server_available.rb +3 -0
- data/lib/mongo/error/no_service_connection_available.rb +49 -0
- data/lib/mongo/error/no_srv_records.rb +3 -0
- data/lib/mongo/error/notable.rb +24 -0
- data/lib/mongo/error/operation_failure.rb +57 -87
- data/lib/mongo/error/parser.rb +69 -13
- data/lib/mongo/error/pool_cleared_error.rb +40 -0
- data/lib/mongo/error/pool_closed_error.rb +6 -16
- data/lib/mongo/error/pool_error.rb +45 -0
- data/lib/mongo/error/pool_paused_error.rb +40 -0
- data/lib/mongo/error/raise_original_error.rb +3 -0
- data/lib/mongo/error/read_write_retryable.rb +108 -0
- data/lib/mongo/error/sdam_error_detection.rb +16 -5
- data/lib/mongo/error/server_api_conflict.rb +26 -0
- data/lib/mongo/error/server_api_not_supported.rb +27 -0
- data/lib/mongo/error/server_certificate_revoked.rb +25 -0
- data/lib/mongo/error/server_not_usable.rb +36 -0
- data/lib/mongo/error/session_ended.rb +3 -0
- data/lib/mongo/error/session_not_materialized.rb +29 -0
- data/lib/mongo/error/sessions_not_supported.rb +3 -0
- data/lib/mongo/error/snapshot_session_invalid_server_version.rb +31 -0
- data/lib/mongo/error/snapshot_session_transaction_prohibited.rb +30 -0
- data/lib/mongo/error/socket_error.rb +3 -0
- data/lib/mongo/error/socket_timeout_error.rb +3 -0
- data/lib/mongo/error/unchangeable_collection_option.rb +3 -0
- data/lib/mongo/error/unexpected_chunk_length.rb +3 -0
- data/lib/mongo/error/unexpected_response.rb +3 -0
- data/lib/mongo/error/unknown_payload_type.rb +3 -0
- data/lib/mongo/error/unmet_dependency.rb +24 -0
- data/lib/mongo/error/unsupported_array_filters.rb +3 -0
- data/lib/mongo/error/unsupported_collation.rb +3 -0
- data/lib/mongo/error/unsupported_features.rb +3 -0
- data/lib/mongo/error/unsupported_message_type.rb +3 -0
- data/lib/mongo/error/unsupported_option.rb +17 -12
- data/lib/mongo/error/write_retryable.rb +3 -0
- data/lib/mongo/error.rb +31 -38
- data/lib/mongo/event/base.rb +3 -0
- data/lib/mongo/event/listeners.rb +3 -0
- data/lib/mongo/event/publisher.rb +3 -0
- data/lib/mongo/event/subscriber.rb +3 -0
- data/lib/mongo/event.rb +3 -0
- data/lib/mongo/grid/file/chunk.rb +6 -2
- data/lib/mongo/grid/file/info.rb +5 -1
- data/lib/mongo/grid/file.rb +3 -0
- data/lib/mongo/grid/fs_bucket.rb +86 -46
- data/lib/mongo/grid/stream/read.rb +28 -7
- data/lib/mongo/grid/stream/write.rb +3 -0
- data/lib/mongo/grid/stream.rb +3 -0
- data/lib/mongo/grid.rb +3 -0
- data/lib/mongo/id.rb +10 -5
- data/lib/mongo/index/view.rb +68 -58
- data/lib/mongo/index.rb +3 -0
- data/lib/mongo/lint.rb +5 -1
- data/lib/mongo/loggable.rb +5 -2
- data/lib/mongo/logger.rb +6 -3
- data/lib/mongo/monitoring/cmap_log_subscriber.rb +3 -0
- data/lib/mongo/monitoring/command_log_subscriber.rb +3 -0
- data/lib/mongo/monitoring/event/cmap/base.rb +3 -0
- data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +3 -0
- data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +3 -0
- data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +3 -0
- data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +3 -0
- data/lib/mongo/monitoring/event/cmap/connection_closed.rb +3 -0
- data/lib/mongo/monitoring/event/cmap/connection_created.rb +3 -0
- data/lib/mongo/monitoring/event/cmap/connection_ready.rb +3 -0
- data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +17 -4
- data/lib/mongo/monitoring/event/cmap/pool_closed.rb +3 -0
- data/lib/mongo/monitoring/event/cmap/pool_created.rb +3 -0
- data/lib/mongo/monitoring/event/cmap/pool_ready.rb +67 -0
- data/lib/mongo/monitoring/event/cmap.rb +4 -0
- data/lib/mongo/monitoring/event/command_failed.rb +38 -5
- data/lib/mongo/monitoring/event/command_started.rb +23 -3
- data/lib/mongo/monitoring/event/command_succeeded.rb +36 -3
- data/lib/mongo/monitoring/event/secure.rb +39 -5
- data/lib/mongo/monitoring/event/server_closed.rb +3 -0
- data/lib/mongo/monitoring/event/server_description_changed.rb +4 -1
- data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +32 -18
- data/lib/mongo/monitoring/event/server_heartbeat_started.rb +3 -0
- data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +30 -16
- data/lib/mongo/monitoring/event/server_opening.rb +3 -0
- data/lib/mongo/monitoring/event/topology_changed.rb +3 -0
- data/lib/mongo/monitoring/event/topology_closed.rb +3 -0
- data/lib/mongo/monitoring/event/topology_opening.rb +3 -0
- data/lib/mongo/monitoring/event.rb +3 -0
- data/lib/mongo/monitoring/publishable.rb +38 -12
- data/lib/mongo/monitoring/sdam_log_subscriber.rb +3 -0
- data/lib/mongo/monitoring/server_closed_log_subscriber.rb +3 -0
- data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +3 -0
- data/lib/mongo/monitoring/server_opening_log_subscriber.rb +3 -0
- data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +3 -0
- data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +3 -0
- data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +3 -0
- data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +3 -0
- data/lib/mongo/monitoring.rb +20 -8
- data/lib/mongo/operation/aggregate/op_msg.rb +3 -0
- data/lib/mongo/operation/aggregate/result.rb +12 -8
- data/lib/mongo/operation/aggregate.rb +4 -2
- data/lib/mongo/operation/collections_info/result.rb +24 -1
- data/lib/mongo/operation/collections_info.rb +10 -2
- data/lib/mongo/operation/command/op_msg.rb +9 -0
- data/lib/mongo/operation/command.rb +4 -2
- data/lib/mongo/operation/context.rb +138 -0
- data/lib/mongo/operation/count/op_msg.rb +12 -0
- data/lib/mongo/operation/count.rb +4 -2
- data/lib/mongo/operation/create/op_msg.rb +13 -0
- data/lib/mongo/operation/create.rb +4 -2
- data/lib/mongo/operation/create_index/op_msg.rb +21 -4
- data/lib/mongo/operation/create_index.rb +4 -2
- data/lib/mongo/operation/create_user/op_msg.rb +3 -0
- data/lib/mongo/operation/create_user.rb +4 -2
- data/lib/mongo/operation/delete/bulk_result.rb +5 -0
- data/lib/mongo/operation/delete/op_msg.rb +13 -1
- data/lib/mongo/operation/delete/result.rb +6 -0
- data/lib/mongo/operation/delete.rb +3 -2
- data/lib/mongo/operation/distinct/op_msg.rb +13 -0
- data/lib/mongo/operation/distinct.rb +4 -2
- data/lib/mongo/operation/drop/op_msg.rb +3 -0
- data/lib/mongo/operation/drop.rb +4 -2
- data/lib/mongo/operation/drop_database/op_msg.rb +3 -0
- data/lib/mongo/operation/drop_database.rb +4 -2
- data/lib/mongo/operation/drop_index/op_msg.rb +8 -1
- data/lib/mongo/operation/drop_index.rb +4 -2
- data/lib/mongo/operation/explain/op_msg.rb +17 -0
- data/lib/mongo/operation/explain/result.rb +6 -0
- data/lib/mongo/operation/explain.rb +4 -3
- data/lib/mongo/operation/find/builder/command.rb +111 -0
- data/lib/mongo/operation/find/builder/flags.rb +61 -0
- data/lib/mongo/operation/find/builder/modifiers.rb +89 -0
- data/lib/mongo/operation/find/builder.rb +20 -0
- data/lib/mongo/operation/find/op_msg.rb +15 -0
- data/lib/mongo/operation/find/result.rb +16 -0
- data/lib/mongo/operation/find.rb +5 -3
- data/lib/mongo/operation/get_more/command_builder.rb +42 -0
- data/lib/mongo/operation/get_more/op_msg.rb +4 -0
- data/lib/mongo/operation/get_more/result.rb +6 -0
- data/lib/mongo/operation/get_more.rb +5 -3
- data/lib/mongo/operation/indexes/op_msg.rb +3 -0
- data/lib/mongo/operation/indexes/result.rb +8 -0
- data/lib/mongo/operation/indexes.rb +4 -3
- data/lib/mongo/operation/insert/bulk_result.rb +13 -1
- data/lib/mongo/operation/insert/op_msg.rb +11 -5
- data/lib/mongo/operation/insert/result.rb +14 -3
- data/lib/mongo/operation/insert.rb +3 -2
- data/lib/mongo/operation/kill_cursors/command_builder.rb +35 -0
- data/lib/mongo/operation/kill_cursors/op_msg.rb +13 -0
- data/lib/mongo/operation/kill_cursors.rb +5 -3
- data/lib/mongo/operation/list_collections/op_msg.rb +7 -1
- data/lib/mongo/operation/list_collections/result.rb +12 -1
- data/lib/mongo/operation/list_collections.rb +4 -2
- data/lib/mongo/operation/map_reduce/op_msg.rb +4 -1
- data/lib/mongo/operation/map_reduce/result.rb +29 -0
- data/lib/mongo/operation/map_reduce.rb +4 -2
- data/lib/mongo/operation/op_msg_base.rb +3 -0
- data/lib/mongo/operation/parallel_scan/op_msg.rb +3 -0
- data/lib/mongo/operation/parallel_scan/result.rb +7 -0
- data/lib/mongo/operation/parallel_scan.rb +4 -2
- data/lib/mongo/operation/remove_user/op_msg.rb +3 -0
- data/lib/mongo/operation/remove_user.rb +4 -2
- data/lib/mongo/operation/result.rb +67 -11
- data/lib/mongo/operation/shared/bypass_document_validation.rb +4 -0
- data/lib/mongo/operation/shared/causal_consistency_supported.rb +4 -0
- data/lib/mongo/operation/shared/executable.rb +61 -17
- data/lib/mongo/operation/shared/executable_no_validate.rb +5 -2
- data/lib/mongo/operation/shared/executable_transaction_label.rb +3 -0
- data/lib/mongo/operation/shared/idable.rb +5 -1
- data/lib/mongo/operation/shared/limited.rb +4 -0
- data/lib/mongo/operation/shared/object_id_generator.rb +4 -0
- data/lib/mongo/operation/shared/op_msg_executable.rb +59 -0
- data/lib/mongo/operation/shared/polymorphic_lookup.rb +3 -0
- data/lib/mongo/operation/shared/polymorphic_result.rb +3 -0
- data/lib/mongo/operation/shared/read_preference_supported.rb +44 -37
- data/lib/mongo/operation/shared/response_handling.rb +32 -27
- data/lib/mongo/operation/shared/result/aggregatable.rb +4 -0
- data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +3 -0
- data/lib/mongo/operation/shared/sessions_supported.rb +55 -20
- data/lib/mongo/operation/shared/specifiable.rb +15 -29
- data/lib/mongo/operation/shared/validatable.rb +87 -0
- data/lib/mongo/operation/shared/write.rb +28 -28
- data/lib/mongo/operation/shared/write_concern_supported.rb +4 -0
- data/lib/mongo/operation/update/bulk_result.rb +3 -0
- data/lib/mongo/operation/update/op_msg.rb +12 -4
- data/lib/mongo/operation/update/result.rb +11 -0
- data/lib/mongo/operation/update.rb +3 -2
- data/lib/mongo/operation/update_user/op_msg.rb +3 -0
- data/lib/mongo/operation/update_user.rb +4 -2
- data/lib/mongo/operation/users_info/op_msg.rb +3 -0
- data/lib/mongo/operation/users_info/result.rb +6 -0
- data/lib/mongo/operation/users_info.rb +4 -2
- data/lib/mongo/operation/write_command/op_msg.rb +43 -0
- data/lib/mongo/operation/write_command.rb +31 -0
- data/lib/mongo/operation.rb +17 -4
- data/lib/mongo/options/mapper.rb +3 -0
- data/lib/mongo/options/redacted.rb +3 -0
- data/lib/mongo/options.rb +3 -0
- data/lib/mongo/protocol/bit_vector.rb +6 -1
- data/lib/mongo/protocol/caching_hash.rb +52 -0
- data/lib/mongo/protocol/compressed.rb +54 -5
- data/lib/mongo/protocol/get_more.rb +3 -0
- data/lib/mongo/protocol/kill_cursors.rb +3 -0
- data/lib/mongo/protocol/message.rb +27 -10
- data/lib/mongo/protocol/msg.rb +61 -17
- data/lib/mongo/protocol/query.rb +53 -32
- data/lib/mongo/protocol/registry.rb +3 -0
- data/lib/mongo/protocol/reply.rb +3 -0
- data/lib/mongo/protocol/serializers.rb +27 -17
- data/lib/mongo/protocol.rb +4 -3
- data/lib/mongo/query_cache.rb +300 -0
- data/lib/mongo/retryable/base_worker.rb +91 -0
- data/lib/mongo/retryable/read_worker.rb +296 -0
- data/lib/mongo/retryable/write_worker.rb +364 -0
- data/lib/mongo/retryable.rb +33 -446
- data/lib/mongo/semaphore.rb +4 -1
- data/lib/mongo/server/app_metadata/environment.rb +259 -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 +117 -94
- data/lib/mongo/server/connection.rb +126 -22
- data/lib/mongo/server/connection_base.rb +49 -21
- data/lib/mongo/server/connection_common.rb +76 -3
- data/lib/mongo/server/connection_pool/generation_manager.rb +115 -0
- data/lib/mongo/server/connection_pool/populator.rb +35 -30
- data/lib/mongo/server/connection_pool.rb +776 -206
- data/lib/mongo/server/description/features.rb +34 -25
- data/lib/mongo/server/description/load_balancer.rb +33 -0
- data/lib/mongo/server/description.rb +126 -17
- data/lib/mongo/server/monitor/app_metadata.rb +4 -1
- data/lib/mongo/server/monitor/connection.rb +66 -50
- data/lib/mongo/server/monitor.rb +62 -32
- data/lib/mongo/server/pending_connection.rb +77 -44
- data/lib/mongo/server/push_monitor/connection.rb +3 -0
- data/lib/mongo/server/push_monitor.rb +54 -20
- data/lib/mongo/server/round_trip_time_averager.rb +6 -3
- data/lib/mongo/server.rb +197 -67
- data/lib/mongo/server_selector/base.rb +65 -11
- data/lib/mongo/server_selector/nearest.rb +6 -4
- data/lib/mongo/server_selector/primary.rb +6 -4
- data/lib/mongo/server_selector/primary_preferred.rb +6 -4
- data/lib/mongo/server_selector/secondary.rb +6 -4
- data/lib/mongo/server_selector/secondary_preferred.rb +8 -11
- data/lib/mongo/server_selector.rb +3 -0
- data/lib/mongo/session/server_session.rb +3 -0
- data/lib/mongo/session/session_pool.rb +26 -2
- data/lib/mongo/session.rb +164 -38
- data/lib/mongo/socket/ocsp_cache.rb +99 -0
- data/lib/mongo/socket/ocsp_verifier.rb +344 -0
- data/lib/mongo/socket/ssl.rb +56 -24
- data/lib/mongo/socket/tcp.rb +6 -0
- data/lib/mongo/socket/unix.rb +3 -0
- data/lib/mongo/socket.rb +71 -16
- data/lib/mongo/srv/monitor.rb +10 -26
- data/lib/mongo/srv/resolver.rb +41 -13
- data/lib/mongo/srv/result.rb +3 -0
- data/lib/mongo/srv.rb +3 -0
- data/lib/mongo/timeout.rb +6 -1
- data/lib/mongo/topology_version.rb +4 -1
- data/lib/mongo/uri/options_mapper.rb +867 -0
- data/lib/mongo/uri/srv_protocol.rb +13 -11
- data/lib/mongo/uri.rb +100 -400
- data/lib/mongo/utils.rb +44 -1
- data/lib/mongo/version.rb +4 -1
- data/lib/mongo/write_concern/acknowledged.rb +3 -0
- data/lib/mongo/write_concern/base.rb +3 -0
- data/lib/mongo/write_concern/unacknowledged.rb +3 -0
- data/lib/mongo/write_concern.rb +3 -0
- data/lib/mongo.rb +58 -0
- data/mongo.gemspec +16 -7
- data/spec/NOTES.aws-auth.md +12 -7
- data/spec/README.md +106 -3
- data/spec/atlas/atlas_connectivity_spec.rb +3 -0
- data/spec/atlas/operations_spec.rb +5 -7
- data/spec/integration/auth_spec.rb +58 -15
- data/spec/integration/awaited_ismaster_spec.rb +9 -6
- data/spec/integration/aws_auth_credentials_cache_spec.rb +51 -0
- data/spec/integration/aws_auth_request_spec.rb +4 -1
- data/spec/integration/aws_credentials_retriever_spec.rb +34 -1
- data/spec/integration/aws_lambda_examples_spec.rb +68 -0
- data/spec/integration/bson_symbol_spec.rb +8 -3
- data/spec/integration/bulk_insert_spec.rb +3 -0
- data/spec/integration/bulk_write_error_message_spec.rb +74 -0
- data/spec/integration/bulk_write_spec.rb +67 -0
- data/spec/integration/change_stream_examples_spec.rb +3 -0
- data/spec/integration/change_stream_spec.rb +18 -9
- data/spec/integration/check_clean_slate_spec.rb +3 -0
- data/spec/integration/client_authentication_options_spec.rb +76 -36
- data/spec/integration/client_connectivity_spec.rb +4 -1
- data/spec/integration/client_construction_aws_auth_spec.rb +14 -2
- data/spec/integration/client_construction_spec.rb +153 -8
- data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +13 -10
- data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +172 -169
- data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +3 -1
- data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +3 -0
- data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +43 -4
- data/spec/integration/client_side_encryption/auto_encryption_spec.rb +148 -2
- 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 +6 -3
- data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +6 -3
- data/spec/integration/client_side_encryption/client_close_spec.rb +4 -1
- data/spec/integration/client_side_encryption/corpus_spec.rb +67 -35
- data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +42 -42
- data/spec/integration/client_side_encryption/data_key_spec.rb +101 -8
- data/spec/integration/client_side_encryption/decryption_events_prose_spec.rb +159 -0
- data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +62 -0
- data/spec/integration/client_side_encryption/explicit_queryable_encryption_spec.rb +150 -0
- data/spec/integration/client_side_encryption/external_key_vault_spec.rb +9 -6
- 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 +4 -1
- data/spec/integration/client_spec.rb +14 -4
- data/spec/integration/client_update_spec.rb +9 -2
- data/spec/integration/collection_indexes_prose_spec.rb +3 -0
- data/spec/integration/command_monitoring_spec.rb +64 -26
- data/spec/integration/command_spec.rb +5 -24
- data/spec/integration/connect_single_rs_name_spec.rb +6 -3
- data/spec/integration/connection/faas_env_spec.rb +62 -0
- data/spec/integration/connection_pool_populator_spec.rb +33 -8
- data/spec/integration/connection_spec.rb +58 -36
- data/spec/integration/crud_spec.rb +217 -1
- data/spec/integration/cursor_pinning_spec.rb +125 -0
- data/spec/integration/cursor_reaping_spec.rb +62 -19
- data/spec/integration/docs_examples_spec.rb +12 -2
- data/spec/integration/error_detection_spec.rb +3 -0
- data/spec/integration/fork_reconnect_spec.rb +73 -9
- data/spec/integration/get_more_spec.rb +4 -1
- data/spec/integration/grid_fs_bucket_spec.rb +7 -4
- data/spec/integration/heartbeat_events_spec.rb +8 -5
- data/spec/integration/map_reduce_spec.rb +81 -0
- data/spec/integration/mmapv1_spec.rb +3 -0
- data/spec/integration/mongos_pinning_spec.rb +3 -0
- data/spec/integration/ocsp_connectivity_spec.rb +29 -0
- data/spec/integration/ocsp_verifier_cache_spec.rb +191 -0
- data/spec/integration/ocsp_verifier_spec.rb +358 -0
- data/spec/integration/operation_failure_code_spec.rb +4 -1
- data/spec/integration/operation_failure_message_spec.rb +91 -0
- data/spec/integration/query_cache_spec.rb +1343 -0
- data/spec/integration/query_cache_transactions_spec.rb +193 -0
- data/spec/integration/read_concern_spec.rb +4 -1
- data/spec/integration/read_preference_spec.rb +20 -13
- data/spec/integration/reconnect_spec.rb +39 -13
- data/spec/integration/retryable_errors_spec.rb +4 -1
- data/spec/integration/retryable_reads_errors_spec.rb +110 -0
- data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +5 -2
- data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +5 -1
- data/spec/integration/retryable_writes/shared/adds_diagnostics.rb +3 -0
- data/spec/integration/retryable_writes/shared/does_not_support_retries.rb +3 -0
- data/spec/integration/retryable_writes/shared/only_supports_legacy_retries.rb +3 -0
- data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +5 -0
- data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +3 -0
- data/spec/integration/retryable_writes/shared/performs_no_retries.rb +3 -0
- data/spec/integration/retryable_writes/shared/supports_legacy_retries.rb +3 -0
- data/spec/integration/retryable_writes/shared/supports_modern_retries.rb +3 -0
- data/spec/integration/retryable_writes/shared/supports_retries.rb +3 -0
- data/spec/integration/retryable_writes_errors_spec.rb +162 -1
- data/spec/integration/sdam_error_handling_spec.rb +159 -8
- data/spec/integration/sdam_events_spec.rb +94 -31
- data/spec/integration/sdam_prose_spec.rb +7 -4
- data/spec/integration/secondary_reads_spec.rb +103 -0
- data/spec/integration/server_description_spec.rb +3 -0
- data/spec/integration/server_monitor_spec.rb +7 -2
- data/spec/integration/server_selection_spec.rb +39 -0
- data/spec/integration/server_selector_spec.rb +29 -7
- data/spec/integration/server_spec.rb +27 -25
- data/spec/integration/shell_examples_spec.rb +3 -0
- data/spec/integration/size_limit_spec.rb +7 -1
- data/spec/integration/snappy_compression_spec.rb +28 -0
- data/spec/integration/snapshot_query_examples_spec.rb +129 -0
- data/spec/integration/srv_monitoring_spec.rb +82 -5
- data/spec/integration/srv_spec.rb +60 -0
- data/spec/integration/ssl_uri_options_spec.rb +3 -0
- data/spec/integration/step_down_spec.rb +28 -7
- data/spec/integration/time_zone_querying_spec.rb +3 -0
- data/spec/integration/transaction_pinning_spec.rb +134 -0
- data/spec/integration/transactions_api_examples_spec.rb +3 -0
- data/spec/integration/transactions_examples_spec.rb +26 -7
- data/spec/integration/truncated_utf8_spec.rb +26 -0
- data/spec/integration/versioned_api_examples_spec.rb +120 -0
- data/spec/integration/x509_auth_spec.rb +5 -2
- data/spec/integration/zlib_compression_spec.rb +4 -1
- data/spec/integration/zstd_compression_spec.rb +29 -0
- data/spec/kerberos/kerberos_spec.rb +3 -0
- data/spec/lite_spec_helper.rb +59 -16
- data/spec/mongo/address/ipv4_spec.rb +3 -0
- data/spec/mongo/address/ipv6_spec.rb +10 -0
- data/spec/mongo/address/unix_spec.rb +4 -0
- data/spec/mongo/address/validator_spec.rb +3 -0
- data/spec/mongo/address_spec.rb +33 -13
- 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 +3 -0
- data/spec/mongo/auth/aws/request_spec.rb +3 -0
- data/spec/mongo/auth/cr_spec.rb +6 -24
- data/spec/mongo/auth/gssapi/conversation_spec.rb +3 -0
- data/spec/mongo/auth/invalid_mechanism_spec.rb +3 -0
- data/spec/mongo/auth/ldap/conversation_spec.rb +4 -1
- data/spec/mongo/auth/ldap_spec.rb +10 -4
- data/spec/mongo/auth/scram/conversation_spec.rb +26 -23
- data/spec/mongo/auth/scram256/conversation_spec.rb +23 -20
- data/spec/mongo/auth/scram_negotiation_spec.rb +5 -1
- data/spec/mongo/auth/scram_spec.rb +5 -3
- data/spec/mongo/auth/stringprep/profiles/sasl_spec.rb +3 -0
- data/spec/mongo/auth/stringprep_spec.rb +3 -0
- data/spec/mongo/auth/user/view_spec.rb +99 -1
- data/spec/mongo/auth/user_spec.rb +4 -1
- data/spec/mongo/auth/x509/conversation_spec.rb +6 -3
- data/spec/mongo/auth/x509_spec.rb +5 -3
- data/spec/mongo/auth_spec.rb +3 -0
- data/spec/mongo/bson_spec.rb +3 -0
- data/spec/mongo/bulk_write/ordered_combiner_spec.rb +3 -0
- data/spec/mongo/bulk_write/result_spec.rb +18 -1
- data/spec/mongo/bulk_write/unordered_combiner_spec.rb +3 -0
- data/spec/mongo/bulk_write_spec.rb +149 -25
- data/spec/mongo/caching_cursor_spec.rb +73 -0
- data/spec/mongo/client_construction_spec.rb +1112 -546
- data/spec/mongo/client_encryption_spec.rb +27 -30
- data/spec/mongo/client_spec.rb +445 -139
- data/spec/mongo/cluster/cursor_reaper_spec.rb +66 -23
- data/spec/mongo/cluster/periodic_executor_spec.rb +6 -1
- data/spec/mongo/cluster/socket_reaper_spec.rb +3 -0
- data/spec/mongo/cluster/topology/replica_set_spec.rb +13 -10
- data/spec/mongo/cluster/topology/sharded_spec.rb +6 -3
- data/spec/mongo/cluster/topology/single_spec.rb +20 -8
- data/spec/mongo/cluster/topology/unknown_spec.rb +4 -1
- data/spec/mongo/cluster/topology_spec.rb +4 -1
- data/spec/mongo/cluster_spec.rb +183 -192
- data/spec/mongo/cluster_time_spec.rb +3 -0
- data/spec/mongo/collection/view/aggregation_spec.rb +181 -83
- data/spec/mongo/collection/view/builder/find_command_spec.rb +7 -0
- data/spec/mongo/collection/view/builder/op_query_spec.rb +7 -0
- data/spec/mongo/collection/view/change_stream_resume_spec.rb +8 -3
- data/spec/mongo/collection/view/change_stream_spec.rb +18 -2
- data/spec/mongo/collection/view/explainable_spec.rb +90 -4
- data/spec/mongo/collection/view/immutable_spec.rb +3 -0
- data/spec/mongo/collection/view/iterable_spec.rb +3 -0
- data/spec/mongo/collection/view/map_reduce_spec.rb +46 -2
- data/spec/mongo/collection/view/readable_spec.rb +868 -1
- data/spec/mongo/collection/view/writable_spec.rb +147 -32
- data/spec/mongo/collection/view_spec.rb +3 -0
- data/spec/mongo/collection_crud_spec.rb +4471 -0
- data/spec/mongo/collection_ddl_spec.rb +587 -0
- data/spec/mongo/collection_spec.rb +106 -4839
- 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 +21 -2
- data/spec/mongo/crypt/auto_encrypter_spec.rb +266 -5
- data/spec/mongo/crypt/auto_encryption_context_spec.rb +21 -2
- data/spec/mongo/crypt/binary_spec.rb +3 -5
- data/spec/mongo/crypt/binding/binary_spec.rb +3 -5
- data/spec/mongo/crypt/binding/context_spec.rb +71 -23
- data/spec/mongo/crypt/binding/helpers_spec.rb +3 -5
- data/spec/mongo/crypt/binding/mongocrypt_spec.rb +21 -52
- data/spec/mongo/crypt/binding/status_spec.rb +3 -5
- data/spec/mongo/crypt/binding/version_spec.rb +50 -5
- data/spec/mongo/crypt/binding_unloaded_spec.rb +17 -0
- data/spec/mongo/crypt/data_key_context_spec.rb +45 -114
- data/spec/mongo/crypt/encryption_io_spec.rb +5 -0
- data/spec/mongo/crypt/explicit_decryption_context_spec.rb +36 -2
- data/spec/mongo/crypt/explicit_encryption_context_spec.rb +98 -2
- data/spec/mongo/crypt/handle_spec.rb +189 -155
- data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +3 -0
- 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 +3 -5
- data/spec/mongo/crypt_spec.rb +21 -0
- data/spec/mongo/cursor/builder/get_more_command_spec.rb +11 -2
- data/spec/mongo/cursor/builder/op_get_more_spec.rb +11 -2
- data/spec/mongo/cursor_spec.rb +230 -19
- data/spec/mongo/database_spec.rb +263 -25
- data/spec/mongo/distinguishing_semaphore_spec.rb +9 -6
- data/spec/mongo/error/bulk_write_error_spec.rb +6 -3
- data/spec/mongo/error/crypt_error_spec.rb +3 -0
- data/spec/mongo/error/max_bson_size_spec.rb +3 -0
- data/spec/mongo/error/no_server_available_spec.rb +4 -1
- data/spec/mongo/error/notable_spec.rb +3 -0
- data/spec/mongo/error/operation_failure_heavy_spec.rb +53 -1
- data/spec/mongo/error/operation_failure_spec.rb +94 -31
- data/spec/mongo/error/parser_spec.rb +40 -6
- data/spec/mongo/error/unsupported_option_spec.rb +3 -0
- data/spec/mongo/event/publisher_spec.rb +3 -0
- data/spec/mongo/event/subscriber_spec.rb +3 -0
- data/spec/mongo/grid/file/chunk_spec.rb +7 -4
- data/spec/mongo/grid/file/info_spec.rb +3 -0
- data/spec/mongo/grid/file_spec.rb +4 -1
- data/spec/mongo/grid/fs_bucket_spec.rb +40 -17
- data/spec/mongo/grid/stream/read_spec.rb +33 -10
- data/spec/mongo/grid/stream/write_spec.rb +6 -9
- data/spec/mongo/grid/stream_spec.rb +4 -1
- data/spec/mongo/id_spec.rb +4 -1
- data/spec/mongo/index/view_spec.rb +138 -4
- data/spec/mongo/lint_spec.rb +4 -1
- data/spec/mongo/logger_spec.rb +16 -11
- data/spec/mongo/monitoring/command_log_subscriber_spec.rb +3 -0
- data/spec/mongo/monitoring/event/cmap/connection_check_out_failed_spec.rb +4 -1
- data/spec/mongo/monitoring/event/cmap/connection_check_out_started_spec.rb +4 -1
- data/spec/mongo/monitoring/event/cmap/connection_checked_in_spec.rb +4 -1
- data/spec/mongo/monitoring/event/cmap/connection_checked_out_spec.rb +4 -1
- data/spec/mongo/monitoring/event/cmap/connection_closed_spec.rb +4 -1
- data/spec/mongo/monitoring/event/cmap/connection_created_spec.rb +4 -1
- data/spec/mongo/monitoring/event/cmap/connection_ready_spec.rb +4 -1
- data/spec/mongo/monitoring/event/cmap/pool_cleared_spec.rb +4 -1
- data/spec/mongo/monitoring/event/cmap/pool_closed_spec.rb +4 -1
- data/spec/mongo/monitoring/event/cmap/pool_created_spec.rb +4 -1
- data/spec/mongo/monitoring/event/command_failed_spec.rb +59 -2
- data/spec/mongo/monitoring/event/command_started_spec.rb +3 -0
- data/spec/mongo/monitoring/event/command_succeeded_spec.rb +46 -6
- data/spec/mongo/monitoring/event/secure_spec.rb +28 -4
- data/spec/mongo/monitoring/event/server_closed_spec.rb +4 -1
- data/spec/mongo/monitoring/event/server_description_changed_spec.rb +3 -0
- data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +4 -1
- data/spec/mongo/monitoring/event/server_heartbeat_started_spec.rb +3 -0
- data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +4 -1
- data/spec/mongo/monitoring/event/server_opening_spec.rb +4 -1
- data/spec/mongo/monitoring/event/topology_changed_spec.rb +4 -1
- data/spec/mongo/monitoring/event/topology_closed_spec.rb +4 -1
- data/spec/mongo/monitoring/event/topology_opening_spec.rb +4 -1
- data/spec/mongo/monitoring_spec.rb +3 -0
- data/spec/mongo/operation/aggregate/result_spec.rb +7 -2
- data/spec/mongo/operation/aggregate_spec.rb +5 -1
- data/spec/mongo/operation/collections_info_spec.rb +7 -1
- data/spec/mongo/operation/command_spec.rb +11 -5
- data/spec/mongo/operation/create/op_msg_spec.rb +244 -0
- data/spec/mongo/operation/create_index_spec.rb +9 -3
- data/spec/mongo/operation/create_user_spec.rb +9 -3
- data/spec/mongo/operation/delete/bulk_spec.rb +12 -6
- data/spec/mongo/operation/delete/op_msg_spec.rb +20 -8
- data/spec/mongo/operation/delete_spec.rb +13 -36
- data/spec/mongo/operation/drop_index_spec.rb +9 -2
- data/spec/mongo/operation/find/builder/flags_spec.rb +109 -0
- data/spec/mongo/operation/find/builder/modifiers_spec.rb +213 -0
- data/spec/mongo/operation/indexes_spec.rb +8 -1
- data/spec/mongo/operation/insert/bulk_spec.rb +14 -8
- data/spec/mongo/operation/insert/op_msg_spec.rb +25 -14
- data/spec/mongo/operation/insert_spec.rb +17 -43
- data/spec/mongo/operation/limited_spec.rb +3 -0
- data/spec/mongo/operation/map_reduce_spec.rb +8 -2
- data/spec/mongo/operation/read_preference_legacy_spec.rb +39 -42
- data/spec/mongo/operation/read_preference_op_msg_spec.rb +33 -5
- data/spec/mongo/operation/remove_user_spec.rb +9 -3
- data/spec/mongo/operation/result_spec.rb +30 -5
- data/spec/mongo/operation/specifiable_spec.rb +3 -0
- data/spec/mongo/operation/update/bulk_spec.rb +13 -7
- data/spec/mongo/operation/update/op_msg_spec.rb +20 -8
- data/spec/mongo/operation/update_spec.rb +12 -35
- data/spec/mongo/operation/update_user_spec.rb +7 -1
- data/spec/mongo/options/redacted_spec.rb +4 -1
- data/spec/mongo/protocol/caching_hash_spec.rb +37 -0
- data/spec/mongo/protocol/compressed_spec.rb +29 -12
- data/spec/mongo/protocol/get_more_spec.rb +3 -0
- data/spec/mongo/protocol/kill_cursors_spec.rb +3 -0
- data/spec/mongo/protocol/msg_spec.rb +48 -66
- data/spec/mongo/protocol/query_spec.rb +6 -3
- data/spec/mongo/protocol/registry_spec.rb +3 -0
- data/spec/mongo/protocol/reply_spec.rb +3 -0
- data/spec/mongo/query_cache_middleware_spec.rb +55 -0
- data/spec/mongo/query_cache_spec.rb +453 -0
- data/spec/mongo/retryable_spec.rb +42 -7
- data/spec/mongo/semaphore_spec.rb +9 -6
- data/spec/mongo/server/app_metadata/environment_spec.rb +209 -0
- data/spec/mongo/server/app_metadata/truncator_spec.rb +158 -0
- data/spec/mongo/server/app_metadata_spec.rb +55 -52
- data/spec/mongo/server/connection_auth_spec.rb +9 -10
- data/spec/mongo/server/connection_common_spec.rb +87 -0
- data/spec/mongo/server/connection_pool/populator_spec.rb +22 -3
- data/spec/mongo/server/connection_pool_spec.rb +635 -58
- data/spec/mongo/server/connection_spec.rb +226 -204
- data/spec/mongo/server/description/features_spec.rb +27 -0
- data/spec/mongo/server/description_query_methods_spec.rb +4 -1
- data/spec/mongo/server/description_spec.rb +625 -594
- data/spec/mongo/server/monitor/app_metadata_spec.rb +3 -1
- data/spec/mongo/server/monitor/connection_spec.rb +81 -9
- data/spec/mongo/server/monitor_spec.rb +31 -18
- data/spec/mongo/server/push_monitor_spec.rb +95 -0
- data/spec/mongo/server/round_trip_time_averager_spec.rb +3 -0
- data/spec/mongo/server_selector/nearest_spec.rb +8 -2
- data/spec/mongo/server_selector/primary_preferred_spec.rb +8 -2
- data/spec/mongo/server_selector/primary_spec.rb +8 -2
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +14 -8
- data/spec/mongo/server_selector/secondary_spec.rb +8 -2
- data/spec/mongo/server_selector_spec.rb +143 -18
- data/spec/mongo/server_spec.rb +49 -6
- data/spec/mongo/session/server_session_spec.rb +3 -0
- data/spec/mongo/session/session_pool_spec.rb +45 -10
- data/spec/mongo/session_spec.rb +29 -6
- data/spec/mongo/session_transaction_spec.rb +17 -36
- data/spec/mongo/socket/ssl_spec.rb +91 -75
- data/spec/mongo/socket/tcp_spec.rb +3 -0
- data/spec/mongo/socket/unix_spec.rb +4 -0
- data/spec/mongo/socket_spec.rb +5 -2
- data/spec/mongo/srv/monitor_spec.rb +3 -0
- data/spec/mongo/srv/result_spec.rb +3 -0
- data/spec/mongo/timeout_spec.rb +3 -0
- data/spec/mongo/tls_context_hooks_spec.rb +40 -0
- data/spec/mongo/uri/options_mapper_spec.rb +1605 -0
- data/spec/mongo/uri/srv_protocol_spec.rb +330 -36
- data/spec/mongo/uri_option_parsing_spec.rb +52 -16
- data/spec/mongo/uri_spec.rb +238 -42
- data/spec/mongo/utils_spec.rb +42 -0
- data/spec/mongo/write_concern/acknowledged_spec.rb +3 -0
- data/spec/mongo/write_concern/unacknowledged_spec.rb +3 -0
- data/spec/mongo/write_concern_spec.rb +3 -0
- data/spec/runners/auth.rb +26 -2
- data/spec/runners/change_streams/outcome.rb +3 -0
- data/spec/runners/change_streams/spec.rb +4 -1
- data/spec/runners/change_streams/test.rb +5 -2
- data/spec/runners/cmap/verifier.rb +4 -1
- data/spec/runners/cmap.rb +192 -46
- data/spec/runners/command_monitoring.rb +4 -1
- data/spec/runners/connection_string.rb +48 -126
- data/spec/runners/crud/context.rb +3 -0
- data/spec/runners/crud/operation.rb +21 -7
- data/spec/runners/crud/outcome.rb +3 -0
- data/spec/runners/crud/requirement.rb +76 -6
- data/spec/runners/crud/spec.rb +9 -3
- data/spec/runners/crud/test.rb +4 -1
- data/spec/runners/crud/test_base.rb +4 -20
- data/spec/runners/crud/verifier.rb +20 -4
- data/spec/runners/crud.rb +23 -1
- data/spec/runners/gridfs.rb +4 -1
- data/spec/runners/read_write_concern_document.rb +4 -1
- data/spec/runners/sdam/verifier.rb +3 -0
- data/spec/runners/sdam.rb +9 -5
- data/spec/runners/server_selection.rb +5 -2
- data/spec/runners/server_selection_rtt.rb +5 -2
- data/spec/runners/transactions/operation.rb +30 -10
- data/spec/runners/transactions/spec.rb +5 -2
- data/spec/runners/transactions/test.rb +69 -21
- data/spec/runners/transactions.rb +14 -8
- data/spec/runners/unified/assertions.rb +379 -0
- data/spec/runners/unified/change_stream_operations.rb +52 -0
- data/spec/runners/unified/client_side_encryption_operations.rb +83 -0
- data/spec/runners/unified/crud_operations.rb +332 -0
- data/spec/runners/unified/ddl_operations.rb +255 -0
- data/spec/runners/unified/entity_map.rb +42 -0
- data/spec/runners/unified/error.rb +29 -0
- data/spec/runners/unified/event_subscriber.rb +110 -0
- data/spec/runners/unified/exceptions.rb +24 -0
- data/spec/runners/unified/grid_fs_operations.rb +79 -0
- data/spec/runners/unified/support_operations.rb +333 -0
- data/spec/runners/unified/test.rb +585 -0
- data/spec/runners/unified/test_group.rb +31 -0
- data/spec/runners/unified/thread_operations.rb +73 -0
- data/spec/runners/unified.rb +109 -0
- data/spec/shared/LICENSE +20 -0
- data/spec/shared/bin/get-mongodb-download-url +17 -0
- data/spec/shared/bin/s3-copy +45 -0
- data/spec/shared/bin/s3-upload +69 -0
- data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
- data/spec/shared/lib/mrss/cluster_config.rb +231 -0
- data/spec/shared/lib/mrss/constraints.rb +378 -0
- data/spec/shared/lib/mrss/docker_runner.rb +295 -0
- data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
- data/spec/shared/lib/mrss/event_subscriber.rb +210 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +238 -0
- data/spec/shared/lib/mrss/server_version_registry.rb +113 -0
- 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/spec_organizer.rb +179 -0
- data/spec/shared/lib/mrss/utils.rb +37 -0
- data/spec/shared/share/Dockerfile.erb +330 -0
- data/spec/shared/share/haproxy-1.conf +16 -0
- data/spec/shared/share/haproxy-2.conf +17 -0
- data/spec/shared/shlib/config.sh +27 -0
- data/spec/shared/shlib/distro.sh +74 -0
- data/spec/shared/shlib/server.sh +416 -0
- data/spec/shared/shlib/set_env.sh +169 -0
- data/spec/solo/clean_exit_spec.rb +22 -0
- data/spec/spec_helper.rb +11 -5
- data/spec/spec_tests/auth_spec.rb +30 -13
- data/spec/spec_tests/change_streams_unified_spec.rb +14 -0
- data/spec/spec_tests/client_side_encryption_spec.rb +27 -1
- data/spec/spec_tests/client_side_encryption_unified_spec.rb +26 -0
- data/spec/spec_tests/cmap_spec.rb +41 -17
- data/spec/spec_tests/collection_management_spec.rb +13 -0
- data/spec/spec_tests/command_monitoring_unified_spec.rb +13 -0
- data/spec/spec_tests/connection_string_spec.rb +3 -0
- data/spec/spec_tests/crud_spec.rb +3 -10
- data/spec/spec_tests/crud_unified_spec.rb +13 -0
- 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 +927 -0
- 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 +1 -8
- 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 +8 -2
- 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-interrupt-immediately.yml +49 -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 +12 -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 +164 -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 +348 -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/valid-warnings.yml +24 -0
- data/spec/spec_tests/data/crud/read/aggregate-collation.yml +2 -1
- data/spec/spec_tests/data/crud/read/aggregate-out.yml +1 -0
- data/spec/spec_tests/data/crud/read/count-collation.yml +2 -1
- data/spec/spec_tests/data/crud/read/distinct-collation.yml +2 -1
- data/spec/spec_tests/data/crud/read/find-collation.yml +2 -1
- data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +2 -1
- data/spec/spec_tests/data/crud/write/bulkWrite.yml +26 -22
- data/spec/spec_tests/data/crud/write/deleteMany-collation.yml +2 -1
- data/spec/spec_tests/data/crud/write/deleteOne-collation.yml +2 -1
- data/spec/spec_tests/data/crud/write/findOneAndDelete-collation.yml +3 -2
- data/spec/spec_tests/data/crud/write/findOneAndReplace-collation.yml +2 -1
- data/spec/spec_tests/data/crud/write/findOneAndUpdate-collation.yml +3 -2
- data/spec/spec_tests/data/crud/write/insertMany.yml +26 -22
- data/spec/spec_tests/data/crud/write/replaceOne-collation.yml +3 -2
- data/spec/spec_tests/data/crud/write/updateMany-collation.yml +2 -1
- data/spec/spec_tests/data/crud/write/updateOne-collation.yml +2 -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 +181 -0
- 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.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 +299 -0
- 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/load_balancers/event-monitoring.yml +99 -0
- data/spec/spec_tests/data/load_balancers/lb-connection-establishment.yml +36 -0
- data/spec/spec_tests/data/load_balancers/non-lb-connection-establishment.yml +56 -0
- data/spec/spec_tests/data/load_balancers/server-selection.yml +50 -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/legacy/aggregate-serverErrors.yml +157 -0
- data/spec/spec_tests/data/retryable_reads/legacy/changeStreams-client.watch-serverErrors.yml +150 -0
- data/spec/spec_tests/data/retryable_reads/legacy/changeStreams-client.watch.yml +62 -0
- data/spec/spec_tests/data/retryable_reads/legacy/changeStreams-db.coll.watch-serverErrors.yml +150 -0
- data/spec/spec_tests/data/retryable_reads/legacy/changeStreams-db.coll.watch.yml +66 -0
- data/spec/spec_tests/data/retryable_reads/legacy/changeStreams-db.watch-serverErrors.yml +154 -0
- data/spec/spec_tests/data/retryable_reads/legacy/changeStreams-db.watch.yml +62 -0
- data/spec/spec_tests/data/retryable_reads/legacy/count-serverErrors.yml +150 -0
- data/spec/spec_tests/data/retryable_reads/legacy/countDocuments-serverErrors.yml +150 -0
- data/spec/spec_tests/data/retryable_reads/legacy/distinct-serverErrors.yml +156 -0
- data/spec/spec_tests/data/retryable_reads/legacy/estimatedDocumentCount-serverErrors.yml +148 -0
- data/spec/spec_tests/data/retryable_reads/legacy/find-serverErrors.yml +160 -0
- data/spec/spec_tests/data/retryable_reads/legacy/findOne-serverErrors.yml +154 -0
- data/spec/spec_tests/data/retryable_reads/legacy/gridfs-download-serverErrors.yml +173 -0
- data/spec/spec_tests/data/retryable_reads/legacy/gridfs-downloadByName-serverErrors.yml +174 -0
- data/spec/spec_tests/data/retryable_reads/legacy/listCollectionNames-serverErrors.yml +143 -0
- data/spec/spec_tests/data/retryable_reads/legacy/listCollectionObjects-serverErrors.yml +144 -0
- data/spec/spec_tests/data/retryable_reads/legacy/listCollections-serverErrors.yml +143 -0
- data/spec/spec_tests/data/retryable_reads/legacy/listDatabaseNames-serverErrors.yml +143 -0
- data/spec/spec_tests/data/retryable_reads/legacy/listDatabaseObjects-serverErrors.yml +144 -0
- data/spec/spec_tests/data/retryable_reads/legacy/listDatabases-serverErrors.yml +144 -0
- data/spec/spec_tests/data/retryable_reads/legacy/listIndexNames-serverErrors.yml +144 -0
- data/spec/spec_tests/data/retryable_reads/legacy/listIndexNames.yml +60 -0
- data/spec/spec_tests/data/retryable_reads/legacy/listIndexes-serverErrors.yml +145 -0
- data/spec/spec_tests/data/retryable_reads/legacy/mapReduce.yml +62 -0
- data/spec/spec_tests/data/retryable_reads/unified/handshakeError.yml +1342 -0
- data/spec/spec_tests/data/retryable_writes/legacy/bulkWrite-serverErrors.yml +130 -0
- data/spec/spec_tests/data/retryable_writes/legacy/bulkWrite.yml +402 -0
- data/spec/spec_tests/data/retryable_writes/legacy/deleteOne-serverErrors.yml +73 -0
- data/spec/spec_tests/data/retryable_writes/legacy/findOneAndDelete-serverErrors.yml +74 -0
- data/spec/spec_tests/data/retryable_writes/legacy/findOneAndReplace-serverErrors.yml +80 -0
- data/spec/spec_tests/data/retryable_writes/legacy/findOneAndUpdate-serverErrors.yml +79 -0
- data/spec/spec_tests/data/retryable_writes/legacy/insertMany-serverErrors.yml +84 -0
- data/spec/spec_tests/data/retryable_writes/legacy/insertOne-serverErrors.yml +527 -0
- data/spec/spec_tests/data/retryable_writes/legacy/replaceOne-serverErrors.yml +82 -0
- data/spec/spec_tests/data/retryable_writes/legacy/updateOne-serverErrors.yml +82 -0
- data/spec/spec_tests/data/retryable_writes/unified/bulkWrite-serverErrors.yml +96 -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 +78 -0
- data/spec/spec_tests/data/sdam/errors/error_handling_handshake.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/non-stale-network-error.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/non-stale-network-timeout-error.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedAtShutdown.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedDueToReplStateChange.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-LegacyNotPrimary.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotPrimaryNoSecondaryOk.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotPrimaryOrSecondary.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotWritablePrimary.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-PrimarySteppedDown.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-ShutdownInProgress.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedAtShutdown.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedDueToReplStateChange.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-LegacyNotPrimary.yml +52 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotPrimaryNoSecondaryOk.yml +52 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotPrimaryOrSecondary.yml +52 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotWritablePrimary.yml +52 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-PrimarySteppedDown.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-ShutdownInProgress.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedAtShutdown.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedDueToReplStateChange.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-LegacyNotPrimary.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryNoSecondaryOk.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryOrSecondary.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotWritablePrimary.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-PrimarySteppedDown.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-ShutdownInProgress.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/post-42-InterruptedAtShutdown.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/post-42-InterruptedDueToReplStateChange.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/post-42-LegacyNotPrimary.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/post-42-NotPrimaryNoSecondaryOk.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/post-42-NotPrimaryOrSecondary.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/post-42-NotWritablePrimary.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/post-42-PrimarySteppedDown.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/post-42-ShutdownInProgress.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedAtShutdown.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedDueToReplStateChange.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/pre-42-LegacyNotPrimary.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-NotPrimaryNoSecondaryOk.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-NotPrimaryOrSecondary.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-NotWritablePrimary.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-PrimarySteppedDown.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/pre-42-ShutdownInProgress.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/prefer-error-code.yml +54 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedAtShutdown.yml +4 -2
- data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedDueToReplStateChange.yml +4 -2
- data/spec/spec_tests/data/sdam/errors/stale-generation-NotPrimaryNoSecondaryOk.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-NotPrimaryOrSecondary.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-NotWritablePrimary.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-PrimarySteppedDown.yml +4 -2
- data/spec/spec_tests/data/sdam/errors/stale-generation-ShutdownInProgress.yml +4 -2
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedAtShutdown.yml +4 -2
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedDueToReplStateChange.yml +4 -2
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-LegacyNotPrimary.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotPrimaryNoSecondaryOk.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotPrimaryOrSecondary.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotWritablePrimary.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-PrimarySteppedDown.yml +4 -2
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-ShutdownInProgress.yml +4 -2
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-network.yml +6 -4
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-timeout.yml +6 -4
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedAtShutdown.yml +4 -2
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedDueToReplStateChange.yml +4 -2
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-LegacyNotPrimary.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryNoSecondaryOk.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryOrSecondary.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotWritablePrimary.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-PrimarySteppedDown.yml +4 -2
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-ShutdownInProgress.yml +4 -2
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-network.yml +6 -4
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-timeout.yml +6 -4
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedAtShutdown.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedDueToReplStateChange.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-LegacyNotPrimary.yml +65 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotPrimaryNoSecondaryOk.yml +65 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotPrimaryOrSecondary.yml +65 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotWritablePrimary.yml +65 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-PrimarySteppedDown.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-ShutdownInProgress.yml +2 -1
- data/spec/spec_tests/data/sdam/errors/write_errors_ignored.yml +42 -0
- data/spec/spec_tests/data/sdam/load-balanced/discover_load_balancer.yml +25 -0
- data/spec/spec_tests/data/sdam/rs/compatible.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/compatible_unknown.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/discover_arbiters.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/discover_arbiters_replicaset.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/discover_ghost.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/discover_ghost_replicaset.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/discover_hidden.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/discover_hidden_replicaset.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/discover_passives.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/discover_passives_replicaset.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/discover_primary.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/discover_primary_replicaset.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/discover_rsother.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/discover_rsother_replicaset.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/discover_secondary.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/discover_secondary_replicaset.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/discovery.yml +8 -4
- data/spec/spec_tests/data/sdam/rs/electionId_precedence_setVersion.yml +62 -0
- data/spec/spec_tests/data/sdam/rs/equal_electionids.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/hosts_differ_from_seeds.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/incompatible_arbiter.yml +3 -1
- data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +3 -1
- data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +3 -1
- data/spec/spec_tests/data/sdam/rs/ls_timeout.yml +12 -6
- data/spec/spec_tests/data/sdam/rs/member_reconfig.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/member_standalone.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/new_primary.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/new_primary_new_electionid.yml +6 -3
- data/spec/spec_tests/data/sdam/rs/new_primary_new_setversion.yml +6 -3
- data/spec/spec_tests/data/sdam/rs/new_primary_wrong_set_name.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/non_rs_member.yml +1 -0
- data/spec/spec_tests/data/sdam/rs/normalize_case.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/normalize_case_me.yml +4 -2
- 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 +28 -22
- data/spec/spec_tests/data/sdam/rs/primary_becomes_ghost.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/primary_becomes_mongos.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/primary_becomes_standalone.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/primary_changes_set_name.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/primary_disconnect.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/primary_disconnect_electionid.yml +10 -5
- data/spec/spec_tests/data/sdam/rs/primary_disconnect_setversion.yml +10 -5
- data/spec/spec_tests/data/sdam/rs/primary_hint_from_secondary_with_mismatched_me.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/primary_mismatched_me.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/primary_mismatched_me_not_removed.yml +5 -3
- data/spec/spec_tests/data/sdam/rs/primary_reports_new_member.yml +8 -4
- data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/primary_wrong_set_name.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/repeated.yml +9 -5
- data/spec/spec_tests/data/sdam/rs/replicaset_rsnp.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/response_from_removed.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/sec_not_auth.yml +4 -2
- 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 +5 -3
- data/spec/spec_tests/data/sdam/rs/secondary_mismatched_me.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/secondary_wrong_set_name.yml +2 -1
- data/spec/spec_tests/data/sdam/rs/secondary_wrong_set_name_with_primary.yml +4 -2
- 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 +13 -12
- data/spec/spec_tests/data/sdam/rs/stepdown_change_set_name.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/too_new.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/too_old.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/topology_version_equal.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/topology_version_greater.yml +10 -5
- data/spec/spec_tests/data/sdam/rs/topology_version_less.yml +4 -2
- data/spec/spec_tests/data/sdam/rs/unexpected_mongos.yml +2 -1
- 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 +29 -24
- data/spec/spec_tests/data/sdam/rs/wrong_set_name.yml +2 -1
- data/spec/spec_tests/data/sdam/sharded/compatible.yml +4 -2
- data/spec/spec_tests/data/sdam/sharded/discover_single_mongos.yml +2 -1
- data/spec/spec_tests/data/sdam/sharded/ls_timeout_mongos.yml +9 -5
- data/spec/spec_tests/data/sdam/sharded/mongos_disconnect.yml +6 -3
- data/spec/spec_tests/data/sdam/sharded/multiple_mongoses.yml +4 -2
- data/spec/spec_tests/data/sdam/sharded/non_mongos_removed.yml +4 -2
- data/spec/spec_tests/data/sdam/sharded/too_new.yml +4 -2
- data/spec/spec_tests/data/sdam/sharded/too_old.yml +4 -2
- data/spec/spec_tests/data/sdam/single/compatible.yml +2 -1
- data/spec/spec_tests/data/sdam/single/direct_connection_external_ip.yml +2 -1
- data/spec/spec_tests/data/sdam/single/direct_connection_mongos.yml +2 -1
- data/spec/spec_tests/data/sdam/single/direct_connection_replicaset.yml +2 -1
- data/spec/spec_tests/data/sdam/single/direct_connection_rsarbiter.yml +2 -1
- data/spec/spec_tests/data/sdam/single/direct_connection_rsprimary.yml +2 -1
- data/spec/spec_tests/data/sdam/single/direct_connection_rssecondary.yml +2 -1
- data/spec/spec_tests/data/sdam/single/direct_connection_standalone.yml +2 -1
- data/spec/spec_tests/data/sdam/single/direct_connection_wrong_set_name.yml +4 -2
- data/spec/spec_tests/data/sdam/single/discover_standalone.yml +2 -1
- data/spec/spec_tests/data/sdam/single/ls_timeout_standalone.yml +2 -1
- data/spec/spec_tests/data/sdam/single/not_ok_response.yml +5 -3
- data/spec/spec_tests/data/sdam/single/standalone_removed.yml +2 -1
- data/spec/spec_tests/data/sdam/single/standalone_using_legacy_hello.yml +34 -0
- data/spec/spec_tests/data/sdam/single/too_new.yml +2 -1
- data/spec/spec_tests/data/sdam/single/too_old.yml +2 -1
- data/spec/spec_tests/data/sdam/single/too_old_then_upgraded.yml +4 -2
- data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +2 -4
- data/spec/spec_tests/data/sdam_monitoring/load_balancer.yml +65 -0
- data/spec/spec_tests/data/sdam_monitoring/replica_set_with_no_primary.yml +40 -40
- data/spec/spec_tests/data/sdam_monitoring/replica_set_with_primary.yml +40 -40
- data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +4 -3
- data/spec/spec_tests/data/sdam_monitoring/required_replica_set.yml +3 -2
- data/spec/spec_tests/data/sdam_monitoring/standalone.yml +3 -3
- data/spec/spec_tests/data/sdam_monitoring/standalone_repeated.yml +2 -2
- data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +4 -4
- data/spec/spec_tests/data/sdam_monitoring/standalone_to_rs_with_me_mismatch.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 +14 -0
- 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 +6 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-multiple-hosts.yml +5 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-txt.yml +11 -0
- 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/encoded-userinfo-and-db.yml +15 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/loadBalanced-false-txt.yml +10 -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/replica-set/uri-with-admin-database.yml +13 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-auth.yml +12 -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-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 +4 -1
- data/spec/spec_tests/data/transactions/errors-client.yml +8 -9
- data/spec/spec_tests/data/transactions/mongos-pin-auto.yml +3 -0
- data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +3 -1
- data/spec/spec_tests/data/transactions/pin-mongos.yml +6 -3
- data/spec/spec_tests/data/transactions/retryable-abort.yml +7 -7
- data/spec/spec_tests/data/transactions/retryable-commit.yml +7 -7
- 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 +172 -0
- 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-failure.yml +31 -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 +241 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +102 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +190 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-gridfs.yml +155 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +193 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +210 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +215 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +235 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +169 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +171 -0
- data/spec/spec_tests/data/uri_options/auth-options.yml +25 -0
- data/spec/spec_tests/data/uri_options/compression-options.yml +7 -4
- data/spec/spec_tests/data/uri_options/connection-options.yml +60 -0
- data/spec/spec_tests/data/uri_options/read-preference-options.yml +24 -0
- data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +1 -0
- data/spec/spec_tests/data/uri_options/srv-options.yml +96 -0
- data/spec/spec_tests/data/uri_options/tls-options.yml +160 -4
- data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +419 -0
- data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +413 -0
- data/spec/spec_tests/data/versioned_api/runcommand-helper-no-api-version-declared.yml +75 -0
- data/spec/spec_tests/data/versioned_api/test-commands-deprecation-errors.yml +47 -0
- data/spec/spec_tests/data/versioned_api/test-commands-strict-mode.yml +46 -0
- data/spec/spec_tests/data/versioned_api/transaction-handling.yml +128 -0
- data/spec/spec_tests/gridfs_spec.rb +3 -0
- data/spec/spec_tests/gridfs_unified_spec.rb +13 -0
- data/spec/spec_tests/load_balancers_spec.rb +15 -0
- data/spec/spec_tests/max_staleness_spec.rb +3 -0
- data/spec/spec_tests/read_write_concern_connection_string_spec.rb +3 -0
- data/spec/spec_tests/read_write_concern_document_spec.rb +3 -0
- data/spec/spec_tests/read_write_concern_operaton_spec.rb +3 -0
- data/spec/spec_tests/retryable_reads_spec.rb +11 -3
- data/spec/spec_tests/retryable_reads_unified_spec.rb +22 -0
- data/spec/spec_tests/retryable_writes_spec.rb +14 -8
- data/spec/spec_tests/retryable_writes_unified_spec.rb +21 -0
- data/spec/spec_tests/sdam_monitoring_spec.rb +14 -6
- data/spec/spec_tests/sdam_spec.rb +9 -2
- data/spec/spec_tests/sdam_unified_spec.rb +13 -0
- data/spec/spec_tests/seed_list_discovery_spec.rb +127 -0
- data/spec/spec_tests/server_selection_rtt_spec.rb +3 -0
- data/spec/spec_tests/server_selection_spec.rb +3 -0
- data/spec/spec_tests/sessions_unified_spec.rb +13 -0
- data/spec/spec_tests/transactions_api_spec.rb +3 -0
- data/spec/spec_tests/transactions_spec.rb +3 -0
- data/spec/spec_tests/transactions_unified_spec.rb +13 -0
- data/spec/spec_tests/unified_spec.rb +18 -0
- data/spec/spec_tests/uri_options_spec.rb +50 -33
- data/spec/spec_tests/versioned_api_spec.rb +13 -0
- data/spec/stress/cleanup_spec.rb +3 -0
- data/spec/stress/connection_pool_stress_spec.rb +3 -61
- data/spec/stress/connection_pool_timing_spec.rb +14 -35
- data/spec/stress/fork_reconnect_stress_spec.rb +17 -18
- data/spec/stress/push_monitor_close_spec.rb +44 -0
- data/spec/support/authorization.rb +4 -1
- data/spec/support/aws_utils/base.rb +3 -0
- data/spec/support/aws_utils/inspector.rb +3 -0
- data/spec/support/aws_utils/orchestrator.rb +22 -7
- data/spec/support/aws_utils/provisioner.rb +3 -0
- data/spec/support/aws_utils.rb +6 -2
- data/spec/support/background_thread_registry.rb +7 -14
- data/spec/support/certificates/README.md +3 -2
- data/spec/support/certificates/atlas-ocsp-ca.crt +103 -0
- data/spec/support/certificates/atlas-ocsp.crt +152 -0
- data/spec/support/certificates/retrieve-atlas-cert +40 -0
- data/spec/support/client_registry.rb +17 -6
- data/spec/support/client_registry_macros.rb +17 -5
- data/spec/support/cluster_tools.rb +17 -9
- data/spec/support/common_shortcuts.rb +134 -10
- data/spec/support/constraints.rb +16 -246
- 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 +271 -13
- data/spec/support/dns.rb +3 -0
- data/spec/support/json_ext_formatter.rb +3 -0
- data/spec/support/keyword_struct.rb +3 -0
- data/spec/support/local_resource_registry.rb +3 -0
- data/spec/support/macros.rb +29 -0
- data/spec/support/matchers.rb +33 -1
- data/spec/support/mongos_macros.rb +24 -0
- data/spec/support/monitoring_ext.rb +3 -0
- data/spec/support/ocsp +1 -0
- data/spec/support/primary_socket.rb +3 -0
- data/spec/support/sdam_formatter_integration.rb +3 -0
- data/spec/support/shared/app_metadata.rb +179 -0
- data/spec/support/shared/auth_context.rb +17 -0
- data/spec/support/shared/protocol.rb +3 -0
- data/spec/support/shared/scram_conversation.rb +5 -1
- data/spec/support/shared/server_selector.rb +6 -3
- data/spec/support/shared/session.rb +20 -11
- data/spec/support/spec_config.rb +248 -24
- data/spec/support/spec_setup.rb +51 -38
- data/spec/support/using_hash.rb +40 -0
- data/spec/support/utils.rb +353 -172
- data.tar.gz.sig +0 -0
- metadata +2052 -1217
- metadata.gz.sig +0 -0
- data/lib/mongo/collection/view/builder/find_command.rb +0 -150
- data/lib/mongo/collection/view/builder/flags.rb +0 -62
- data/lib/mongo/collection/view/builder/modifiers.rb +0 -80
- data/lib/mongo/collection/view/builder/op_query.rb +0 -91
- data/lib/mongo/cursor/builder/get_more_command.rb +0 -77
- data/lib/mongo/cursor/builder/kill_cursors_command.rb +0 -108
- data/lib/mongo/cursor/builder/op_get_more.rb +0 -61
- data/lib/mongo/cursor/builder/op_kill_cursors.rb +0 -103
- data/lib/mongo/cursor/builder.rb +0 -18
- data/lib/mongo/operation/aggregate/command.rb +0 -44
- data/lib/mongo/operation/collections_info/command.rb +0 -40
- data/lib/mongo/operation/command/command.rb +0 -38
- data/lib/mongo/operation/count/command.rb +0 -38
- data/lib/mongo/operation/create/command.rb +0 -38
- data/lib/mongo/operation/create_index/command.rb +0 -42
- data/lib/mongo/operation/create_user/command.rb +0 -43
- data/lib/mongo/operation/delete/command.rb +0 -46
- data/lib/mongo/operation/delete/legacy.rb +0 -54
- data/lib/mongo/operation/distinct/command.rb +0 -38
- data/lib/mongo/operation/drop/command.rb +0 -38
- data/lib/mongo/operation/drop_database/command.rb +0 -38
- data/lib/mongo/operation/drop_index/command.rb +0 -42
- data/lib/mongo/operation/explain/command.rb +0 -39
- data/lib/mongo/operation/explain/legacy.rb +0 -38
- data/lib/mongo/operation/find/command.rb +0 -39
- data/lib/mongo/operation/find/legacy/result.rb +0 -41
- data/lib/mongo/operation/find/legacy.rb +0 -40
- data/lib/mongo/operation/get_more/command.rb +0 -39
- data/lib/mongo/operation/get_more/legacy.rb +0 -36
- data/lib/mongo/operation/indexes/command.rb +0 -39
- data/lib/mongo/operation/indexes/legacy.rb +0 -45
- data/lib/mongo/operation/insert/command.rb +0 -56
- data/lib/mongo/operation/insert/legacy.rb +0 -65
- data/lib/mongo/operation/kill_cursors/command.rb +0 -37
- data/lib/mongo/operation/kill_cursors/legacy.rb +0 -37
- data/lib/mongo/operation/list_collections/command.rb +0 -43
- data/lib/mongo/operation/map_reduce/command.rb +0 -40
- data/lib/mongo/operation/parallel_scan/command.rb +0 -55
- data/lib/mongo/operation/remove_user/command.rb +0 -43
- data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +0 -56
- data/lib/mongo/operation/shared/op_msg_or_command.rb +0 -44
- data/lib/mongo/operation/shared/op_msg_or_find_command.rb +0 -47
- data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +0 -47
- data/lib/mongo/operation/update/command.rb +0 -47
- data/lib/mongo/operation/update/legacy/result.rb +0 -102
- data/lib/mongo/operation/update/legacy.rb +0 -65
- data/lib/mongo/operation/update_user/command.rb +0 -42
- data/lib/mongo/operation/users_info/command.rb +0 -43
- data/lib/mongo/protocol/delete.rb +0 -169
- data/lib/mongo/protocol/insert.rb +0 -178
- data/lib/mongo/protocol/update.rb +0 -211
- data/lib/mongo/server/context.rb +0 -69
- data/spec/mongo/collection/view/builder/flags_spec.rb +0 -106
- data/spec/mongo/collection/view/builder/modifiers_spec.rb +0 -210
- data/spec/mongo/cursor/builder/op_kill_cursors_spec.rb +0 -61
- data/spec/mongo/dbref_spec.rb +0 -149
- data/spec/mongo/operation/delete/command_spec.rb +0 -112
- data/spec/mongo/operation/find/legacy_spec.rb +0 -125
- data/spec/mongo/operation/get_more_spec.rb +0 -58
- data/spec/mongo/operation/insert/command_spec.rb +0 -115
- data/spec/mongo/operation/kill_cursors_spec.rb +0 -41
- data/spec/mongo/operation/update/command_spec.rb +0 -119
- data/spec/mongo/protocol/delete_spec.rb +0 -182
- data/spec/mongo/protocol/insert_spec.rb +0 -176
- data/spec/mongo/protocol/update_spec.rb +0 -201
- data/spec/mongo/server/app_metadata_shared.rb +0 -136
- data/spec/spec_tests/change_streams_spec.rb +0 -90
- data/spec/spec_tests/command_monitoring_spec.rb +0 -66
- data/spec/spec_tests/data/change_streams/change-streams-errors.yml +0 -102
- data/spec/spec_tests/data/change_streams/change-streams-resume-errorLabels.yml +0 -1105
- data/spec/spec_tests/data/change_streams/change-streams-resume-whitelist.yml +0 -1173
- data/spec/spec_tests/data/change_streams/change-streams.yml +0 -537
- 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 -110
- 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 -38
- 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/aggregate-serverErrors.yml +0 -157
- data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch-serverErrors.yml +0 -149
- data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch.yml +0 -61
- data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch-serverErrors.yml +0 -149
- data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch.yml +0 -65
- data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch-serverErrors.yml +0 -153
- data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch.yml +0 -61
- data/spec/spec_tests/data/retryable_reads/count-serverErrors.yml +0 -150
- data/spec/spec_tests/data/retryable_reads/countDocuments-serverErrors.yml +0 -150
- data/spec/spec_tests/data/retryable_reads/distinct-serverErrors.yml +0 -156
- data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors.yml +0 -148
- data/spec/spec_tests/data/retryable_reads/find-serverErrors.yml +0 -160
- data/spec/spec_tests/data/retryable_reads/findOne-serverErrors.yml +0 -154
- data/spec/spec_tests/data/retryable_reads/gridfs-download-serverErrors.yml +0 -173
- data/spec/spec_tests/data/retryable_reads/gridfs-downloadByName-serverErrors.yml +0 -174
- data/spec/spec_tests/data/retryable_reads/listCollectionNames-serverErrors.yml +0 -143
- data/spec/spec_tests/data/retryable_reads/listCollectionObjects-serverErrors.yml +0 -144
- data/spec/spec_tests/data/retryable_reads/listCollections-serverErrors.yml +0 -143
- data/spec/spec_tests/data/retryable_reads/listDatabaseNames-serverErrors.yml +0 -143
- data/spec/spec_tests/data/retryable_reads/listDatabaseObjects-serverErrors.yml +0 -144
- data/spec/spec_tests/data/retryable_reads/listDatabases-serverErrors.yml +0 -144
- data/spec/spec_tests/data/retryable_reads/listIndexNames-serverErrors.yml +0 -144
- data/spec/spec_tests/data/retryable_reads/listIndexNames.yml +0 -60
- data/spec/spec_tests/data/retryable_reads/listIndexes-serverErrors.yml +0 -145
- data/spec/spec_tests/data/retryable_reads/mapReduce.yml +0 -60
- data/spec/spec_tests/data/retryable_writes/bulkWrite-serverErrors.yml +0 -130
- data/spec/spec_tests/data/retryable_writes/bulkWrite.yml +0 -396
- data/spec/spec_tests/data/retryable_writes/deleteOne-serverErrors.yml +0 -73
- data/spec/spec_tests/data/retryable_writes/findOneAndDelete-serverErrors.yml +0 -74
- data/spec/spec_tests/data/retryable_writes/findOneAndReplace-serverErrors.yml +0 -80
- data/spec/spec_tests/data/retryable_writes/findOneAndUpdate-serverErrors.yml +0 -79
- data/spec/spec_tests/data/retryable_writes/insertMany-serverErrors.yml +0 -84
- data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +0 -526
- data/spec/spec_tests/data/retryable_writes/replaceOne-serverErrors.yml +0 -82
- data/spec/spec_tests/data/retryable_writes/updateOne-serverErrors.yml +0 -82
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotMaster.yml +0 -60
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotMasterNoSlaveOk.yml +0 -60
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotMasterOrSecondary.yml +0 -60
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotMaster.yml +0 -51
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotMasterNoSlaveOk.yml +0 -51
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotMasterOrSecondary.yml +0 -51
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotMaster.yml +0 -60
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotMasterNoSlaveOk.yml +0 -60
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotMasterOrSecondary.yml +0 -60
- data/spec/spec_tests/data/sdam/errors/post-42-NotMaster.yml +0 -46
- data/spec/spec_tests/data/sdam/errors/post-42-NotMasterNoSlaveOk.yml +0 -46
- data/spec/spec_tests/data/sdam/errors/post-42-NotMasterOrSecondary.yml +0 -46
- data/spec/spec_tests/data/sdam/errors/pre-42-NotMaster.yml +0 -46
- data/spec/spec_tests/data/sdam/errors/pre-42-NotMasterNoSlaveOk.yml +0 -46
- data/spec/spec_tests/data/sdam/errors/pre-42-NotMasterOrSecondary.yml +0 -46
- data/spec/spec_tests/data/sdam/errors/stale-generation-NotMaster.yml +0 -89
- data/spec/spec_tests/data/sdam/errors/stale-generation-NotMasterNoSlaveOk.yml +0 -89
- data/spec/spec_tests/data/sdam/errors/stale-generation-NotMasterOrSecondary.yml +0 -89
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotMaster.yml +0 -89
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotMasterNoSlaveOk.yml +0 -89
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotMasterOrSecondary.yml +0 -89
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotMaster.yml +0 -89
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotMasterNoSlaveOk.yml +0 -89
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotMasterOrSecondary.yml +0 -89
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotMaster.yml +0 -64
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotMasterNoSlaveOk.yml +0 -64
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotMasterOrSecondary.yml +0 -64
- data/spec/spec_tests/data/sdam/single/direct_connection_slave.yml +0 -34
- 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 -83
- data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +0 -116
- data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +0 -86
- data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +0 -115
- data/spec/spec_tests/data/sdam_integration/isMaster-command-error.yml +0 -168
- data/spec/spec_tests/data/sdam_integration/isMaster-network-error.yml +0 -162
- data/spec/spec_tests/data/sdam_integration/isMaster-timeout.yml +0 -229
- data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +0 -87
- data/spec/spec_tests/dns_seedlist_discovery_spec.rb +0 -68
- data/spec/spec_tests/sdam_integration_spec.rb +0 -13
- data/spec/support/child_process_helper.rb +0 -78
- data/spec/support/cluster_config.rb +0 -207
- data/spec/support/crypt/corpus/corpus_encrypted.json +0 -4152
- data/spec/support/event_subscriber.rb +0 -212
- data/spec/support/lite_constraints.rb +0 -141
- data/spec/support/spec_organizer.rb +0 -129
- /data/spec/spec_tests/data/retryable_reads/{aggregate-merge.yml → legacy/aggregate-merge.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{aggregate.yml → legacy/aggregate.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.yml → legacy/countDocuments.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{distinct.yml → legacy/distinct.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{estimatedDocumentCount.yml → legacy/estimatedDocumentCount.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.yml → legacy/findOne.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.yml → legacy/gridfs-downloadByName.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.yml → legacy/listCollectionObjects.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.yml → legacy/listDatabaseNames.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.yml → legacy/listDatabases.yml} +0 -0
- /data/spec/spec_tests/data/retryable_reads/{listIndexes.yml → legacy/listIndexes.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/{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
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/direct-connection-false.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/direct-connection-true.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/longer-parent-in-return.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/misformatted-option.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/no-results.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/not-enough-parts.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-result-default-port.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-txt-record-multiple-strings.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/one-txt-record.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch1.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch2.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch3.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch4.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/parent-part-mismatch5.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/returned-parent-too-short.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/returned-parent-wrong.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-results-default-port.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-results-nonstandard-port.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/two-txt-records.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-not-allowed-option.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-overridden-ssl-option.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-overridden-uri-option.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/txt-record-with-unallowed-option.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/uri-with-port.yml +0 -0
- /data/spec/spec_tests/data/{dns_seedlist_discovery → seed_list_discovery/replica-set}/uri-with-two-hosts.yml +0 -0
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# rubocop:todo all
|
|
3
|
+
|
|
1
4
|
# Copyright (C) 2014-2020 MongoDB Inc.
|
|
2
5
|
#
|
|
3
6
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -11,7 +14,6 @@
|
|
|
11
14
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
15
|
# See the License for the specific language governing permissions and
|
|
13
16
|
# limitations under the License.
|
|
14
|
-
require 'mongo/server/connection_pool/populator'
|
|
15
17
|
|
|
16
18
|
module Mongo
|
|
17
19
|
class Server
|
|
@@ -27,12 +29,16 @@ module Mongo
|
|
|
27
29
|
# The default max size for the connection pool.
|
|
28
30
|
#
|
|
29
31
|
# @since 2.9.0
|
|
30
|
-
DEFAULT_MAX_SIZE =
|
|
32
|
+
DEFAULT_MAX_SIZE = 20
|
|
31
33
|
|
|
32
34
|
# The default min size for the connection pool.
|
|
33
35
|
#
|
|
34
36
|
# @since 2.9.0
|
|
35
|
-
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
|
|
36
42
|
|
|
37
43
|
# The default timeout, in seconds, to wait for a connection.
|
|
38
44
|
#
|
|
@@ -57,7 +63,13 @@ module Mongo
|
|
|
57
63
|
# @param [ Server ] server The server which this connection pool is for.
|
|
58
64
|
# @param [ Hash ] options The connection pool options.
|
|
59
65
|
#
|
|
60
|
-
# @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.
|
|
61
73
|
# @option options [ Integer ] :max_pool_size Deprecated.
|
|
62
74
|
# The maximum pool size. If max_size is also given, max_size and
|
|
63
75
|
# max_pool_size must be identical.
|
|
@@ -72,11 +84,21 @@ module Mongo
|
|
|
72
84
|
# are given, their values must be identical.
|
|
73
85
|
# @option options [ Float ] :max_idle_time The time, in seconds,
|
|
74
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.
|
|
75
96
|
# Note: Additionally, options for connections created by this pool should
|
|
76
97
|
# be included in the options passed here, and they will be forwarded to
|
|
77
98
|
# any connections created by the pool.
|
|
78
99
|
#
|
|
79
100
|
# @since 2.0.0, API changed in 2.9.0
|
|
101
|
+
|
|
80
102
|
def initialize(server, options = {})
|
|
81
103
|
unless server.is_a?(Server)
|
|
82
104
|
raise ArgumentError, 'First argument must be a Server instance'
|
|
@@ -96,7 +118,7 @@ module Mongo
|
|
|
96
118
|
options[:max_size] ||= options[:max_pool_size]
|
|
97
119
|
options.delete(:max_pool_size)
|
|
98
120
|
if options[:min_size] && options[:max_size] &&
|
|
99
|
-
options[:min_size] > options[:max_size]
|
|
121
|
+
(options[:max_size] != 0 && options[:min_size] > options[:max_size])
|
|
100
122
|
then
|
|
101
123
|
raise ArgumentError, "Cannot have min size #{options[:min_size]} exceed max size #{options[:max_size]}"
|
|
102
124
|
end
|
|
@@ -108,7 +130,8 @@ module Mongo
|
|
|
108
130
|
@server = server
|
|
109
131
|
@options = options.freeze
|
|
110
132
|
|
|
111
|
-
@
|
|
133
|
+
@generation_manager = GenerationManager.new(server: server)
|
|
134
|
+
@ready = false
|
|
112
135
|
@closed = false
|
|
113
136
|
|
|
114
137
|
# A connection owned by this pool should be either in the
|
|
@@ -117,6 +140,7 @@ module Mongo
|
|
|
117
140
|
@available_connections = available_connections = []
|
|
118
141
|
@checked_out_connections = Set.new
|
|
119
142
|
@pending_connections = Set.new
|
|
143
|
+
@interrupt_connections = []
|
|
120
144
|
|
|
121
145
|
# Mutex used for synchronizing access to @available_connections and
|
|
122
146
|
# @checked_out_connections. The pool object is thread-safe, thus
|
|
@@ -124,30 +148,42 @@ module Mongo
|
|
|
124
148
|
# must do so under this lock.
|
|
125
149
|
@lock = Mutex.new
|
|
126
150
|
|
|
127
|
-
# Condition variable broadcast when a connection is added to
|
|
128
|
-
# @available_connections, to wake up any threads waiting for an
|
|
129
|
-
# available connection when pool is at max size
|
|
130
|
-
@available_semaphore = Semaphore.new
|
|
131
|
-
|
|
132
151
|
# Background thread reponsible for maintaining the size of
|
|
133
152
|
# the pool to at least min_size
|
|
134
153
|
@populator = Populator.new(self, options)
|
|
135
154
|
@populate_semaphore = Semaphore.new
|
|
136
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
|
+
|
|
137
172
|
ObjectSpace.define_finalizer(self, self.class.finalize(@available_connections, @pending_connections, @populator))
|
|
138
173
|
|
|
139
174
|
publish_cmap_event(
|
|
140
175
|
Monitoring::Event::Cmap::PoolCreated.new(@server.address, options, self)
|
|
141
176
|
)
|
|
142
|
-
|
|
143
|
-
@populator.run! if min_size > 0
|
|
144
177
|
end
|
|
145
178
|
|
|
146
179
|
# @return [ Hash ] options The pool options.
|
|
147
180
|
attr_reader :options
|
|
148
181
|
|
|
149
182
|
# @api private
|
|
150
|
-
|
|
183
|
+
attr_reader :server
|
|
184
|
+
|
|
185
|
+
# @api private
|
|
186
|
+
def_delegators :server, :address
|
|
151
187
|
|
|
152
188
|
# Get the maximum size of the connection pool.
|
|
153
189
|
#
|
|
@@ -186,12 +222,27 @@ module Mongo
|
|
|
186
222
|
@max_idle_time ||= options[:max_idle_time]
|
|
187
223
|
end
|
|
188
224
|
|
|
225
|
+
# @api private
|
|
226
|
+
attr_reader :generation_manager
|
|
227
|
+
|
|
189
228
|
# @return [ Integer ] generation Generation of connections currently
|
|
190
229
|
# being used by the queue.
|
|
191
230
|
#
|
|
192
|
-
# @since 2.9.0
|
|
193
231
|
# @api private
|
|
194
|
-
|
|
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
|
|
195
246
|
|
|
196
247
|
# Size of the connection pool.
|
|
197
248
|
#
|
|
@@ -217,6 +268,14 @@ module Mongo
|
|
|
217
268
|
end
|
|
218
269
|
private :unsynchronized_size
|
|
219
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
|
+
|
|
220
279
|
# Number of available connections in the pool.
|
|
221
280
|
#
|
|
222
281
|
# @return [ Integer ] Number of available connections.
|
|
@@ -239,14 +298,30 @@ module Mongo
|
|
|
239
298
|
!!@closed
|
|
240
299
|
end
|
|
241
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
|
+
|
|
242
310
|
# @note This method is experimental and subject to change.
|
|
243
311
|
#
|
|
244
312
|
# @api experimental
|
|
245
313
|
# @since 2.11.0
|
|
246
314
|
def summary
|
|
247
315
|
@lock.synchronize do
|
|
316
|
+
state = if closed?
|
|
317
|
+
'closed'
|
|
318
|
+
elsif !@ready
|
|
319
|
+
'paused'
|
|
320
|
+
else
|
|
321
|
+
'ready'
|
|
322
|
+
end
|
|
248
323
|
"#<ConnectionPool size=#{unsynchronized_size} (#{min_size}-#{max_size}) " +
|
|
249
|
-
"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}>"
|
|
250
325
|
end
|
|
251
326
|
end
|
|
252
327
|
|
|
@@ -256,6 +331,9 @@ module Mongo
|
|
|
256
331
|
# @api private
|
|
257
332
|
attr_reader :populator
|
|
258
333
|
|
|
334
|
+
# @api private
|
|
335
|
+
attr_reader :max_connecting
|
|
336
|
+
|
|
259
337
|
# Checks a connection out of the pool.
|
|
260
338
|
#
|
|
261
339
|
# If there are active connections in the pool, the most recently used
|
|
@@ -274,118 +352,17 @@ module Mongo
|
|
|
274
352
|
# and remains so for longer than the wait timeout.
|
|
275
353
|
#
|
|
276
354
|
# @since 2.9.0
|
|
277
|
-
def check_out
|
|
355
|
+
def check_out(connection_global_id: nil)
|
|
278
356
|
check_invariants
|
|
279
357
|
|
|
280
358
|
publish_cmap_event(
|
|
281
359
|
Monitoring::Event::Cmap::ConnectionCheckOutStarted.new(@server.address)
|
|
282
360
|
)
|
|
283
361
|
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
Monitoring::Event::Cmap::ConnectionCheckOutFailed.new(
|
|
287
|
-
@server.address,
|
|
288
|
-
Monitoring::Event::Cmap::ConnectionCheckOutFailed::POOL_CLOSED
|
|
289
|
-
),
|
|
290
|
-
)
|
|
291
|
-
raise Error::PoolClosedError.new(@server.address, self)
|
|
292
|
-
end
|
|
362
|
+
raise_if_pool_closed!
|
|
363
|
+
raise_if_pool_paused_locked!
|
|
293
364
|
|
|
294
|
-
|
|
295
|
-
pid = Process.pid
|
|
296
|
-
connection = nil
|
|
297
|
-
# It seems that synchronize sets up its own loop, thus a simple break
|
|
298
|
-
# is insufficient to break the outer loop
|
|
299
|
-
catch(:done) do
|
|
300
|
-
loop do
|
|
301
|
-
# Lock must be taken on each iteration, rather for the method
|
|
302
|
-
# overall, otherwise other threads will not be able to check in
|
|
303
|
-
# a connection while this thread is waiting for one.
|
|
304
|
-
@lock.synchronize do
|
|
305
|
-
until @available_connections.empty?
|
|
306
|
-
connection = @available_connections.pop
|
|
307
|
-
|
|
308
|
-
if connection.pid != pid
|
|
309
|
-
log_warn("Detected PID change - Mongo client should have been reconnected (old pid #{connection.pid}, new pid #{pid}")
|
|
310
|
-
connection.disconnect!(reason: :stale)
|
|
311
|
-
@populate_semaphore.signal
|
|
312
|
-
next
|
|
313
|
-
end
|
|
314
|
-
|
|
315
|
-
if connection.generation != generation
|
|
316
|
-
# Stale connections should be disconnected in the clear
|
|
317
|
-
# method, but if any don't, check again here
|
|
318
|
-
connection.disconnect!(reason: :stale)
|
|
319
|
-
@populate_semaphore.signal
|
|
320
|
-
next
|
|
321
|
-
end
|
|
322
|
-
|
|
323
|
-
if max_idle_time && connection.last_checkin &&
|
|
324
|
-
Time.now - connection.last_checkin > max_idle_time
|
|
325
|
-
then
|
|
326
|
-
connection.disconnect!(reason: :idle)
|
|
327
|
-
@populate_semaphore.signal
|
|
328
|
-
next
|
|
329
|
-
end
|
|
330
|
-
|
|
331
|
-
@pending_connections << connection
|
|
332
|
-
throw(:done)
|
|
333
|
-
end
|
|
334
|
-
|
|
335
|
-
# Ruby does not allow a thread to lock a mutex which it already
|
|
336
|
-
# holds.
|
|
337
|
-
if unsynchronized_size < max_size
|
|
338
|
-
connection = create_connection
|
|
339
|
-
@pending_connections << connection
|
|
340
|
-
throw(:done)
|
|
341
|
-
end
|
|
342
|
-
end
|
|
343
|
-
|
|
344
|
-
wait = deadline - Time.now
|
|
345
|
-
if wait <= 0
|
|
346
|
-
publish_cmap_event(
|
|
347
|
-
Monitoring::Event::Cmap::ConnectionCheckOutFailed.new(
|
|
348
|
-
@server.address,
|
|
349
|
-
Monitoring::Event::Cmap::ConnectionCheckOutFailed::TIMEOUT,
|
|
350
|
-
),
|
|
351
|
-
)
|
|
352
|
-
|
|
353
|
-
msg = @lock.synchronize do
|
|
354
|
-
"Timed out attempting to check out a connection " +
|
|
355
|
-
"from pool for #{@server.address} after #{wait_timeout} sec. " +
|
|
356
|
-
"Connections in pool: #{@available_connections.length} available, " +
|
|
357
|
-
"#{@checked_out_connections.length} checked out, " +
|
|
358
|
-
"#{@pending_connections.length} pending " +
|
|
359
|
-
"(max size: #{max_size})"
|
|
360
|
-
end
|
|
361
|
-
raise Error::ConnectionCheckOutTimeout.new(msg, address: @server.address)
|
|
362
|
-
end
|
|
363
|
-
@available_semaphore.wait(wait)
|
|
364
|
-
end
|
|
365
|
-
end
|
|
366
|
-
|
|
367
|
-
begin
|
|
368
|
-
connect_connection(connection)
|
|
369
|
-
rescue Exception
|
|
370
|
-
# Handshake or authentication failed
|
|
371
|
-
@lock.synchronize do
|
|
372
|
-
@pending_connections.delete(connection)
|
|
373
|
-
end
|
|
374
|
-
@populate_semaphore.signal
|
|
375
|
-
|
|
376
|
-
publish_cmap_event(
|
|
377
|
-
Monitoring::Event::Cmap::ConnectionCheckOutFailed.new(
|
|
378
|
-
@server.address,
|
|
379
|
-
Monitoring::Event::Cmap::ConnectionCheckOutFailed::CONNECTION_ERROR
|
|
380
|
-
),
|
|
381
|
-
)
|
|
382
|
-
raise
|
|
383
|
-
end
|
|
384
|
-
|
|
385
|
-
@lock.synchronize do
|
|
386
|
-
@checked_out_connections << connection
|
|
387
|
-
@pending_connections.delete(connection)
|
|
388
|
-
end
|
|
365
|
+
connection = retrieve_and_connect_connection(connection_global_id)
|
|
389
366
|
|
|
390
367
|
publish_cmap_event(
|
|
391
368
|
Monitoring::Event::Cmap::ConnectionCheckedOut.new(@server.address, connection.id, self),
|
|
@@ -413,65 +390,116 @@ module Mongo
|
|
|
413
390
|
check_invariants
|
|
414
391
|
|
|
415
392
|
@lock.synchronize do
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
393
|
+
do_check_in(connection)
|
|
394
|
+
end
|
|
395
|
+
ensure
|
|
396
|
+
check_invariants
|
|
397
|
+
end
|
|
419
398
|
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
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
|
|
423
412
|
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
# Threads that begin waiting after this method completes (with
|
|
428
|
-
# 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
|
|
429
416
|
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
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.
|
|
434
422
|
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
return
|
|
438
|
-
end
|
|
423
|
+
@checked_out_connections.delete(connection)
|
|
424
|
+
@size_cv.signal
|
|
439
425
|
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
end
|
|
426
|
+
publish_cmap_event(
|
|
427
|
+
Monitoring::Event::Cmap::ConnectionCheckedIn.new(@server.address, connection.id, self)
|
|
428
|
+
)
|
|
444
429
|
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
elsif connection.generation != @generation
|
|
450
|
-
connection.disconnect!(reason: :stale)
|
|
451
|
-
@populate_semaphore.signal
|
|
452
|
-
else
|
|
453
|
-
connection.record_checkin!
|
|
454
|
-
@available_connections << connection
|
|
430
|
+
if connection.interrupted?
|
|
431
|
+
connection.disconnect!(reason: :stale)
|
|
432
|
+
return
|
|
433
|
+
end
|
|
455
434
|
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
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
|
|
460
472
|
end
|
|
461
473
|
ensure
|
|
462
474
|
check_invariants
|
|
463
475
|
end
|
|
464
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
|
+
|
|
465
490
|
# Closes all idle connections in the pool and schedules currently checked
|
|
466
491
|
# out connections to be closed when they are checked back into the pool.
|
|
467
|
-
# The pool
|
|
468
|
-
#
|
|
492
|
+
# The pool is paused, it will not create new connections in background
|
|
493
|
+
# and it will fail checkout requests until marked ready.
|
|
469
494
|
#
|
|
470
495
|
# @option options [ true | false ] :lazy If true, do not close any of
|
|
471
496
|
# the idle connections and instead let them be closed during a
|
|
472
|
-
# subsequent check out operation.
|
|
473
|
-
# @option options [ true | false ] :
|
|
474
|
-
#
|
|
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.
|
|
501
|
+
# @option options [ Object ] :service_id Clear connections with
|
|
502
|
+
# the specified service id only.
|
|
475
503
|
#
|
|
476
504
|
# @return [ true ] true.
|
|
477
505
|
#
|
|
@@ -479,36 +507,112 @@ module Mongo
|
|
|
479
507
|
def clear(options = nil)
|
|
480
508
|
raise_if_closed!
|
|
481
509
|
|
|
510
|
+
if Lint.enabled? && !@server.unknown?
|
|
511
|
+
raise Error::LintError, "Attempting to clear pool for server #{@server.summary} which is known"
|
|
512
|
+
end
|
|
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)
|
|
482
533
|
check_invariants
|
|
483
534
|
|
|
484
|
-
|
|
485
|
-
stop_populator
|
|
486
|
-
end
|
|
535
|
+
service_id = options && options[:service_id]
|
|
487
536
|
|
|
488
537
|
@lock.synchronize do
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
publish_cmap_event(
|
|
492
|
-
Monitoring::Event::Cmap::PoolCleared.new(@server.address)
|
|
493
|
-
)
|
|
538
|
+
# Generation must be bumped before emitting pool cleared event.
|
|
539
|
+
@generation_manager.bump(service_id: service_id)
|
|
494
540
|
|
|
495
541
|
unless options && options[:lazy]
|
|
496
|
-
|
|
497
|
-
connection = @available_connections.pop
|
|
498
|
-
connection.disconnect!(reason: :stale)
|
|
499
|
-
@populate_semaphore.signal
|
|
500
|
-
end
|
|
542
|
+
close_available_connections(service_id)
|
|
501
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?
|
|
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
|
|
502
569
|
end
|
|
503
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
|
|
504
574
|
true
|
|
505
575
|
ensure
|
|
506
576
|
check_invariants
|
|
507
577
|
end
|
|
508
578
|
|
|
509
|
-
#
|
|
510
|
-
|
|
511
|
-
|
|
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
|
|
512
616
|
|
|
513
617
|
# Marks the pool closed, closes all idle connections in the pool and
|
|
514
618
|
# schedules currently checked out connections to be closed when they are
|
|
@@ -518,6 +622,8 @@ module Mongo
|
|
|
518
622
|
#
|
|
519
623
|
# @option options [ true | false ] :force Also close all checked out
|
|
520
624
|
# connections.
|
|
625
|
+
# @option options [ true | false ] :stay_ready For internal driver use
|
|
626
|
+
# only. Whether or not to mark the pool as closed.
|
|
521
627
|
#
|
|
522
628
|
# @return [ true ] Always true.
|
|
523
629
|
#
|
|
@@ -543,9 +649,15 @@ module Mongo
|
|
|
543
649
|
end
|
|
544
650
|
end
|
|
545
651
|
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
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
|
|
549
661
|
end
|
|
550
662
|
|
|
551
663
|
publish_cmap_event(
|
|
@@ -567,6 +679,9 @@ module Mongo
|
|
|
567
679
|
if closed?
|
|
568
680
|
"#<Mongo::Server::ConnectionPool:0x#{object_id} min_size=#{min_size} max_size=#{max_size} " +
|
|
569
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>"
|
|
570
685
|
else
|
|
571
686
|
"#<Mongo::Server::ConnectionPool:0x#{object_id} min_size=#{min_size} max_size=#{max_size} " +
|
|
572
687
|
"wait_timeout=#{wait_timeout} current_size=#{size} available=#{available_count}>"
|
|
@@ -583,11 +698,13 @@ module Mongo
|
|
|
583
698
|
# @return [ Object ] The result of the block.
|
|
584
699
|
#
|
|
585
700
|
# @since 2.0.0
|
|
586
|
-
def with_connection
|
|
701
|
+
def with_connection(connection_global_id: nil)
|
|
587
702
|
raise_if_closed!
|
|
588
703
|
|
|
589
|
-
connection = check_out
|
|
704
|
+
connection = check_out(connection_global_id: connection_global_id)
|
|
590
705
|
yield(connection)
|
|
706
|
+
rescue Error::SocketError, Error::SocketTimeoutError, Error::ConnectionPerished => e
|
|
707
|
+
maybe_raise_pool_cleared!(connection, e)
|
|
591
708
|
ensure
|
|
592
709
|
if connection
|
|
593
710
|
check_in(connection)
|
|
@@ -636,17 +753,17 @@ module Mongo
|
|
|
636
753
|
# connections waiting to be connected, connections which have not yet
|
|
637
754
|
# been moved to available_connections, or connections moved to available_connections
|
|
638
755
|
# but not deleted from pending_connections. These should be cleaned up.
|
|
639
|
-
|
|
640
|
-
connection = @pending_connections.take(1).first
|
|
641
|
-
connection.disconnect!
|
|
642
|
-
@pending_connections.delete(connection)
|
|
643
|
-
end
|
|
756
|
+
clear_pending_connections
|
|
644
757
|
end
|
|
645
758
|
end
|
|
646
759
|
|
|
647
|
-
#
|
|
648
|
-
#
|
|
649
|
-
#
|
|
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.
|
|
650
767
|
#
|
|
651
768
|
# Used by the pool populator background thread.
|
|
652
769
|
#
|
|
@@ -668,11 +785,6 @@ module Mongo
|
|
|
668
785
|
end
|
|
669
786
|
|
|
670
787
|
return create_and_add_connection
|
|
671
|
-
rescue Error::AuthError, Error
|
|
672
|
-
# wake up one thread waiting for connections, since one could not
|
|
673
|
-
# be created here, and can instead be created in flow
|
|
674
|
-
@available_semaphore.signal
|
|
675
|
-
raise
|
|
676
788
|
end
|
|
677
789
|
|
|
678
790
|
# Finalize the connection pool for garbage collection.
|
|
@@ -684,8 +796,6 @@ module Mongo
|
|
|
684
796
|
# @return [ Proc ] The Finalizer.
|
|
685
797
|
def self.finalize(available_connections, pending_connections, populator)
|
|
686
798
|
proc do
|
|
687
|
-
populator.stop!
|
|
688
|
-
|
|
689
799
|
available_connections.each do |connection|
|
|
690
800
|
connection.disconnect!(reason: :pool_closed)
|
|
691
801
|
end
|
|
@@ -704,12 +814,41 @@ module Mongo
|
|
|
704
814
|
|
|
705
815
|
private
|
|
706
816
|
|
|
817
|
+
# Returns the next available connection, optionally with given
|
|
818
|
+
# global id. If no suitable connections are available,
|
|
819
|
+
# returns nil.
|
|
820
|
+
def next_available_connection(connection_global_id)
|
|
821
|
+
raise_unless_locked!
|
|
822
|
+
|
|
823
|
+
if @server.load_balancer? && connection_global_id
|
|
824
|
+
conn = @available_connections.detect do |conn|
|
|
825
|
+
conn.global_id == connection_global_id
|
|
826
|
+
end
|
|
827
|
+
if conn
|
|
828
|
+
@available_connections.delete(conn)
|
|
829
|
+
end
|
|
830
|
+
conn
|
|
831
|
+
else
|
|
832
|
+
@available_connections.pop
|
|
833
|
+
end
|
|
834
|
+
end
|
|
835
|
+
|
|
707
836
|
def create_connection
|
|
708
|
-
|
|
709
|
-
|
|
837
|
+
r, _ = @generation_manager.pipe_fds(service_id: server.description.service_id)
|
|
838
|
+
opts = options.merge(
|
|
839
|
+
connection_pool: self,
|
|
840
|
+
pipe: r
|
|
841
|
+
# Do not pass app metadata - this will be retrieved by the connection
|
|
842
|
+
# based on the auth needs.
|
|
843
|
+
)
|
|
844
|
+
unless @server.load_balancer?
|
|
845
|
+
opts[:generation] = generation
|
|
846
|
+
end
|
|
847
|
+
Connection.new(@server, opts)
|
|
710
848
|
end
|
|
711
849
|
|
|
712
|
-
# 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.
|
|
713
852
|
#
|
|
714
853
|
# @return [ true | false ] True if a connection was created and
|
|
715
854
|
# added to the pool, false otherwise
|
|
@@ -718,10 +857,15 @@ module Mongo
|
|
|
718
857
|
connection = nil
|
|
719
858
|
|
|
720
859
|
@lock.synchronize do
|
|
721
|
-
if !closed? &&
|
|
860
|
+
if !closed? && @ready &&
|
|
861
|
+
(unsynchronized_size + @connection_requests) < min_size &&
|
|
862
|
+
@pending_connections.length < @max_connecting
|
|
863
|
+
then
|
|
722
864
|
connection = create_connection
|
|
723
865
|
@pending_connections << connection
|
|
724
866
|
else
|
|
867
|
+
return true if remove_interrupted_connections
|
|
868
|
+
return true if remove_stale_connection
|
|
725
869
|
return false
|
|
726
870
|
end
|
|
727
871
|
end
|
|
@@ -731,6 +875,8 @@ module Mongo
|
|
|
731
875
|
rescue Exception
|
|
732
876
|
@lock.synchronize do
|
|
733
877
|
@pending_connections.delete(connection)
|
|
878
|
+
@max_connecting_cv.signal
|
|
879
|
+
@size_cv.signal
|
|
734
880
|
end
|
|
735
881
|
raise
|
|
736
882
|
end
|
|
@@ -738,14 +884,65 @@ module Mongo
|
|
|
738
884
|
@lock.synchronize do
|
|
739
885
|
@available_connections << connection
|
|
740
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
|
|
741
902
|
|
|
742
|
-
|
|
743
|
-
|
|
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)
|
|
744
931
|
end
|
|
745
932
|
|
|
746
933
|
true
|
|
747
934
|
end
|
|
748
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
|
+
|
|
749
946
|
# Asserts that the pool has not been closed.
|
|
750
947
|
#
|
|
751
948
|
# @raise [ Error::PoolClosedError ] If the pool has been closed.
|
|
@@ -757,6 +954,25 @@ module Mongo
|
|
|
757
954
|
end
|
|
758
955
|
end
|
|
759
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
|
+
|
|
760
976
|
# Attempts to connect (handshake and auth) the connection. If an error is
|
|
761
977
|
# encountered, closes the connection and raises the error.
|
|
762
978
|
def connect_connection(connection)
|
|
@@ -766,6 +982,13 @@ module Mongo
|
|
|
766
982
|
connection.disconnect!(reason: :error)
|
|
767
983
|
raise
|
|
768
984
|
end
|
|
985
|
+
rescue Error::SocketError, Error::SocketTimeoutError => exc
|
|
986
|
+
@server.unknown!(
|
|
987
|
+
generation: exc.generation,
|
|
988
|
+
service_id: exc.service_id,
|
|
989
|
+
stop_push_monitor: true,
|
|
990
|
+
)
|
|
991
|
+
raise
|
|
769
992
|
end
|
|
770
993
|
|
|
771
994
|
def check_invariants
|
|
@@ -789,6 +1012,353 @@ module Mongo
|
|
|
789
1012
|
end
|
|
790
1013
|
end
|
|
791
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
|
|
792
1359
|
end
|
|
793
1360
|
end
|
|
794
1361
|
end
|
|
1362
|
+
|
|
1363
|
+
require 'mongo/server/connection_pool/generation_manager'
|
|
1364
|
+
require 'mongo/server/connection_pool/populator'
|