mongo 2.12.1 → 2.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/CONTRIBUTING.md +8 -36
- data/LICENSE +1 -1
- data/README.md +54 -54
- data/Rakefile +16 -10
- data/lib/mongo.rb +8 -3
- data/lib/mongo/active_support.rb +1 -1
- data/lib/mongo/address.rb +78 -37
- data/lib/mongo/address/ipv4.rb +32 -5
- data/lib/mongo/address/ipv6.rb +32 -5
- data/lib/mongo/address/unix.rb +3 -3
- data/lib/mongo/address/validator.rb +1 -1
- data/lib/mongo/auth.rb +36 -13
- data/lib/mongo/auth/aws.rb +37 -0
- data/lib/mongo/auth/aws/conversation.rb +128 -0
- data/lib/mongo/auth/aws/credentials_retriever.rb +219 -0
- data/lib/mongo/auth/aws/request.rb +283 -0
- data/lib/mongo/auth/base.rb +129 -0
- data/lib/mongo/auth/conversation_base.rb +52 -0
- data/lib/mongo/auth/cr.rb +9 -36
- data/lib/mongo/auth/cr/conversation.rb +24 -69
- data/lib/mongo/auth/credential_cache.rb +1 -1
- data/lib/mongo/auth/gssapi.rb +38 -0
- data/lib/mongo/auth/gssapi/conversation.rb +108 -0
- data/lib/mongo/auth/ldap.rb +9 -34
- data/lib/mongo/auth/ldap/conversation.rb +3 -43
- data/lib/mongo/auth/roles.rb +1 -1
- data/lib/mongo/auth/sasl_conversation_base.rb +111 -0
- data/lib/mongo/auth/scram.rb +39 -51
- data/lib/mongo/auth/scram/conversation.rb +12 -506
- data/lib/mongo/auth/scram256.rb +31 -0
- data/lib/mongo/auth/scram256/conversation.rb +63 -0
- data/lib/mongo/auth/scram_conversation_base.rb +402 -0
- data/lib/mongo/auth/stringprep.rb +5 -4
- data/lib/mongo/auth/stringprep/profiles/sasl.rb +2 -1
- data/lib/mongo/auth/stringprep/tables.rb +2 -1
- data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +1 -0
- data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +1 -0
- data/lib/mongo/auth/user.rb +2 -2
- data/lib/mongo/auth/user/view.rb +1 -1
- data/lib/mongo/auth/x509.rb +14 -32
- data/lib/mongo/auth/x509/conversation.rb +15 -42
- data/lib/mongo/background_thread.rb +11 -2
- data/lib/mongo/bson.rb +1 -1
- data/lib/mongo/bulk_write.rb +62 -26
- data/lib/mongo/bulk_write/combineable.rb +20 -8
- data/lib/mongo/bulk_write/ordered_combiner.rb +1 -1
- data/lib/mongo/bulk_write/result.rb +1 -1
- data/lib/mongo/bulk_write/result_combiner.rb +1 -1
- data/lib/mongo/bulk_write/transformable.rb +9 -10
- data/lib/mongo/bulk_write/unordered_combiner.rb +1 -1
- data/lib/mongo/bulk_write/validatable.rb +5 -1
- data/lib/mongo/client.rb +214 -31
- data/lib/mongo/client_encryption.rb +1 -1
- data/lib/mongo/cluster.rb +177 -69
- data/lib/mongo/cluster/periodic_executor.rb +1 -1
- data/lib/mongo/cluster/reapers/cursor_reaper.rb +1 -1
- data/lib/mongo/cluster/reapers/socket_reaper.rb +1 -1
- data/lib/mongo/cluster/sdam_flow.rb +36 -17
- data/lib/mongo/cluster/topology.rb +19 -2
- data/lib/mongo/cluster/topology/base.rb +1 -1
- data/lib/mongo/cluster/topology/no_replica_set_options.rb +1 -1
- data/lib/mongo/cluster/topology/replica_set_no_primary.rb +4 -3
- data/lib/mongo/cluster/topology/replica_set_with_primary.rb +1 -1
- data/lib/mongo/cluster/topology/sharded.rb +2 -2
- data/lib/mongo/cluster/topology/single.rb +2 -2
- data/lib/mongo/cluster/topology/unknown.rb +1 -1
- data/lib/mongo/cluster_time.rb +1 -1
- data/lib/mongo/collection.rb +39 -15
- data/lib/mongo/collection/view.rb +6 -2
- data/lib/mongo/collection/view/aggregation.rb +6 -3
- data/lib/mongo/collection/view/builder.rb +1 -1
- data/lib/mongo/collection/view/builder/aggregation.rb +1 -1
- data/lib/mongo/collection/view/builder/find_command.rb +9 -1
- data/lib/mongo/collection/view/builder/flags.rb +1 -1
- data/lib/mongo/collection/view/builder/map_reduce.rb +1 -1
- data/lib/mongo/collection/view/builder/modifiers.rb +1 -1
- data/lib/mongo/collection/view/builder/op_query.rb +1 -1
- data/lib/mongo/collection/view/change_stream.rb +3 -6
- data/lib/mongo/collection/view/change_stream/retryable.rb +1 -1
- data/lib/mongo/collection/view/explainable.rb +1 -1
- data/lib/mongo/collection/view/immutable.rb +1 -1
- data/lib/mongo/collection/view/iterable.rb +8 -2
- data/lib/mongo/collection/view/map_reduce.rb +7 -4
- data/lib/mongo/collection/view/readable.rb +13 -3
- data/lib/mongo/collection/view/writable.rb +93 -13
- data/lib/mongo/crypt.rb +1 -1
- data/lib/mongo/crypt/auto_decryption_context.rb +1 -1
- data/lib/mongo/crypt/auto_encrypter.rb +1 -1
- data/lib/mongo/crypt/auto_encryption_context.rb +1 -1
- data/lib/mongo/crypt/binary.rb +1 -1
- data/lib/mongo/crypt/binding.rb +1 -1
- data/lib/mongo/crypt/context.rb +1 -1
- data/lib/mongo/crypt/data_key_context.rb +1 -1
- data/lib/mongo/crypt/encryption_io.rb +41 -24
- data/lib/mongo/crypt/explicit_decryption_context.rb +1 -1
- data/lib/mongo/crypt/explicit_encrypter.rb +1 -1
- data/lib/mongo/crypt/explicit_encryption_context.rb +1 -1
- data/lib/mongo/crypt/handle.rb +1 -1
- data/lib/mongo/crypt/hooks.rb +1 -1
- data/lib/mongo/crypt/kms_context.rb +1 -1
- data/lib/mongo/crypt/status.rb +1 -1
- data/lib/mongo/cursor.rb +3 -3
- data/lib/mongo/cursor/builder.rb +1 -1
- data/lib/mongo/cursor/builder/get_more_command.rb +1 -1
- data/lib/mongo/cursor/builder/kill_cursors_command.rb +1 -1
- data/lib/mongo/cursor/builder/op_get_more.rb +1 -1
- data/lib/mongo/cursor/builder/op_kill_cursors.rb +1 -1
- data/lib/mongo/database.rb +35 -5
- data/lib/mongo/database/view.rb +21 -6
- data/lib/mongo/dbref.rb +1 -1
- data/lib/mongo/distinguishing_semaphore.rb +55 -0
- data/lib/mongo/error.rb +28 -2
- data/lib/mongo/error/auth_error.rb +1 -1
- data/lib/mongo/error/bulk_write_error.rb +1 -1
- data/lib/mongo/error/change_stream_resumable.rb +1 -1
- data/lib/mongo/error/closed_stream.rb +1 -1
- data/lib/mongo/error/connection_check_out_timeout.rb +1 -1
- data/lib/mongo/error/connection_perished.rb +23 -0
- data/lib/mongo/error/credential_check_error.rb +26 -0
- data/lib/mongo/error/extra_file_chunk.rb +1 -1
- data/lib/mongo/error/file_not_found.rb +1 -1
- data/lib/mongo/error/handshake_error.rb +1 -1
- data/lib/mongo/error/insufficient_iteration_count.rb +1 -1
- data/lib/mongo/error/invalid_address.rb +1 -1
- data/lib/mongo/error/invalid_application_name.rb +1 -1
- data/lib/mongo/error/invalid_bulk_operation.rb +1 -1
- data/lib/mongo/error/invalid_bulk_operation_type.rb +1 -1
- data/lib/mongo/error/invalid_collection_name.rb +1 -1
- data/lib/mongo/error/invalid_cursor_operation.rb +1 -1
- data/lib/mongo/error/invalid_database_name.rb +1 -1
- data/lib/mongo/error/invalid_document.rb +1 -1
- data/lib/mongo/error/invalid_file.rb +1 -1
- data/lib/mongo/error/invalid_file_revision.rb +1 -1
- data/lib/mongo/error/invalid_min_pool_size.rb +1 -1
- data/lib/mongo/error/invalid_nonce.rb +2 -2
- data/lib/mongo/error/invalid_read_option.rb +1 -1
- data/lib/mongo/error/invalid_replacement_document.rb +1 -1
- data/lib/mongo/error/invalid_server_auth_host.rb +22 -0
- data/lib/mongo/error/invalid_server_auth_response.rb +23 -0
- data/lib/mongo/error/invalid_server_preference.rb +6 -1
- data/lib/mongo/error/invalid_session.rb +3 -2
- data/lib/mongo/error/invalid_signature.rb +1 -1
- data/lib/mongo/error/invalid_transaction_operation.rb +1 -1
- data/lib/mongo/error/invalid_txt_record.rb +1 -1
- data/lib/mongo/error/invalid_update_document.rb +1 -1
- data/lib/mongo/error/invalid_uri.rb +1 -1
- data/lib/mongo/error/invalid_write_concern.rb +1 -1
- data/lib/mongo/error/lint_error.rb +1 -1
- data/lib/mongo/error/max_bson_size.rb +1 -1
- data/lib/mongo/error/max_message_size.rb +1 -1
- data/lib/mongo/error/mismatched_domain.rb +1 -1
- data/lib/mongo/error/missing_file_chunk.rb +1 -1
- data/lib/mongo/error/missing_password.rb +1 -1
- data/lib/mongo/error/missing_resume_token.rb +1 -1
- data/lib/mongo/error/missing_scram_server_signature.rb +27 -0
- data/lib/mongo/error/multi_index_drop.rb +1 -1
- data/lib/mongo/error/need_primary_server.rb +1 -1
- data/lib/mongo/error/no_server_available.rb +1 -1
- data/lib/mongo/error/no_srv_records.rb +1 -1
- data/lib/mongo/error/notable.rb +18 -3
- data/lib/mongo/error/operation_failure.rb +63 -44
- data/lib/mongo/error/parser.rb +16 -5
- data/lib/mongo/error/pool_closed_error.rb +1 -1
- data/lib/mongo/error/raise_original_error.rb +29 -0
- data/lib/mongo/error/session_ended.rb +1 -1
- data/lib/mongo/error/sessions_not_supported.rb +35 -0
- data/lib/mongo/error/socket_error.rb +1 -1
- data/lib/mongo/error/socket_timeout_error.rb +1 -1
- data/lib/mongo/error/unchangeable_collection_option.rb +1 -1
- data/lib/mongo/error/unexpected_chunk_length.rb +1 -1
- data/lib/mongo/error/unexpected_response.rb +1 -1
- data/lib/mongo/error/unknown_payload_type.rb +1 -1
- data/lib/mongo/error/unsupported_array_filters.rb +7 -2
- data/lib/mongo/error/unsupported_collation.rb +7 -2
- data/lib/mongo/error/unsupported_features.rb +1 -1
- data/lib/mongo/error/unsupported_message_type.rb +1 -1
- data/lib/mongo/error/unsupported_option.rb +99 -0
- data/lib/mongo/error/write_retryable.rb +1 -1
- data/lib/mongo/event.rb +1 -1
- data/lib/mongo/event/base.rb +7 -1
- data/lib/mongo/event/listeners.rb +1 -1
- data/lib/mongo/event/publisher.rb +1 -1
- data/lib/mongo/event/subscriber.rb +1 -1
- data/lib/mongo/grid.rb +1 -1
- data/lib/mongo/grid/file.rb +6 -1
- data/lib/mongo/grid/file/chunk.rb +3 -1
- data/lib/mongo/grid/file/info.rb +1 -1
- data/lib/mongo/grid/fs_bucket.rb +22 -15
- data/lib/mongo/grid/stream.rb +1 -1
- data/lib/mongo/grid/stream/read.rb +1 -1
- data/lib/mongo/grid/stream/write.rb +10 -4
- data/lib/mongo/id.rb +1 -1
- data/lib/mongo/index.rb +2 -1
- data/lib/mongo/index/view.rb +61 -11
- data/lib/mongo/lint.rb +10 -0
- data/lib/mongo/loggable.rb +1 -1
- data/lib/mongo/logger.rb +1 -1
- data/lib/mongo/monitoring.rb +39 -1
- data/lib/mongo/monitoring/cmap_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/command_log_subscriber.rb +20 -5
- data/lib/mongo/monitoring/event.rb +1 -1
- data/lib/mongo/monitoring/event/cmap.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/base.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/connection_closed.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/connection_created.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/connection_ready.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/pool_closed.rb +1 -1
- data/lib/mongo/monitoring/event/cmap/pool_created.rb +1 -1
- data/lib/mongo/monitoring/event/command_failed.rb +12 -1
- data/lib/mongo/monitoring/event/command_started.rb +44 -3
- data/lib/mongo/monitoring/event/command_succeeded.rb +12 -1
- data/lib/mongo/monitoring/event/secure.rb +8 -2
- data/lib/mongo/monitoring/event/server_closed.rb +2 -2
- data/lib/mongo/monitoring/event/server_description_changed.rb +28 -5
- data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +10 -3
- data/lib/mongo/monitoring/event/server_heartbeat_started.rb +10 -3
- data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +10 -3
- data/lib/mongo/monitoring/event/server_opening.rb +2 -2
- data/lib/mongo/monitoring/event/topology_changed.rb +2 -2
- data/lib/mongo/monitoring/event/topology_closed.rb +2 -2
- data/lib/mongo/monitoring/event/topology_opening.rb +2 -2
- data/lib/mongo/monitoring/publishable.rb +9 -9
- data/lib/mongo/monitoring/sdam_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/server_closed_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +10 -2
- data/lib/mongo/monitoring/server_opening_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +2 -2
- data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +1 -1
- data/lib/mongo/operation.rb +1 -0
- data/lib/mongo/operation/aggregate.rb +1 -1
- data/lib/mongo/operation/aggregate/command.rb +5 -5
- data/lib/mongo/operation/aggregate/op_msg.rb +1 -1
- data/lib/mongo/operation/aggregate/result.rb +1 -1
- data/lib/mongo/operation/collections_info.rb +3 -36
- data/lib/mongo/operation/collections_info/command.rb +40 -0
- data/lib/mongo/operation/collections_info/result.rb +1 -1
- data/lib/mongo/operation/command.rb +1 -1
- data/lib/mongo/operation/command/command.rb +3 -3
- data/lib/mongo/operation/command/op_msg.rb +1 -1
- data/lib/mongo/operation/count.rb +1 -1
- data/lib/mongo/operation/count/command.rb +3 -3
- data/lib/mongo/operation/count/op_msg.rb +1 -1
- data/lib/mongo/operation/create.rb +1 -1
- data/lib/mongo/operation/create/command.rb +3 -3
- data/lib/mongo/operation/create/op_msg.rb +1 -1
- data/lib/mongo/operation/create_index.rb +1 -1
- data/lib/mongo/operation/create_index/command.rb +4 -4
- data/lib/mongo/operation/create_index/op_msg.rb +6 -3
- data/lib/mongo/operation/create_user.rb +1 -1
- data/lib/mongo/operation/create_user/command.rb +4 -4
- data/lib/mongo/operation/create_user/op_msg.rb +2 -2
- data/lib/mongo/operation/delete.rb +1 -1
- data/lib/mongo/operation/delete/bulk_result.rb +1 -1
- data/lib/mongo/operation/delete/command.rb +4 -4
- data/lib/mongo/operation/delete/legacy.rb +2 -2
- data/lib/mongo/operation/delete/op_msg.rb +4 -4
- data/lib/mongo/operation/delete/result.rb +2 -2
- data/lib/mongo/operation/distinct.rb +1 -1
- data/lib/mongo/operation/distinct/command.rb +3 -3
- data/lib/mongo/operation/distinct/op_msg.rb +1 -1
- data/lib/mongo/operation/drop.rb +1 -1
- data/lib/mongo/operation/drop/command.rb +3 -3
- data/lib/mongo/operation/drop/op_msg.rb +1 -1
- data/lib/mongo/operation/drop_database.rb +1 -1
- data/lib/mongo/operation/drop_database/command.rb +3 -3
- data/lib/mongo/operation/drop_database/op_msg.rb +1 -1
- data/lib/mongo/operation/drop_index.rb +1 -1
- data/lib/mongo/operation/drop_index/command.rb +4 -4
- data/lib/mongo/operation/drop_index/op_msg.rb +2 -2
- data/lib/mongo/operation/explain.rb +1 -1
- data/lib/mongo/operation/explain/command.rb +3 -3
- data/lib/mongo/operation/explain/legacy.rb +3 -3
- data/lib/mongo/operation/explain/op_msg.rb +1 -1
- data/lib/mongo/operation/explain/result.rb +1 -1
- data/lib/mongo/operation/find.rb +1 -1
- data/lib/mongo/operation/find/command.rb +3 -3
- data/lib/mongo/operation/find/legacy.rb +3 -3
- data/lib/mongo/operation/find/legacy/result.rb +1 -1
- data/lib/mongo/operation/find/op_msg.rb +2 -12
- data/lib/mongo/operation/find/result.rb +1 -1
- data/lib/mongo/operation/get_more.rb +1 -1
- data/lib/mongo/operation/get_more/command.rb +3 -3
- data/lib/mongo/operation/get_more/legacy.rb +2 -2
- data/lib/mongo/operation/get_more/op_msg.rb +2 -12
- data/lib/mongo/operation/get_more/result.rb +1 -1
- data/lib/mongo/operation/indexes.rb +1 -1
- data/lib/mongo/operation/indexes/command.rb +3 -3
- data/lib/mongo/operation/indexes/legacy.rb +4 -4
- data/lib/mongo/operation/indexes/op_msg.rb +1 -1
- data/lib/mongo/operation/indexes/result.rb +1 -1
- data/lib/mongo/operation/insert.rb +3 -2
- data/lib/mongo/operation/insert/bulk_result.rb +6 -2
- data/lib/mongo/operation/insert/command.rb +7 -7
- data/lib/mongo/operation/insert/legacy.rb +9 -5
- data/lib/mongo/operation/insert/op_msg.rb +6 -6
- data/lib/mongo/operation/insert/result.rb +7 -4
- data/lib/mongo/operation/kill_cursors.rb +1 -1
- data/lib/mongo/operation/kill_cursors/command.rb +3 -3
- data/lib/mongo/operation/kill_cursors/legacy.rb +2 -2
- data/lib/mongo/operation/kill_cursors/op_msg.rb +1 -1
- data/lib/mongo/operation/list_collections.rb +1 -1
- data/lib/mongo/operation/list_collections/command.rb +4 -4
- data/lib/mongo/operation/list_collections/op_msg.rb +2 -2
- data/lib/mongo/operation/list_collections/result.rb +1 -1
- data/lib/mongo/operation/map_reduce.rb +1 -1
- data/lib/mongo/operation/map_reduce/command.rb +3 -3
- data/lib/mongo/operation/map_reduce/op_msg.rb +1 -1
- data/lib/mongo/operation/map_reduce/result.rb +1 -1
- data/lib/mongo/operation/op_msg_base.rb +3 -3
- data/lib/mongo/operation/parallel_scan.rb +1 -1
- data/lib/mongo/operation/parallel_scan/command.rb +5 -5
- data/lib/mongo/operation/parallel_scan/op_msg.rb +2 -2
- data/lib/mongo/operation/parallel_scan/result.rb +1 -1
- data/lib/mongo/operation/remove_user.rb +1 -1
- data/lib/mongo/operation/remove_user/command.rb +4 -4
- data/lib/mongo/operation/remove_user/op_msg.rb +2 -2
- data/lib/mongo/operation/result.rb +28 -4
- data/lib/mongo/operation/shared/bypass_document_validation.rb +10 -4
- data/lib/mongo/operation/shared/causal_consistency_supported.rb +3 -3
- data/lib/mongo/operation/shared/collections_info_or_list_collections.rb +56 -0
- data/lib/mongo/operation/shared/executable.rb +46 -28
- data/lib/mongo/operation/shared/executable_no_validate.rb +3 -3
- data/lib/mongo/operation/shared/executable_transaction_label.rb +1 -1
- data/lib/mongo/operation/shared/idable.rb +1 -1
- data/lib/mongo/operation/shared/limited.rb +10 -2
- data/lib/mongo/operation/shared/object_id_generator.rb +1 -1
- data/lib/mongo/operation/shared/op_msg_or_command.rb +7 -5
- data/lib/mongo/operation/shared/op_msg_or_find_command.rb +8 -6
- data/lib/mongo/operation/shared/op_msg_or_list_indexes_command.rb +8 -6
- data/lib/mongo/operation/shared/polymorphic_lookup.rb +1 -1
- data/lib/mongo/operation/shared/polymorphic_result.rb +1 -1
- data/lib/mongo/operation/shared/read_preference_supported.rb +19 -16
- data/lib/mongo/operation/shared/response_handling.rb +83 -8
- data/lib/mongo/operation/shared/result/aggregatable.rb +1 -1
- data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +1 -1
- data/lib/mongo/operation/shared/sessions_supported.rb +50 -27
- data/lib/mongo/operation/shared/specifiable.rb +32 -20
- data/lib/mongo/operation/shared/write.rb +25 -19
- data/lib/mongo/operation/shared/write_concern_supported.rb +6 -6
- data/lib/mongo/operation/update.rb +1 -1
- data/lib/mongo/operation/update/bulk_result.rb +1 -1
- data/lib/mongo/operation/update/command.rb +4 -4
- data/lib/mongo/operation/update/legacy.rb +2 -2
- data/lib/mongo/operation/update/legacy/result.rb +1 -1
- data/lib/mongo/operation/update/op_msg.rb +4 -4
- data/lib/mongo/operation/update/result.rb +2 -2
- data/lib/mongo/operation/update_user.rb +1 -1
- data/lib/mongo/operation/update_user/command.rb +4 -4
- data/lib/mongo/operation/update_user/op_msg.rb +2 -2
- data/lib/mongo/operation/users_info.rb +1 -1
- data/lib/mongo/operation/users_info/command.rb +4 -4
- data/lib/mongo/operation/users_info/op_msg.rb +2 -2
- data/lib/mongo/operation/users_info/result.rb +1 -1
- data/lib/mongo/options.rb +1 -1
- data/lib/mongo/options/mapper.rb +1 -1
- data/lib/mongo/options/redacted.rb +1 -1
- data/lib/mongo/protocol/bit_vector.rb +1 -1
- data/lib/mongo/protocol/compressed.rb +1 -1
- data/lib/mongo/protocol/delete.rb +1 -1
- data/lib/mongo/protocol/get_more.rb +1 -1
- data/lib/mongo/protocol/insert.rb +1 -1
- data/lib/mongo/protocol/kill_cursors.rb +1 -1
- data/lib/mongo/protocol/message.rb +37 -9
- data/lib/mongo/protocol/msg.rb +37 -4
- data/lib/mongo/protocol/query.rb +1 -1
- data/lib/mongo/protocol/registry.rb +1 -1
- data/lib/mongo/protocol/reply.rb +1 -1
- data/lib/mongo/protocol/serializers.rb +6 -3
- data/lib/mongo/protocol/update.rb +1 -1
- data/lib/mongo/retryable.rb +23 -10
- data/lib/mongo/semaphore.rb +1 -1
- data/lib/mongo/server.rb +40 -8
- data/lib/mongo/server/app_metadata.rb +44 -7
- data/lib/mongo/server/connection.rb +37 -133
- data/lib/mongo/server/connection_base.rb +56 -15
- data/lib/mongo/server/connection_common.rb +75 -1
- data/lib/mongo/server/connection_pool.rb +20 -1
- data/lib/mongo/server/connection_pool/populator.rb +1 -1
- data/lib/mongo/server/context.rb +1 -1
- data/lib/mongo/server/description.rb +49 -2
- data/lib/mongo/server/description/features.rb +12 -3
- data/lib/mongo/server/monitor.rb +145 -69
- data/lib/mongo/server/monitor/app_metadata.rb +1 -1
- data/lib/mongo/server/monitor/connection.rb +110 -80
- data/lib/mongo/server/pending_connection.rb +215 -3
- data/lib/mongo/server/push_monitor.rb +173 -0
- data/{spec/runners/transactions/context.rb → lib/mongo/server/push_monitor/connection.rb} +9 -14
- data/lib/mongo/server/round_trip_time_averager.rb +12 -3
- data/lib/mongo/server_selector.rb +2 -2
- data/lib/mongo/server_selector/{selectable.rb → base.rb} +159 -86
- data/lib/mongo/server_selector/nearest.rb +26 -21
- data/lib/mongo/server_selector/primary.rb +24 -28
- data/lib/mongo/server_selector/primary_preferred.rb +32 -25
- data/lib/mongo/server_selector/secondary.rb +26 -21
- data/lib/mongo/server_selector/secondary_preferred.rb +29 -34
- data/lib/mongo/session.rb +14 -1
- data/lib/mongo/session/server_session.rb +1 -1
- data/lib/mongo/session/session_pool.rb +1 -1
- data/lib/mongo/socket.rb +121 -41
- data/lib/mongo/socket/ssl.rb +98 -35
- data/lib/mongo/socket/tcp.rb +39 -31
- data/lib/mongo/socket/unix.rb +14 -6
- data/lib/mongo/srv.rb +1 -1
- data/lib/mongo/srv/monitor.rb +1 -1
- data/lib/mongo/srv/resolver.rb +1 -1
- data/lib/mongo/srv/result.rb +1 -1
- data/lib/mongo/timeout.rb +9 -9
- data/lib/mongo/topology_version.rb +89 -0
- data/lib/mongo/uri.rb +61 -47
- data/lib/mongo/uri/srv_protocol.rb +9 -1
- data/lib/mongo/utils.rb +62 -0
- data/lib/mongo/version.rb +2 -2
- data/lib/mongo/write_concern.rb +1 -1
- data/lib/mongo/write_concern/acknowledged.rb +1 -1
- data/lib/mongo/write_concern/base.rb +1 -1
- data/lib/mongo/write_concern/unacknowledged.rb +1 -1
- data/mongo.gemspec +1 -1
- data/spec/NOTES.aws-auth.md +291 -0
- data/spec/README.aws-auth.md +318 -0
- data/spec/README.md +64 -17
- data/spec/integration/auth_spec.rb +29 -9
- data/spec/integration/awaited_ismaster_spec.rb +28 -0
- data/spec/integration/aws_auth_request_spec.rb +74 -0
- data/spec/integration/aws_credentials_retriever_spec.rb +103 -0
- data/spec/integration/bulk_write_spec.rb +19 -0
- data/spec/integration/change_stream_examples_spec.rb +6 -2
- data/spec/integration/change_stream_spec.rb +123 -51
- data/spec/integration/check_clean_slate_spec.rb +16 -0
- data/spec/integration/client_construction_aws_auth_spec.rb +191 -0
- data/spec/integration/client_construction_spec.rb +2 -1
- data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +3 -3
- data/spec/integration/collection_indexes_prose_spec.rb +55 -0
- data/spec/integration/command_monitoring_spec.rb +30 -6
- data/spec/integration/command_spec.rb +11 -9
- data/spec/integration/connect_single_rs_name_spec.rb +10 -5
- data/spec/integration/connection_spec.rb +7 -3
- data/spec/integration/crud_spec.rb +32 -4
- data/spec/integration/cursor_reaping_spec.rb +14 -10
- data/spec/integration/docs_examples_spec.rb +6 -0
- data/spec/integration/fork_reconnect_spec.rb +143 -0
- data/spec/integration/get_more_spec.rb +10 -3
- data/spec/integration/grid_fs_bucket_spec.rb +48 -0
- data/spec/integration/heartbeat_events_spec.rb +5 -24
- data/spec/integration/read_concern_spec.rb +1 -1
- data/spec/integration/read_preference_spec.rb +41 -11
- data/spec/integration/reconnect_spec.rb +2 -3
- data/spec/integration/retryable_errors_spec.rb +33 -14
- data/spec/integration/{retryable_writes_spec.rb → retryable_writes/retryable_writes_36_and_older_spec.rb} +55 -51
- data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +401 -0
- data/spec/integration/retryable_writes/shared/adds_diagnostics.rb +15 -0
- data/spec/integration/retryable_writes/shared/does_not_support_retries.rb +24 -0
- data/spec/integration/retryable_writes/shared/only_supports_legacy_retries.rb +25 -0
- data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +215 -0
- data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +232 -0
- data/spec/integration/retryable_writes/shared/performs_no_retries.rb +110 -0
- data/spec/integration/retryable_writes/shared/supports_legacy_retries.rb +19 -0
- data/spec/integration/retryable_writes/shared/supports_modern_retries.rb +25 -0
- data/spec/integration/retryable_writes/shared/supports_retries.rb +16 -0
- data/spec/integration/sdam_error_handling_spec.rb +142 -22
- data/spec/integration/sdam_events_spec.rb +77 -5
- data/spec/integration/sdam_prose_spec.rb +64 -0
- data/spec/integration/server_monitor_spec.rb +25 -1
- data/spec/integration/server_spec.rb +42 -26
- data/spec/integration/size_limit_spec.rb +26 -9
- data/spec/integration/ssl_uri_options_spec.rb +2 -2
- data/spec/integration/step_down_spec.rb +15 -15
- data/spec/integration/transactions_api_examples_spec.rb +59 -0
- data/spec/integration/transactions_examples_spec.rb +5 -2
- data/spec/integration/x509_auth_spec.rb +109 -0
- data/spec/integration/zlib_compression_spec.rb +25 -0
- data/spec/kerberos/kerberos_spec.rb +10 -6
- data/spec/lite_spec_helper.rb +31 -22
- data/spec/mongo/address/ipv4_spec.rb +1 -1
- data/spec/mongo/address_spec.rb +2 -2
- data/spec/mongo/auth/aws/request_region_spec.rb +42 -0
- data/spec/mongo/auth/aws/request_spec.rb +76 -0
- data/spec/mongo/auth/cr_spec.rb +7 -7
- data/spec/mongo/auth/gssapi/conversation_spec.rb +121 -0
- data/spec/mongo/auth/invalid_mechanism_spec.rb +1 -1
- data/spec/mongo/auth/ldap/conversation_spec.rb +1 -1
- data/spec/mongo/auth/ldap_spec.rb +3 -3
- data/spec/mongo/auth/scram/conversation_spec.rb +119 -334
- data/spec/mongo/auth/scram256/conversation_spec.rb +171 -0
- data/spec/mongo/auth/{scram/negotiation_spec.rb → scram_negotiation_spec.rb} +13 -8
- data/spec/mongo/auth/scram_spec.rb +29 -69
- data/spec/mongo/auth/user_spec.rb +1 -1
- data/spec/mongo/auth/x509/conversation_spec.rb +1 -1
- data/spec/mongo/auth/x509_spec.rb +8 -8
- data/spec/mongo/auth_spec.rb +4 -4
- data/spec/mongo/bulk_write_spec.rb +206 -2
- data/spec/mongo/client_construction_spec.rb +609 -86
- data/spec/mongo/client_spec.rb +59 -5
- data/spec/mongo/cluster/topology/replica_set_spec.rb +52 -9
- data/spec/mongo/cluster/topology/single_spec.rb +4 -2
- data/spec/mongo/cluster_spec.rb +37 -36
- data/spec/mongo/collection/view/aggregation_spec.rb +6 -2
- data/spec/mongo/collection/view/builder/find_command_spec.rb +17 -6
- data/spec/mongo/collection/view/change_stream_resume_spec.rb +392 -0
- data/spec/mongo/collection/view/change_stream_spec.rb +0 -318
- data/spec/mongo/collection/view/iterable_spec.rb +38 -0
- data/spec/mongo/collection/view/map_reduce_spec.rb +6 -2
- data/spec/mongo/collection/view/readable_spec.rb +15 -1
- data/spec/mongo/collection/view/writable_spec.rb +208 -1
- data/spec/mongo/collection_spec.rb +531 -43
- data/spec/mongo/cursor/builder/get_more_command_spec.rb +6 -1
- data/spec/mongo/cursor/builder/op_get_more_spec.rb +6 -1
- data/spec/mongo/cursor/builder/op_kill_cursors_spec.rb +6 -1
- data/spec/mongo/cursor_spec.rb +9 -1
- data/spec/mongo/database_spec.rb +251 -10
- data/spec/mongo/distinguishing_semaphore_spec.rb +63 -0
- data/spec/mongo/error/operation_failure_heavy_spec.rb +58 -0
- data/spec/mongo/error/operation_failure_spec.rb +167 -69
- data/spec/mongo/error/unsupported_option_spec.rb +54 -0
- data/spec/mongo/grid/fs_bucket_spec.rb +18 -0
- data/spec/mongo/grid/stream/write_spec.rb +32 -0
- data/spec/mongo/index/view_spec.rb +312 -0
- data/spec/mongo/monitoring/event/server_description_changed_spec.rb +1 -4
- data/spec/mongo/operation/aggregate/result_spec.rb +6 -1
- data/spec/mongo/operation/delete/bulk_spec.rb +18 -6
- data/spec/mongo/operation/delete/op_msg_spec.rb +22 -14
- data/spec/mongo/operation/find/legacy_spec.rb +27 -7
- data/spec/mongo/operation/get_more_spec.rb +6 -1
- data/spec/mongo/operation/insert/bulk_spec.rb +21 -7
- data/spec/mongo/operation/insert/command_spec.rb +4 -0
- data/spec/mongo/operation/insert/op_msg_spec.rb +22 -14
- data/spec/mongo/operation/limited_spec.rb +5 -3
- data/spec/mongo/operation/read_preference_legacy_spec.rb +16 -4
- data/spec/mongo/operation/read_preference_op_msg_spec.rb +115 -5
- data/spec/mongo/operation/result_spec.rb +6 -1
- data/spec/mongo/operation/update/bulk_spec.rb +18 -6
- data/spec/mongo/operation/update/command_spec.rb +4 -0
- data/spec/mongo/operation/update/op_msg_spec.rb +22 -14
- data/spec/mongo/protocol/msg_spec.rb +10 -0
- data/spec/mongo/retryable_spec.rb +71 -70
- data/spec/mongo/semaphore_spec.rb +51 -0
- data/spec/mongo/server/app_metadata_shared.rb +136 -0
- data/spec/mongo/server/app_metadata_spec.rb +8 -1
- data/spec/mongo/server/connection_auth_spec.rb +33 -14
- data/spec/mongo/server/connection_pool_spec.rb +0 -31
- data/spec/mongo/server/connection_spec.rb +118 -71
- data/spec/mongo/server/monitor/app_metadata_spec.rb +8 -1
- data/spec/mongo/server/monitor/connection_spec.rb +1 -82
- data/spec/mongo/server/monitor_spec.rb +76 -17
- data/spec/mongo/server/round_trip_time_averager_spec.rb +5 -3
- data/spec/mongo/server_selector/nearest_spec.rb +24 -23
- data/spec/mongo/server_selector/primary_preferred_spec.rb +27 -26
- data/spec/mongo/server_selector/primary_spec.rb +27 -9
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +40 -23
- data/spec/mongo/server_selector/secondary_spec.rb +19 -18
- data/spec/mongo/server_selector_spec.rb +4 -5
- data/spec/mongo/session/session_pool_spec.rb +7 -3
- data/spec/mongo/session_spec.rb +35 -0
- data/spec/mongo/socket/ssl_spec.rb +2 -2
- data/spec/mongo/socket/tcp_spec.rb +2 -2
- data/spec/mongo/socket/unix_spec.rb +2 -2
- data/spec/mongo/socket_spec.rb +9 -9
- data/spec/mongo/timeout_spec.rb +22 -68
- data/spec/mongo/uri_spec.rb +21 -6
- data/spec/runners/auth.rb +5 -6
- data/spec/runners/change_streams/outcome.rb +42 -0
- data/spec/runners/change_streams/spec.rb +57 -0
- data/spec/runners/change_streams/test.rb +229 -0
- data/spec/runners/cmap.rb +1 -1
- data/spec/runners/cmap/verifier.rb +1 -1
- data/spec/runners/command_monitoring.rb +4 -35
- data/spec/runners/connection_string.rb +3 -2
- data/spec/runners/crud.rb +2 -2
- data/spec/runners/crud/context.rb +10 -6
- data/spec/runners/crud/operation.rb +177 -55
- data/spec/runners/crud/outcome.rb +1 -1
- data/spec/runners/crud/spec.rb +0 -7
- data/spec/runners/crud/test.rb +8 -26
- data/spec/runners/crud/test_base.rb +47 -0
- data/spec/runners/crud/verifier.rb +21 -3
- data/spec/runners/gridfs.rb +1 -1
- data/spec/runners/{server_discovery_and_monitoring.rb → sdam.rb} +41 -22
- data/spec/runners/sdam/verifier.rb +26 -8
- data/spec/runners/server_selection.rb +242 -28
- data/spec/runners/transactions.rb +13 -14
- data/spec/runners/transactions/operation.rb +155 -25
- data/spec/runners/transactions/spec.rb +1 -1
- data/spec/runners/transactions/test.rb +103 -65
- data/spec/spec_tests/auth_spec.rb +2 -0
- data/spec/spec_tests/change_streams_spec.rb +39 -4
- data/spec/spec_tests/client_side_encryption_spec.rb +3 -0
- data/spec/spec_tests/cmap_spec.rb +5 -0
- data/spec/spec_tests/command_monitoring_spec.rb +25 -12
- data/spec/spec_tests/connection_string_spec.rb +2 -0
- data/spec/spec_tests/crud_spec.rb +3 -1
- data/spec/spec_tests/data/auth/connection-string.yml +57 -1
- data/spec/spec_tests/data/change_streams/change-streams-errors.yml +27 -1
- data/spec/spec_tests/data/change_streams/change-streams-resume-errorLabels.yml +1105 -0
- data/spec/spec_tests/data/change_streams/change-streams-resume-whitelist.yml +1173 -0
- data/spec/spec_tests/data/change_streams/change-streams.yml +5 -4
- data/spec/spec_tests/data/crud_v2/aggregate-merge.yml +1 -1
- data/spec/spec_tests/data/crud_v2/bulkWrite-arrayFilters.yml +33 -11
- data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-clientError.yml +63 -0
- data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-serverError.yml +92 -0
- data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint.yml +103 -0
- data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-clientError.yml +90 -0
- data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-serverError.yml +147 -0
- data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint.yml +164 -0
- data/spec/spec_tests/data/crud_v2/deleteMany-hint-clientError.yml +43 -0
- data/spec/spec_tests/data/crud_v2/deleteMany-hint-serverError.yml +62 -0
- data/spec/spec_tests/data/crud_v2/deleteMany-hint.yml +58 -0
- data/spec/spec_tests/data/crud_v2/deleteOne-hint-clientError.yml +41 -0
- data/spec/spec_tests/data/crud_v2/deleteOne-hint-serverError.yml +60 -0
- data/spec/spec_tests/data/crud_v2/deleteOne-hint.yml +57 -0
- data/spec/spec_tests/data/crud_v2/find-allowdiskuse-clientError.yml +28 -0
- data/spec/spec_tests/data/crud_v2/find-allowdiskuse-serverError.yml +44 -0
- data/spec/spec_tests/data/crud_v2/find-allowdiskuse.yml +50 -0
- data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-clientError.yml +45 -0
- data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-serverError.yml +60 -0
- data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint.yml +56 -0
- data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-clientError.yml +40 -0
- data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-serverError.yml +59 -0
- data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint.yml +55 -0
- data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-clientError.yml +40 -0
- data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-serverError.yml +58 -0
- data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint.yml +55 -0
- data/spec/spec_tests/data/crud_v2/replaceOne-hint.yml +61 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-delete-hint-clientError.yml +60 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-update-hint-clientError.yml +88 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-deleteMany-hint-clientError.yml +40 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-deleteOne-hint-clientError.yml +38 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndDelete-hint-clientError.yml +42 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndReplace-hint-clientError.yml +40 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndUpdate-hint-clientError.yml +40 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-replaceOne-hint-clientError.yml +40 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-updateMany-hint-clientError.yml +43 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-updateOne-hint-clientError.yml +40 -0
- data/spec/spec_tests/data/crud_v2/updateMany-hint-clientError.yml +45 -0
- data/spec/spec_tests/data/crud_v2/updateMany-hint-serverError.yml +66 -0
- data/spec/spec_tests/data/crud_v2/updateMany-hint.yml +65 -0
- data/spec/spec_tests/data/crud_v2/updateOne-hint-clientError.yml +43 -0
- data/spec/spec_tests/data/crud_v2/updateOne-hint-serverError.yml +62 -0
- data/spec/spec_tests/data/crud_v2/updateOne-hint.yml +61 -0
- data/spec/spec_tests/data/crud_v2/updateWithPipelines.yml +65 -0
- data/spec/spec_tests/data/dns_seedlist_discovery/direct-connection-false.yml +10 -0
- data/spec/spec_tests/data/dns_seedlist_discovery/direct-connection-true.yml +5 -0
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/MaxStalenessTooSmall.yml +15 -0
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/NoKnownServers.yml +4 -3
- data/spec/spec_tests/data/max_staleness/Unknown/SmallMaxStaleness.yml +1 -0
- data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-2.6.yml +215 -0
- data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-3.2.yml +58 -0
- data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-3.4.yml +95 -0
- data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-4.2.yml +36 -0
- data/spec/spec_tests/data/retryable_writes/bulkWrite-errorLabels.yml +77 -0
- data/spec/spec_tests/data/retryable_writes/bulkWrite-serverErrors.yml +37 -0
- data/spec/spec_tests/data/retryable_writes/deleteOne-errorLabels.yml +48 -0
- data/spec/spec_tests/data/retryable_writes/deleteOne-serverErrors.yml +22 -0
- data/spec/spec_tests/data/retryable_writes/findOneAndDelete-errorLabels.yml +49 -0
- data/spec/spec_tests/data/retryable_writes/findOneAndDelete-serverErrors.yml +23 -0
- data/spec/spec_tests/data/retryable_writes/findOneAndReplace-errorLabels.yml +52 -0
- data/spec/spec_tests/data/retryable_writes/findOneAndReplace-serverErrors.yml +25 -0
- data/spec/spec_tests/data/retryable_writes/findOneAndUpdate-errorLabels.yml +52 -0
- data/spec/spec_tests/data/retryable_writes/findOneAndUpdate-serverErrors.yml +24 -0
- data/spec/spec_tests/data/retryable_writes/insertMany-errorLabels.yml +54 -0
- data/spec/spec_tests/data/retryable_writes/insertMany-serverErrors.yml +24 -0
- data/spec/spec_tests/data/retryable_writes/insertOne-errorLabels.yml +44 -0
- data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +69 -0
- data/spec/spec_tests/data/retryable_writes/replaceOne-errorLabels.yml +53 -0
- data/spec/spec_tests/data/retryable_writes/replaceOne-serverErrors.yml +23 -0
- data/spec/spec_tests/data/retryable_writes/updateOne-errorLabels.yml +53 -0
- data/spec/spec_tests/data/retryable_writes/updateOne-serverErrors.yml +23 -0
- data/spec/spec_tests/data/sdam/errors/error_handling_handshake.yml +54 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-network-error.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-network-timeout-error.yml +37 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedAtShutdown.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedDueToReplStateChange.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotMaster.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotMasterNoSlaveOk.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotMasterOrSecondary.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-PrimarySteppedDown.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-ShutdownInProgress.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedAtShutdown.yml +51 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedDueToReplStateChange.yml +51 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotMaster.yml +51 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotMasterNoSlaveOk.yml +51 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotMasterOrSecondary.yml +51 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-PrimarySteppedDown.yml +51 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-ShutdownInProgress.yml +51 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedAtShutdown.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedDueToReplStateChange.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotMaster.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotMasterNoSlaveOk.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotMasterOrSecondary.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-PrimarySteppedDown.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-ShutdownInProgress.yml +60 -0
- data/spec/spec_tests/data/sdam/errors/post-42-InterruptedAtShutdown.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/post-42-InterruptedDueToReplStateChange.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/post-42-NotMaster.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/post-42-NotMasterNoSlaveOk.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/post-42-NotMasterOrSecondary.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/post-42-PrimarySteppedDown.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/post-42-ShutdownInProgress.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedAtShutdown.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedDueToReplStateChange.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-NotMaster.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-NotMasterNoSlaveOk.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-NotMasterOrSecondary.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-PrimarySteppedDown.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-ShutdownInProgress.yml +46 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedAtShutdown.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedDueToReplStateChange.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-NotMaster.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-NotMasterNoSlaveOk.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-NotMasterOrSecondary.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-PrimarySteppedDown.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-ShutdownInProgress.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedAtShutdown.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedDueToReplStateChange.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotMaster.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotMasterNoSlaveOk.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotMasterOrSecondary.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-PrimarySteppedDown.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-ShutdownInProgress.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-network.yml +80 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-timeout.yml +80 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedAtShutdown.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedDueToReplStateChange.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotMaster.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotMasterNoSlaveOk.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotMasterOrSecondary.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-PrimarySteppedDown.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-ShutdownInProgress.yml +89 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-network.yml +80 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-timeout.yml +80 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedAtShutdown.yml +64 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedDueToReplStateChange.yml +64 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotMaster.yml +64 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotMasterNoSlaveOk.yml +64 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotMasterOrSecondary.yml +64 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-PrimarySteppedDown.yml +64 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-ShutdownInProgress.yml +64 -0
- data/spec/spec_tests/data/sdam/rs/compatible.yml +2 -0
- data/spec/spec_tests/data/sdam/rs/compatible_unknown.yml +2 -0
- data/spec/spec_tests/data/sdam/rs/discover_arbiters.yml +2 -2
- data/spec/spec_tests/data/sdam/rs/discover_arbiters_replicaset.yml +43 -0
- data/spec/spec_tests/data/sdam/rs/discover_ghost.yml +35 -0
- data/spec/spec_tests/data/sdam/rs/{ghost_discovered.yml → discover_ghost_replicaset.yml} +1 -1
- data/spec/spec_tests/data/sdam/rs/discover_hidden.yml +50 -0
- data/spec/spec_tests/data/sdam/rs/discover_hidden_replicaset.yml +50 -0
- data/spec/spec_tests/data/sdam/rs/discover_passives.yml +2 -2
- data/spec/spec_tests/data/sdam/rs/discover_passives_replicaset.yml +81 -0
- data/spec/spec_tests/data/sdam/rs/discover_primary.yml +2 -2
- data/spec/spec_tests/data/sdam/rs/discover_primary_replicaset.yml +42 -0
- data/spec/spec_tests/data/sdam/rs/discover_rsother.yml +49 -0
- data/spec/spec_tests/data/sdam/rs/{rsother_discovered.yml → discover_rsother_replicaset.yml} +1 -1
- data/spec/spec_tests/data/sdam/rs/discover_secondary.yml +2 -2
- data/spec/spec_tests/data/sdam/rs/discover_secondary_replicaset.yml +43 -0
- data/spec/spec_tests/data/sdam/rs/incompatible_arbiter.yml +2 -0
- data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +2 -0
- data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +2 -0
- data/spec/spec_tests/data/sdam/rs/primary_mismatched_me.yml +23 -27
- data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +79 -55
- data/spec/spec_tests/data/sdam/rs/replicaset_rsnp.yml +20 -0
- data/spec/spec_tests/data/sdam/rs/secondary_mismatched_me.yml +3 -2
- data/spec/spec_tests/data/sdam/rs/too_new.yml +2 -0
- data/spec/spec_tests/data/sdam/rs/topology_version_equal.yml +66 -0
- data/spec/spec_tests/data/sdam/rs/topology_version_greater.yml +189 -0
- data/spec/spec_tests/data/sdam/rs/topology_version_less.yml +62 -0
- data/spec/spec_tests/data/sdam/sharded/discover_single_mongos.yml +23 -0
- data/spec/spec_tests/data/sdam/single/direct_connection_external_ip.yml +1 -1
- data/spec/spec_tests/data/sdam/single/direct_connection_mongos.yml +2 -2
- data/spec/spec_tests/data/sdam/single/direct_connection_replicaset.yml +22 -0
- data/spec/spec_tests/data/sdam/single/direct_connection_rsarbiter.yml +2 -2
- data/spec/spec_tests/data/sdam/single/direct_connection_rsprimary.yml +2 -2
- data/spec/spec_tests/data/sdam/single/direct_connection_rssecondary.yml +2 -2
- data/spec/spec_tests/data/sdam/single/direct_connection_slave.yml +1 -1
- data/spec/spec_tests/data/sdam/single/direct_connection_standalone.yml +2 -2
- data/spec/spec_tests/data/sdam/single/{unavailable_seed.yml → direct_connection_unavailable_seed.yml} +2 -2
- data/spec/spec_tests/data/sdam/single/direct_connection_wrong_set_name.yml +38 -0
- data/spec/spec_tests/data/sdam/single/discover_standalone.yml +34 -0
- data/spec/spec_tests/data/sdam/single/discover_unavailable_seed.yml +28 -0
- data/spec/spec_tests/data/sdam/single/too_old_then_upgraded.yml +46 -0
- data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +96 -0
- data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +88 -0
- data/spec/spec_tests/data/sdam_integration/find-network-error.yml +83 -0
- data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +116 -0
- data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +86 -0
- data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +115 -0
- data/spec/spec_tests/data/sdam_integration/isMaster-command-error.yml +168 -0
- data/spec/spec_tests/data/sdam_integration/isMaster-network-error.yml +162 -0
- data/spec/spec_tests/data/sdam_integration/isMaster-timeout.yml +229 -0
- data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +87 -0
- data/spec/spec_tests/data/transactions/create-collection.yml +131 -0
- data/spec/spec_tests/data/transactions/create-index.yml +152 -0
- data/spec/spec_tests/data/transactions/error-labels.yml +87 -21
- data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +1 -0
- data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +124 -0
- data/spec/spec_tests/data/transactions/retryable-abort.yml +17 -2
- data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +132 -0
- data/spec/spec_tests/data/transactions/retryable-commit.yml +24 -9
- data/spec/spec_tests/data/uri_options/connection-options.yml +43 -0
- data/spec/spec_tests/data/uri_options/ruby-auth-options.yml +12 -0
- data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +57 -0
- data/spec/spec_tests/dns_seedlist_discovery_spec.rb +3 -1
- data/spec/spec_tests/gridfs_spec.rb +2 -0
- data/spec/spec_tests/max_staleness_spec.rb +5 -141
- data/spec/spec_tests/read_write_concern_connection_string_spec.rb +2 -0
- data/spec/spec_tests/read_write_concern_operaton_spec.rb +10 -0
- data/spec/spec_tests/retryable_reads_spec.rb +4 -2
- data/spec/spec_tests/retryable_writes_spec.rb +8 -1
- data/spec/spec_tests/sdam_integration_spec.rb +13 -0
- data/spec/spec_tests/sdam_monitoring_spec.rb +3 -2
- data/spec/spec_tests/sdam_spec.rb +70 -1
- data/spec/spec_tests/server_selection_rtt_spec.rb +2 -0
- data/spec/spec_tests/server_selection_spec.rb +5 -115
- data/spec/spec_tests/transactions_api_spec.rb +5 -0
- data/spec/spec_tests/transactions_spec.rb +5 -0
- data/spec/spec_tests/uri_options_spec.rb +2 -0
- data/spec/stress/cleanup_spec.rb +58 -0
- data/spec/stress/connection_pool_stress_spec.rb +11 -13
- data/spec/stress/connection_pool_timing_spec.rb +3 -6
- data/spec/stress/fork_reconnect_stress_spec.rb +109 -0
- data/spec/support/authorization.rb +1 -11
- data/spec/support/aws_utils.rb +62 -0
- data/spec/support/aws_utils/base.rb +134 -0
- data/spec/support/aws_utils/inspector.rb +224 -0
- data/spec/support/aws_utils/orchestrator.rb +370 -0
- data/spec/support/aws_utils/provisioner.rb +360 -0
- data/spec/support/background_thread_registry.rb +6 -2
- data/spec/support/child_process_helper.rb +78 -0
- data/spec/support/client_registry.rb +6 -24
- data/spec/support/cluster_config.rb +5 -0
- data/spec/support/common_shortcuts.rb +43 -0
- data/spec/support/constraints.rb +27 -7
- data/spec/support/crypt.rb +1 -1
- data/spec/support/event_subscriber.rb +184 -84
- data/spec/support/keyword_struct.rb +26 -0
- data/spec/support/lite_constraints.rb +47 -0
- data/spec/support/shared/scram_conversation.rb +100 -0
- data/spec/support/shared/server_selector.rb +93 -1
- data/spec/support/shared/session.rb +29 -21
- data/spec/support/spec_config.rb +76 -21
- data/spec/support/spec_organizer.rb +129 -0
- data/spec/support/spec_setup.rb +9 -5
- data/spec/support/utils.rb +161 -24
- metadata +1189 -742
- metadata.gz.sig +0 -0
- data/lib/mongo/server/connectable.rb +0 -107
- data/spec/runners/change_streams.rb +0 -262
- data/spec/runners/change_streams/operation.rb +0 -89
- data/spec/runners/sdam_monitoring.rb +0 -89
- data/spec/spec_tests/data/sdam/sharded/ruby_discovered_single_mongos.yml +0 -27
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (C) 2019 MongoDB
|
1
|
+
# Copyright (C) 2019-2020 MongoDB Inc.
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -57,6 +57,7 @@ module Mongo
|
|
57
57
|
# @return [ Mongo::Address ] address The address to connect to.
|
58
58
|
def_delegators :server, :address
|
59
59
|
|
60
|
+
# @deprecated
|
60
61
|
def_delegators :server,
|
61
62
|
:cluster_time,
|
62
63
|
:update_cluster_time
|
@@ -77,12 +78,21 @@ module Mongo
|
|
77
78
|
# @api private
|
78
79
|
attr_reader :description
|
79
80
|
|
81
|
+
# @deprecated
|
80
82
|
def_delegators :description,
|
81
83
|
:features,
|
82
84
|
:max_bson_object_size,
|
83
85
|
:max_message_size,
|
84
86
|
:mongos?
|
85
87
|
|
88
|
+
# Connection pool generation from which this connection was created.
|
89
|
+
# May be nil.
|
90
|
+
#
|
91
|
+
# @return [ Integer | nil ] Connection pool generation.
|
92
|
+
def generation
|
93
|
+
options[:generation]
|
94
|
+
end
|
95
|
+
|
86
96
|
def app_metadata
|
87
97
|
@app_metadata ||= begin
|
88
98
|
same = true
|
@@ -145,15 +155,20 @@ module Mongo
|
|
145
155
|
ensure_connected do |socket|
|
146
156
|
operation_id = Monitoring.next_operation_id
|
147
157
|
command_started(address, operation_id, message.payload,
|
148
|
-
socket_object_id: socket.object_id, connection_id: id
|
158
|
+
socket_object_id: socket.object_id, connection_id: id,
|
159
|
+
connection_generation: generation,
|
160
|
+
server_connection_id: description.server_connection_id,
|
161
|
+
)
|
149
162
|
start = Time.now
|
150
163
|
result = nil
|
151
164
|
begin
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
165
|
+
result = add_server_diagnostics do
|
166
|
+
socket.write(buffer.to_s)
|
167
|
+
if message.replyable?
|
168
|
+
Protocol::Message.deserialize(socket, max_message_size, message.request_id, options)
|
169
|
+
else
|
170
|
+
nil
|
171
|
+
end
|
157
172
|
end
|
158
173
|
rescue Exception => e
|
159
174
|
total_duration = Time.now - start
|
@@ -171,9 +186,6 @@ module Mongo
|
|
171
186
|
end
|
172
187
|
|
173
188
|
def serialize(message, client, buffer = BSON::ByteBuffer.new)
|
174
|
-
start_size = 0
|
175
|
-
final_message = message.maybe_compress(compressor, options[:zlib_compression_level])
|
176
|
-
|
177
189
|
# Driver specifications only mandate the fixed 16MiB limit for
|
178
190
|
# serialized BSON documents. However, the server returns its
|
179
191
|
# active serialized BSON document size limit in the ismaster response,
|
@@ -198,12 +210,41 @@ module Mongo
|
|
198
210
|
max_bson_size += MAX_BSON_COMMAND_OVERHEAD
|
199
211
|
end
|
200
212
|
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
213
|
+
# RUBY-2234: It is necessary to check that the message size does not
|
214
|
+
# exceed the maximum bson object size before compressing and serializing
|
215
|
+
# the final message.
|
216
|
+
#
|
217
|
+
# This is to avoid the case where the user performs a bulk write
|
218
|
+
# larger than 16MiB which, when compressed, becomes smaller than 16MiB.
|
219
|
+
# If the driver does not split the bulk writes prior to compression,
|
220
|
+
# the entire operation will be sent to the server, which will raise an
|
221
|
+
# error because the uncompressed operation exceeds the maximum bson size.
|
222
|
+
#
|
223
|
+
# To address this problem, we serialize the message prior to compression
|
224
|
+
# and raise an exception if the serialized message exceeds the maximum
|
225
|
+
# bson size.
|
226
|
+
if max_message_size
|
227
|
+
# Create a separate buffer that contains the un-compressed message
|
228
|
+
# for the purpose of checking its size. Write any pre-existing contents
|
229
|
+
# from the original buffer into the temporary one.
|
230
|
+
temp_buffer = BSON::ByteBuffer.new
|
231
|
+
|
232
|
+
# TODO: address the fact that this line mutates the buffer.
|
233
|
+
temp_buffer.put_bytes(buffer.get_bytes(buffer.length))
|
234
|
+
|
235
|
+
message.serialize(temp_buffer, max_bson_size)
|
236
|
+
if temp_buffer.length > max_message_size
|
237
|
+
raise Error::MaxMessageSize.new(max_message_size)
|
238
|
+
end
|
206
239
|
end
|
240
|
+
|
241
|
+
# RUBY-2335: When the un-compressed message is smaller than the maximum
|
242
|
+
# bson size limit, the message will be serialized twice. The operations
|
243
|
+
# layer should be refactored to allow compression on an already-
|
244
|
+
# serialized message.
|
245
|
+
final_message = message.maybe_compress(compressor, options[:zlib_compression_level])
|
246
|
+
final_message.serialize(buffer, max_bson_size)
|
247
|
+
|
207
248
|
buffer
|
208
249
|
end
|
209
250
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (C) 2020 MongoDB
|
1
|
+
# Copyright (C) 2020 MongoDB Inc.
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -33,8 +33,26 @@ module Mongo
|
|
33
33
|
# @return [ String | nil ] The compressor.
|
34
34
|
attr_reader :compressor
|
35
35
|
|
36
|
+
# Determine if the connection is currently connected.
|
37
|
+
#
|
38
|
+
# @example Is the connection connected?
|
39
|
+
# connection.connected?
|
40
|
+
#
|
41
|
+
# @return [ true, false ] If connected.
|
42
|
+
#
|
43
|
+
# @deprecated
|
44
|
+
def connected?
|
45
|
+
!!socket
|
46
|
+
end
|
47
|
+
|
48
|
+
# @return [ Integer ] pid The process id when the connection was created.
|
49
|
+
# @api private
|
50
|
+
attr_reader :pid
|
51
|
+
|
36
52
|
private
|
37
53
|
|
54
|
+
attr_reader :socket
|
55
|
+
|
38
56
|
def set_compressor!(reply)
|
39
57
|
server_compressors = reply['compression']
|
40
58
|
|
@@ -56,6 +74,62 @@ module Mongo
|
|
56
74
|
end
|
57
75
|
end
|
58
76
|
end
|
77
|
+
|
78
|
+
# Yields to the block and, if the block raises an exception, adds a note
|
79
|
+
# to the exception with the address of the specified server.
|
80
|
+
#
|
81
|
+
# This method is intended to add server address information to exceptions
|
82
|
+
# raised during execution of operations on servers.
|
83
|
+
def add_server_diagnostics
|
84
|
+
yield
|
85
|
+
# Note that the exception should already have been mapped to a
|
86
|
+
# Mongo::Error subclass when it gets to this method.
|
87
|
+
rescue Error::SocketError, Error::SocketTimeoutError => e
|
88
|
+
# Server::Monitor::Connection does not reference its server, but
|
89
|
+
# knows its address. Server::Connection delegates the address to its
|
90
|
+
# server.
|
91
|
+
note = "on #{address.seed}"
|
92
|
+
if respond_to?(:id)
|
93
|
+
note << ", connection #{generation}:#{id}"
|
94
|
+
end
|
95
|
+
e.add_note(note)
|
96
|
+
if respond_to?(:generation)
|
97
|
+
# Non-monitoring connections
|
98
|
+
e.generation = generation
|
99
|
+
end
|
100
|
+
raise e
|
101
|
+
end
|
102
|
+
|
103
|
+
def ssl_options
|
104
|
+
@ssl_options ||= if options[:ssl]
|
105
|
+
options.select { |k, v| k.to_s.start_with?('ssl') }
|
106
|
+
else
|
107
|
+
# Due to the way options are propagated from the client, if we
|
108
|
+
# decide that we don't want to use TLS we need to have the ssl
|
109
|
+
# options explicitly set to false or the value provided to the
|
110
|
+
# connection might be overwritten by the default inherited from
|
111
|
+
# the client.
|
112
|
+
{ssl: false}
|
113
|
+
end.freeze
|
114
|
+
end
|
115
|
+
|
116
|
+
def ensure_connected
|
117
|
+
begin
|
118
|
+
unless socket
|
119
|
+
raise ArgumentError, "Connection #{generation}:#{id} for #{address.seed} is not connected"
|
120
|
+
end
|
121
|
+
if @error
|
122
|
+
raise Error::ConnectionPerished, "Connection #{generation}:#{id} for #{address.seed} is perished"
|
123
|
+
end
|
124
|
+
result = yield socket
|
125
|
+
success = true
|
126
|
+
result
|
127
|
+
ensure
|
128
|
+
unless success
|
129
|
+
@error = true
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
59
133
|
end
|
60
134
|
end
|
61
135
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (C) 2014-
|
1
|
+
# Copyright (C) 2014-2020 MongoDB Inc.
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -292,6 +292,7 @@ module Mongo
|
|
292
292
|
end
|
293
293
|
|
294
294
|
deadline = Time.now + wait_timeout
|
295
|
+
pid = Process.pid
|
295
296
|
connection = nil
|
296
297
|
# It seems that synchronize sets up its own loop, thus a simple break
|
297
298
|
# is insufficient to break the outer loop
|
@@ -304,6 +305,13 @@ module Mongo
|
|
304
305
|
until @available_connections.empty?
|
305
306
|
connection = @available_connections.pop
|
306
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
|
+
|
307
315
|
if connection.generation != generation
|
308
316
|
# Stale connections should be disconnected in the clear
|
309
317
|
# method, but if any don't, check again here
|
@@ -383,6 +391,12 @@ module Mongo
|
|
383
391
|
Monitoring::Event::Cmap::ConnectionCheckedOut.new(@server.address, connection.id, self),
|
384
392
|
)
|
385
393
|
|
394
|
+
if Lint.enabled?
|
395
|
+
unless connection.connected?
|
396
|
+
raise Error::LintError, "Connection pool for #{address} checked out a disconnected connection #{connection.generation}:#{connection.id}"
|
397
|
+
end
|
398
|
+
end
|
399
|
+
|
386
400
|
connection
|
387
401
|
ensure
|
388
402
|
check_invariants
|
@@ -418,6 +432,11 @@ module Mongo
|
|
418
432
|
Monitoring::Event::Cmap::ConnectionCheckedIn.new(@server.address, connection.id, self)
|
419
433
|
)
|
420
434
|
|
435
|
+
if connection.error?
|
436
|
+
connection.disconnect!(reason: :error)
|
437
|
+
return
|
438
|
+
end
|
439
|
+
|
421
440
|
if closed?
|
422
441
|
connection.disconnect!(reason: :pool_closed)
|
423
442
|
return
|
data/lib/mongo/server/context.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (C) 2014-
|
1
|
+
# Copyright (C) 2014-2020 MongoDB Inc.
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the 'License');
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -214,6 +214,7 @@ module Mongo
|
|
214
214
|
hosts
|
215
215
|
arbiters
|
216
216
|
passives
|
217
|
+
topology_version
|
217
218
|
|
218
219
|
freeze
|
219
220
|
end
|
@@ -419,6 +420,47 @@ module Mongo
|
|
419
420
|
config[SET_VERSION]
|
420
421
|
end
|
421
422
|
|
423
|
+
# @return [ TopologyVersion | nil ] The topology version.
|
424
|
+
def topology_version
|
425
|
+
unless defined?(@topology_version)
|
426
|
+
@topology_version = config['topologyVersion'] &&
|
427
|
+
TopologyVersion.new(config['topologyVersion'])
|
428
|
+
end
|
429
|
+
@topology_version
|
430
|
+
end
|
431
|
+
|
432
|
+
# Returns whether topology version in this description is potentially
|
433
|
+
# newer than or equal to topology version in another description.
|
434
|
+
#
|
435
|
+
# @param [ Server::Description ] other_desc The other server description.
|
436
|
+
#
|
437
|
+
# @return [ true | false ] Whether topology version in this description
|
438
|
+
# is potentially newer or equal.
|
439
|
+
# @api private
|
440
|
+
def topology_version_gt?(other_desc)
|
441
|
+
if topology_version.nil? || other_desc.topology_version.nil?
|
442
|
+
true
|
443
|
+
else
|
444
|
+
topology_version.gt?(other_desc.topology_version)
|
445
|
+
end
|
446
|
+
end
|
447
|
+
|
448
|
+
# Returns whether topology version in this description is potentially
|
449
|
+
# newer than topology version in another description.
|
450
|
+
#
|
451
|
+
# @param [ Server::Description ] other_desc The other server description.
|
452
|
+
#
|
453
|
+
# @return [ true | false ] Whether topology version in this description
|
454
|
+
# is potentially newer.
|
455
|
+
# @api private
|
456
|
+
def topology_version_gte?(other_desc)
|
457
|
+
if topology_version.nil? || other_desc.topology_version.nil?
|
458
|
+
true
|
459
|
+
else
|
460
|
+
topology_version.gte?(other_desc.topology_version)
|
461
|
+
end
|
462
|
+
end
|
463
|
+
|
422
464
|
# Get the lastWriteDate from the lastWrite subdocument in the config.
|
423
465
|
#
|
424
466
|
# @example Get the lastWriteDate value.
|
@@ -606,7 +648,7 @@ module Mongo
|
|
606
648
|
#
|
607
649
|
# @since 2.0.0
|
608
650
|
def unknown?
|
609
|
-
config.empty? || !ok?
|
651
|
+
config.empty? || config.keys == %w(topologyVersion) || !ok?
|
610
652
|
end
|
611
653
|
|
612
654
|
# @api private
|
@@ -713,6 +755,11 @@ module Mongo
|
|
713
755
|
# @since 2.7.0
|
714
756
|
attr_reader :last_update_time
|
715
757
|
|
758
|
+
# @api experimental
|
759
|
+
def server_connection_id
|
760
|
+
config['connectionId']
|
761
|
+
end
|
762
|
+
|
716
763
|
# Check equality of two descriptions.
|
717
764
|
#
|
718
765
|
# @example Check description equality.
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (C) 2014-
|
1
|
+
# Copyright (C) 2014-2020 MongoDB Inc.
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the 'License');
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -20,7 +20,6 @@ module Mongo
|
|
20
20
|
#
|
21
21
|
# @since 2.0.0
|
22
22
|
class Features
|
23
|
-
|
24
23
|
# List of features and the wire protocol version they appear in.
|
25
24
|
#
|
26
25
|
# Wire protocol versions map to server releases as follows:
|
@@ -31,9 +30,15 @@ module Mongo
|
|
31
30
|
# - 6 => 3.6
|
32
31
|
# - 7 => 4.0
|
33
32
|
# - 8 => 4.2
|
33
|
+
# - 9 => 4.4
|
34
34
|
#
|
35
35
|
# @since 2.0.0
|
36
36
|
MAPPINGS = {
|
37
|
+
:retryable_write_error_label => 9,
|
38
|
+
# Server versions older than 4.2 do not reliably validate options
|
39
|
+
# provided by the client during findAndModify operations, requiring the
|
40
|
+
# driver to raise client-side errors when those options are provided.
|
41
|
+
:find_and_modify_option_validation => 8,
|
37
42
|
:transactions => 7,
|
38
43
|
:scram_sha_256 => 7,
|
39
44
|
:array_filters => 6,
|
@@ -41,6 +46,10 @@ module Mongo
|
|
41
46
|
:sessions => 6,
|
42
47
|
:collation => 5,
|
43
48
|
:max_staleness => 5,
|
49
|
+
# Server versions older than 3.4 do not reliably validate options
|
50
|
+
# provided by the client during update/delete operations, requiring the
|
51
|
+
# driver to raise client-side errors when those options are provided.
|
52
|
+
:update_delete_option_validation => 5,
|
44
53
|
:find_command => 4,
|
45
54
|
:list_collections => 3,
|
46
55
|
:list_indexes => 3,
|
@@ -64,7 +73,7 @@ module Mongo
|
|
64
73
|
# The wire protocol versions that this version of the driver supports.
|
65
74
|
#
|
66
75
|
# @since 2.0.0
|
67
|
-
DRIVER_WIRE_VERSIONS = (2..
|
76
|
+
DRIVER_WIRE_VERSIONS = (2..9).freeze
|
68
77
|
|
69
78
|
# Create the methods for each mapping to tell if they are supported.
|
70
79
|
#
|
data/lib/mongo/server/monitor.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (C) 2014-
|
1
|
+
# Copyright (C) 2014-2020 MongoDB Inc.
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -22,22 +22,23 @@ module Mongo
|
|
22
22
|
# operations performed by the driver.
|
23
23
|
#
|
24
24
|
# @since 2.0.0
|
25
|
+
# @api private
|
25
26
|
class Monitor
|
26
27
|
include Loggable
|
27
28
|
extend Forwardable
|
28
29
|
include Event::Publisher
|
29
30
|
include BackgroundThread
|
30
31
|
|
31
|
-
# The default
|
32
|
+
# The default interval between server status refreshes is 10 seconds.
|
32
33
|
#
|
33
34
|
# @since 2.0.0
|
34
|
-
|
35
|
+
DEFAULT_HEARTBEAT_INTERVAL = 10.freeze
|
35
36
|
|
36
37
|
# The minimum time between forced server scans. Is
|
37
38
|
# minHeartbeatFrequencyMS in the SDAM spec.
|
38
39
|
#
|
39
40
|
# @since 2.0.0
|
40
|
-
|
41
|
+
MIN_SCAN_INTERVAL = 0.5.freeze
|
41
42
|
|
42
43
|
# The weighting factor (alpha) for calculating the average moving round trip time.
|
43
44
|
#
|
@@ -59,6 +60,8 @@ module Mongo
|
|
59
60
|
#
|
60
61
|
# @option options [ Float ] :connect_timeout The timeout, in seconds, to
|
61
62
|
# use when establishing the monitoring connection.
|
63
|
+
# @option options [ Float ] :heartbeat_interval The interval between
|
64
|
+
# regular server checks.
|
62
65
|
# @option options [ Logger ] :logger A custom logger to use.
|
63
66
|
# @option options [ Float ] :socket_timeout The timeout, in seconds, to
|
64
67
|
# execute operations on the monitoring connection.
|
@@ -73,10 +76,10 @@ module Mongo
|
|
73
76
|
@event_listeners = event_listeners
|
74
77
|
@monitoring = monitoring
|
75
78
|
@options = options.freeze
|
76
|
-
# This is a Mongo::Server::Monitor::Connection
|
77
|
-
@connection = Connection.new(server.address, options)
|
78
79
|
@mutex = Mutex.new
|
79
|
-
@
|
80
|
+
@sdam_mutex = Mutex.new
|
81
|
+
@next_earliest_scan = @next_wanted_scan = Time.now
|
82
|
+
@update_mutex = Mutex.new
|
80
83
|
end
|
81
84
|
|
82
85
|
# @return [ Server ] server The server that this monitor is monitoring.
|
@@ -89,11 +92,18 @@ module Mongo
|
|
89
92
|
# @return [ Hash ] options The server options.
|
90
93
|
attr_reader :options
|
91
94
|
|
95
|
+
# The interval between regular server checks.
|
96
|
+
#
|
97
|
+
# @return [ Float ] The heartbeat interval, in seconds.
|
98
|
+
def heartbeat_interval
|
99
|
+
options[:heartbeat_interval] || DEFAULT_HEARTBEAT_INTERVAL
|
100
|
+
end
|
101
|
+
|
92
102
|
# @deprecated
|
93
103
|
def_delegators :server, :last_scan
|
94
104
|
|
95
|
-
# The compressor is determined during the handshake, so it must be an
|
96
|
-
# of the connection.
|
105
|
+
# The compressor is determined during the handshake, so it must be an
|
106
|
+
# attribute of the connection.
|
97
107
|
#
|
98
108
|
# @deprecated
|
99
109
|
def_delegators :connection, :compressor
|
@@ -101,15 +111,12 @@ module Mongo
|
|
101
111
|
# @return [ Monitoring ] monitoring The monitoring.
|
102
112
|
attr_reader :monitoring
|
103
113
|
|
104
|
-
#
|
105
|
-
#
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
# @deprecated
|
111
|
-
def heartbeat_frequency
|
112
|
-
server.cluster.heartbeat_interval
|
114
|
+
# @return [ Server::PushMonitor | nil ] The push monitor, if one is being
|
115
|
+
# used.
|
116
|
+
def push_monitor
|
117
|
+
@update_mutex.synchronize do
|
118
|
+
@push_monitor
|
119
|
+
end
|
113
120
|
end
|
114
121
|
|
115
122
|
# Runs the server monitor. Refreshing happens on a separate thread per
|
@@ -123,52 +130,99 @@ module Mongo
|
|
123
130
|
# @since 2.0.0
|
124
131
|
def do_work
|
125
132
|
scan!
|
126
|
-
|
133
|
+
# @next_wanted_scan may be updated by the push monitor.
|
134
|
+
# However we need to check for termination flag so that the monitor
|
135
|
+
# thread exits when requested.
|
136
|
+
loop do
|
137
|
+
delta = @next_wanted_scan - Time.now
|
138
|
+
if delta > 0
|
139
|
+
signaled = server.scan_semaphore.wait(delta)
|
140
|
+
if signaled || @stop_requested
|
141
|
+
break
|
142
|
+
end
|
143
|
+
else
|
144
|
+
break
|
145
|
+
end
|
146
|
+
end
|
127
147
|
end
|
128
148
|
|
129
|
-
# Stop the background thread and wait for to terminate for a
|
130
|
-
# amount of time.
|
149
|
+
# Stop the background thread and wait for it to terminate for a
|
150
|
+
# reasonable amount of time.
|
131
151
|
#
|
132
152
|
# @return [ true | false ] Whether the thread was terminated.
|
133
153
|
#
|
134
154
|
# @api public for backwards compatibility only
|
135
155
|
def stop!
|
156
|
+
stop_push_monitor!
|
157
|
+
|
136
158
|
# Forward super's return value
|
137
159
|
super.tap do
|
138
160
|
# Important: disconnect should happen after the background thread
|
139
|
-
#
|
140
|
-
connection
|
161
|
+
# terminates.
|
162
|
+
connection&.disconnect!
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
def stop_push_monitor!
|
167
|
+
@update_mutex.synchronize do
|
168
|
+
if @push_monitor
|
169
|
+
@push_monitor.stop!
|
170
|
+
@push_monitor = nil
|
171
|
+
end
|
141
172
|
end
|
142
173
|
end
|
143
174
|
|
144
175
|
# Perform a check of the server with throttling, and update
|
145
176
|
# the server's description and average round trip time.
|
146
177
|
#
|
147
|
-
# If the server was checked less than
|
148
|
-
# ago, sleep until
|
178
|
+
# If the server was checked less than MIN_SCAN_INTERVAL seconds
|
179
|
+
# ago, sleep until MIN_SCAN_INTERVAL seconds have passed since the last
|
149
180
|
# check. Then perform the check which involves running isMaster
|
150
181
|
# on the server being monitored and updating the server description
|
151
182
|
# as a result.
|
152
183
|
#
|
153
|
-
# @note If the system clock
|
154
|
-
#
|
184
|
+
# @note If the system clock moves backwards, this method can sleep
|
185
|
+
# for a very long time.
|
155
186
|
#
|
156
187
|
# @note The return value of this method is deprecated. In version 3.0.0
|
157
188
|
# this method will not have a return value.
|
158
189
|
#
|
159
|
-
# @example Run a scan.
|
160
|
-
# monitor.scan!
|
161
|
-
#
|
162
190
|
# @return [ Description ] The updated description.
|
163
191
|
#
|
164
192
|
# @since 2.0.0
|
165
193
|
def scan!
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
194
|
+
# Ordinarily the background thread would invoke this method.
|
195
|
+
# But it is also possible to invoke scan! directly on a monitor.
|
196
|
+
# Allow only one scan to be performed at a time.
|
197
|
+
@mutex.synchronize do
|
198
|
+
throttle_scan_frequency!
|
199
|
+
|
200
|
+
result = do_scan
|
201
|
+
|
202
|
+
run_sdam_flow(result)
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
def run_sdam_flow(result, awaited: false)
|
207
|
+
@sdam_mutex.synchronize do
|
208
|
+
old_description = server.description
|
209
|
+
|
210
|
+
new_description = Description.new(server.address, result,
|
211
|
+
server.round_trip_time_averager.average_round_trip_time)
|
212
|
+
|
213
|
+
server.cluster.run_sdam_flow(server.description, new_description, awaited: awaited)
|
214
|
+
|
215
|
+
server.description.tap do |new_description|
|
216
|
+
unless awaited
|
217
|
+
if new_description.unknown? && !old_description.unknown?
|
218
|
+
@next_earliest_scan = @next_wanted_scan = Time.now
|
219
|
+
else
|
220
|
+
@next_earliest_scan = Time.now + MIN_SCAN_INTERVAL
|
221
|
+
@next_wanted_scan = Time.now + heartbeat_interval
|
222
|
+
end
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
172
226
|
end
|
173
227
|
|
174
228
|
# Restarts the server monitor unless the current thread is alive.
|
@@ -193,54 +247,76 @@ module Mongo
|
|
193
247
|
server.scan_semaphore.signal
|
194
248
|
end
|
195
249
|
|
196
|
-
def
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
Monitoring::SERVER_HEARTBEAT,
|
201
|
-
Monitoring::Event::ServerHeartbeatStarted.new(server.address)
|
202
|
-
)
|
250
|
+
def do_scan
|
251
|
+
begin
|
252
|
+
monitoring.publish_heartbeat(server) do
|
253
|
+
ismaster
|
203
254
|
end
|
255
|
+
rescue => exc
|
256
|
+
msg = "Error running ismaster on #{server.address}"
|
257
|
+
Utils.warn_monitor_exception(msg, exc,
|
258
|
+
logger: options[:logger],
|
259
|
+
log_prefix: options[:log_prefix],
|
260
|
+
bg_error_backtrace: options[:bg_error_backtrace],
|
261
|
+
)
|
262
|
+
{}
|
263
|
+
end
|
264
|
+
end
|
265
|
+
|
266
|
+
def ismaster
|
267
|
+
if @connection && @connection.pid != Process.pid
|
268
|
+
log_warn("Detected PID change - Mongo client should have been reconnected (old pid #{@connection.pid}, new pid #{Process.pid}")
|
269
|
+
@connection.disconnect!
|
270
|
+
@connection = nil
|
271
|
+
end
|
204
272
|
|
205
|
-
|
206
|
-
|
273
|
+
if @connection
|
274
|
+
result = server.round_trip_time_averager.measure do
|
275
|
+
begin
|
276
|
+
message = @connection.dispatch_bytes(Monitor::Connection::ISMASTER_BYTES)
|
277
|
+
message.documents.first
|
278
|
+
rescue Mongo::Error
|
279
|
+
@connection.disconnect!
|
280
|
+
@connection = nil
|
281
|
+
raise
|
282
|
+
end
|
283
|
+
end
|
284
|
+
else
|
285
|
+
connection = Connection.new(server.address, options)
|
286
|
+
connection.connect!
|
287
|
+
result = server.round_trip_time_averager.measure do
|
288
|
+
connection.handshake!
|
207
289
|
end
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
290
|
+
@connection = connection
|
291
|
+
if result['topologyVersion']
|
292
|
+
# Successful response, server 4.4+
|
293
|
+
@update_mutex.synchronize do
|
294
|
+
@push_monitor ||= PushMonitor.new(
|
295
|
+
self,
|
296
|
+
TopologyVersion.new(result['topologyVersion']),
|
297
|
+
monitoring,
|
298
|
+
**Utils.shallow_symbolize_keys(options.merge(
|
299
|
+
socket_timeout: heartbeat_interval + connection.socket_timeout,
|
300
|
+
)),
|
214
301
|
)
|
215
302
|
end
|
216
|
-
|
303
|
+
push_monitor.run!
|
217
304
|
else
|
218
|
-
|
219
|
-
|
220
|
-
Monitoring::SERVER_HEARTBEAT,
|
221
|
-
Monitoring::Event::ServerHeartbeatSucceeded.new(server.address, rtt)
|
222
|
-
)
|
223
|
-
end
|
305
|
+
# Failed response or pre-4.4 server
|
306
|
+
stop_push_monitor!
|
224
307
|
end
|
225
308
|
result
|
226
309
|
end
|
310
|
+
result
|
227
311
|
end
|
228
312
|
|
229
313
|
# @note If the system clock is set to a time in the past, this method
|
230
314
|
# can sleep for a very long time.
|
231
315
|
def throttle_scan_frequency!
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
# cooldown can be obtained. Guard against repeated direct scan!
|
236
|
-
# invocation also.
|
237
|
-
last_time = [server.last_scan, @scan_started_at].compact.max
|
238
|
-
if last_time
|
239
|
-
difference = (Time.now - last_time)
|
240
|
-
throttle_time = (MIN_SCAN_FREQUENCY - difference)
|
241
|
-
sleep(throttle_time) if throttle_time > 0
|
316
|
+
delta = @next_earliest_scan - Time.now
|
317
|
+
if delta > 0
|
318
|
+
sleep(delta)
|
242
319
|
end
|
243
|
-
@scan_started_at = Time.now
|
244
320
|
end
|
245
321
|
end
|
246
322
|
end
|