mongo 2.12.4 → 2.13.0.beta1
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 +1 -1
- data/lib/mongo.rb +4 -1
- data/lib/mongo/active_support.rb +1 -1
- data/lib/mongo/address.rb +40 -13
- 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 +257 -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 +61 -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 +38 -23
- data/lib/mongo/client_encryption.rb +1 -1
- data/lib/mongo/cluster.rb +126 -54
- 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 +23 -7
- 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 +1 -1
- data/lib/mongo/cluster/topology/replica_set_with_primary.rb +1 -1
- data/lib/mongo/cluster/topology/sharded.rb +1 -1
- data/lib/mongo/cluster/topology/single.rb +1 -1
- data/lib/mongo/cluster/topology/unknown.rb +1 -1
- data/lib/mongo/cluster_time.rb +1 -1
- data/lib/mongo/collection.rb +24 -8
- 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 +11 -5
- data/lib/mongo/collection/view/writable.rb +52 -8
- 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 +4 -1
- data/lib/mongo/database/view.rb +2 -2
- data/lib/mongo/dbref.rb +1 -1
- data/lib/mongo/error.rb +25 -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_response.rb +23 -0
- data/lib/mongo/error/invalid_server_preference.rb +6 -1
- data/lib/mongo/error/invalid_session.rb +1 -1
- data/lib/mongo/error/invalid_signature.rb +1 -1
- data/lib/mongo/error/invalid_transaction_operation.rb +1 -1
- data/lib/mongo/error/invalid_txt_record.rb +1 -1
- data/lib/mongo/error/invalid_update_document.rb +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 +62 -49
- 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/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 +1 -1
- data/lib/mongo/event/listeners.rb +1 -1
- data/lib/mongo/event/publisher.rb +1 -1
- data/lib/mongo/event/subscriber.rb +1 -1
- data/lib/mongo/grid.rb +1 -1
- data/lib/mongo/grid/file.rb +1 -6
- data/lib/mongo/grid/file/chunk.rb +1 -3
- data/lib/mongo/grid/file/info.rb +1 -1
- data/lib/mongo/grid/fs_bucket.rb +20 -17
- data/lib/mongo/grid/stream.rb +1 -1
- data/lib/mongo/grid/stream/read.rb +1 -1
- data/lib/mongo/grid/stream/write.rb +4 -10
- data/lib/mongo/id.rb +1 -1
- data/lib/mongo/index.rb +2 -1
- data/lib/mongo/index/view.rb +58 -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 +1 -1
- data/lib/mongo/monitoring/cmap_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/command_log_subscriber.rb +12 -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 +1 -1
- data/lib/mongo/monitoring/event/command_started.rb +9 -3
- data/lib/mongo/monitoring/event/command_succeeded.rb +1 -1
- data/lib/mongo/monitoring/event/secure.rb +8 -2
- data/lib/mongo/monitoring/event/server_closed.rb +1 -1
- data/lib/mongo/monitoring/event/server_description_changed.rb +1 -1
- data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +1 -1
- data/lib/mongo/monitoring/event/server_heartbeat_started.rb +1 -1
- data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +1 -1
- data/lib/mongo/monitoring/event/server_opening.rb +1 -1
- data/lib/mongo/monitoring/event/topology_changed.rb +1 -1
- data/lib/mongo/monitoring/event/topology_closed.rb +1 -1
- data/lib/mongo/monitoring/event/topology_opening.rb +1 -1
- data/lib/mongo/monitoring/publishable.rb +5 -8
- data/lib/mongo/monitoring/sdam_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/server_closed_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/server_opening_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +1 -1
- data/lib/mongo/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 +5 -14
- data/lib/mongo/protocol/msg.rb +5 -24
- data/lib/mongo/protocol/query.rb +1 -37
- data/lib/mongo/protocol/registry.rb +1 -1
- data/lib/mongo/protocol/reply.rb +1 -1
- data/lib/mongo/protocol/serializers.rb +3 -6
- 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 +32 -7
- data/lib/mongo/server/app_metadata.rb +17 -4
- data/lib/mongo/server/connection.rb +35 -131
- data/lib/mongo/server/connection_base.rb +31 -42
- 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 +44 -2
- data/lib/mongo/server/description/features.rb +12 -3
- data/lib/mongo/server/monitor.rb +116 -72
- data/lib/mongo/server/monitor/app_metadata.rb +1 -1
- data/lib/mongo/server/monitor/connection.rb +62 -80
- data/lib/mongo/server/pending_connection.rb +205 -3
- data/lib/mongo/server/round_trip_time_averager.rb +12 -3
- data/lib/mongo/server_selector.rb +2 -1
- data/lib/mongo/server_selector/base.rb +40 -0
- data/lib/mongo/server_selector/nearest.rb +25 -15
- data/lib/mongo/server_selector/primary.rb +23 -22
- data/lib/mongo/server_selector/primary_preferred.rb +25 -15
- data/lib/mongo/server_selector/secondary.rb +25 -15
- data/lib/mongo/server_selector/secondary_preferred.rb +28 -27
- data/lib/mongo/server_selector/selectable.rb +30 -15
- data/lib/mongo/session.rb +12 -1
- data/lib/mongo/session/server_session.rb +1 -1
- data/lib/mongo/session/session_pool.rb +1 -1
- data/lib/mongo/socket.rb +103 -35
- data/lib/mongo/socket/ssl.rb +97 -34
- 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 +80 -0
- data/lib/mongo/uri.rb +61 -47
- data/lib/mongo/uri/srv_protocol.rb +9 -1
- 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/aws_auth_request_spec.rb +74 -0
- data/spec/integration/aws_credentials_retriever_spec.rb +103 -0
- data/spec/integration/change_stream_spec.rb +123 -51
- data/spec/integration/client_authentication_options_spec.rb +0 -37
- data/spec/integration/client_construction_aws_auth_spec.rb +191 -0
- data/spec/integration/client_construction_spec.rb +1 -1
- data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +5 -9
- 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 +5 -3
- data/spec/integration/connection_spec.rb +1 -0
- data/spec/integration/crud_spec.rb +28 -0
- data/spec/integration/cursor_reaping_spec.rb +14 -10
- data/spec/integration/fork_reconnect_spec.rb +143 -0
- data/spec/integration/get_more_spec.rb +10 -3
- data/spec/integration/heartbeat_events_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 +116 -18
- data/spec/integration/sdam_events_spec.rb +1 -0
- data/spec/integration/server_spec.rb +42 -26
- data/spec/integration/size_limit_spec.rb +2 -20
- 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/kerberos/kerberos_spec.rb +10 -6
- data/spec/lite_spec_helper.rb +21 -19
- data/spec/mongo/address/ipv4_spec.rb +1 -1
- data/spec/mongo/address_spec.rb +2 -2
- 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 +28 -68
- 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 +290 -86
- data/spec/mongo/client_spec.rb +21 -2
- data/spec/mongo/cluster_spec.rb +4 -2
- 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 +31 -67
- 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 +6 -2
- data/spec/mongo/error/operation_failure_heavy_spec.rb +58 -0
- data/spec/mongo/error/operation_failure_spec.rb +130 -72
- 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 +166 -0
- 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/retryable_spec.rb +71 -70
- data/spec/mongo/server/app_metadata_shared.rb +56 -0
- data/spec/mongo/server/app_metadata_spec.rb +8 -1
- data/spec/mongo/server/connection_auth_spec.rb +31 -12
- 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 +1 -0
- data/spec/mongo/server_selector/primary_preferred_spec.rb +1 -0
- data/spec/mongo/server_selector/primary_spec.rb +18 -0
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +18 -1
- data/spec/mongo/server_selector/secondary_spec.rb +1 -0
- data/spec/mongo/server_selector_spec.rb +0 -1
- data/spec/mongo/session/session_pool_spec.rb +7 -3
- 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/verifier.rb +1 -1
- data/spec/runners/command_monitoring.rb +1 -1
- data/spec/runners/connection_string.rb +3 -2
- data/spec/runners/crud.rb +2 -2
- data/spec/runners/crud/context.rb +1 -1
- data/spec/runners/crud/operation.rb +120 -30
- data/spec/runners/crud/outcome.rb +1 -1
- data/spec/runners/crud/spec.rb +1 -0
- 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/sdam_monitoring.rb +1 -1
- data/spec/runners/transactions.rb +1 -2
- data/spec/runners/transactions/context.rb +1 -1
- data/spec/runners/transactions/operation.rb +5 -1
- data/spec/runners/transactions/spec.rb +1 -1
- data/spec/runners/transactions/test.rb +48 -54
- 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 +3 -0
- data/spec/spec_tests/connection_string_spec.rb +2 -0
- data/spec/spec_tests/crud_spec.rb +2 -0
- data/spec/spec_tests/data/auth/connection-string.yml +57 -1
- data/spec/spec_tests/data/change_streams/change-streams-errors.yml +30 -0
- 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 +1107 -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/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/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 +3 -1
- 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 +2 -0
- data/spec/spec_tests/retryable_writes_spec.rb +8 -1
- data/spec/spec_tests/sdam_monitoring_spec.rb +3 -1
- 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 +2 -0
- 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 +43 -0
- data/spec/stress/connection_pool_stress_spec.rb +1 -5
- 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/client_registry.rb +5 -24
- data/spec/support/cluster_config.rb +1 -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 +94 -84
- data/spec/support/lite_constraints.rb +47 -0
- data/spec/support/shared/scram_conversation.rb +100 -0
- data/spec/support/shared/server_selector.rb +81 -1
- data/spec/support/shared/session.rb +29 -21
- data/spec/support/spec_config.rb +39 -9
- data/spec/support/spec_setup.rb +8 -4
- data/spec/support/utils.rb +115 -24
- metadata +1134 -744
- metadata.gz.sig +0 -0
- data/lib/mongo/server/connectable.rb +0 -107
- data/spec/integration/bulk_write_spec.rb +0 -19
- data/spec/integration/grid_fs_bucket_spec.rb +0 -48
- data/spec/integration/zlib_compression_spec.rb +0 -25
- data/spec/runners/change_streams.rb +0 -262
- data/spec/runners/change_streams/operation.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,18 @@ 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)
|
149
160
|
start = Time.now
|
150
161
|
result = nil
|
151
162
|
begin
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
163
|
+
result = add_server_diagnostics do
|
164
|
+
socket.write(buffer.to_s)
|
165
|
+
if message.replyable?
|
166
|
+
Protocol::Message.deserialize(socket, max_message_size, message.request_id, options)
|
167
|
+
else
|
168
|
+
nil
|
169
|
+
end
|
157
170
|
end
|
158
171
|
rescue Exception => e
|
159
172
|
total_duration = Time.now - start
|
@@ -171,6 +184,9 @@ module Mongo
|
|
171
184
|
end
|
172
185
|
|
173
186
|
def serialize(message, client, buffer = BSON::ByteBuffer.new)
|
187
|
+
start_size = 0
|
188
|
+
final_message = message.maybe_compress(compressor, options[:zlib_compression_level])
|
189
|
+
|
174
190
|
# Driver specifications only mandate the fixed 16MiB limit for
|
175
191
|
# serialized BSON documents. However, the server returns its
|
176
192
|
# active serialized BSON document size limit in the ismaster response,
|
@@ -189,45 +205,18 @@ module Mongo
|
|
189
205
|
if message.bulk_write?
|
190
206
|
# Make the new maximum size equal to the specified reduced size
|
191
207
|
# limit plus the 16KiB overhead allowance.
|
192
|
-
max_bson_size = REDUCED_MAX_BSON_SIZE
|
208
|
+
max_bson_size = REDUCED_MAX_BSON_SIZE + MAX_BSON_COMMAND_OVERHEAD
|
193
209
|
end
|
210
|
+
else
|
211
|
+
max_bson_size += MAX_BSON_COMMAND_OVERHEAD
|
194
212
|
end
|
195
213
|
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
# larger than 16MiB which, when compressed, becomes smaller than 16MiB.
|
202
|
-
# If the driver does not split the bulk writes prior to compression,
|
203
|
-
# the entire operation will be sent to the server, which will raise an
|
204
|
-
# error because the uncompressed operation exceeds the maximum bson size.
|
205
|
-
#
|
206
|
-
# To address this problem, we serialize the message prior to compression
|
207
|
-
# and raise an exception if the serialized message exceeds the maximum
|
208
|
-
# bson size.
|
209
|
-
if max_message_size
|
210
|
-
# Create a separate buffer that contains the un-compressed message
|
211
|
-
# for the purpose of checking its size. Write any pre-existing contents
|
212
|
-
# from the original buffer into the temporary one.
|
213
|
-
temp_buffer = BSON::ByteBuffer.new
|
214
|
-
|
215
|
-
# TODO: address the fact that this line mutates the buffer.
|
216
|
-
temp_buffer.put_bytes(buffer.get_bytes(buffer.length))
|
217
|
-
|
218
|
-
message.serialize(temp_buffer, max_bson_size, MAX_BSON_COMMAND_OVERHEAD)
|
219
|
-
if temp_buffer.length > max_message_size
|
220
|
-
raise Error::MaxMessageSize.new(max_message_size)
|
221
|
-
end
|
214
|
+
final_message.serialize(buffer, max_bson_size)
|
215
|
+
if max_message_size &&
|
216
|
+
(buffer.length - start_size) > max_message_size
|
217
|
+
then
|
218
|
+
raise Error::MaxMessageSize.new(max_message_size)
|
222
219
|
end
|
223
|
-
|
224
|
-
# RUBY-2335: When the un-compressed message is smaller than the maximum
|
225
|
-
# bson size limit, the message will be serialized twice. The operations
|
226
|
-
# layer should be refactored to allow compression on an already-
|
227
|
-
# serialized message.
|
228
|
-
final_message = message.maybe_compress(compressor, options[:zlib_compression_level])
|
229
|
-
final_message.serialize(buffer, max_bson_size, MAX_BSON_COMMAND_OVERHEAD)
|
230
|
-
|
231
220
|
buffer
|
232
221
|
end
|
233
222
|
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
|
@@ -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,8 @@ 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
|
+
@next_earliest_scan = @next_wanted_scan = Time.now
|
80
81
|
end
|
81
82
|
|
82
83
|
# @return [ Server ] server The server that this monitor is monitoring.
|
@@ -89,11 +90,18 @@ module Mongo
|
|
89
90
|
# @return [ Hash ] options The server options.
|
90
91
|
attr_reader :options
|
91
92
|
|
93
|
+
# The interval between regular server checks.
|
94
|
+
#
|
95
|
+
# @return [ Float ] The heartbeat interval, in seconds.
|
96
|
+
def heartbeat_interval
|
97
|
+
options[:heartbeat_interval] || DEFAULT_HEARTBEAT_INTERVAL
|
98
|
+
end
|
99
|
+
|
92
100
|
# @deprecated
|
93
101
|
def_delegators :server, :last_scan
|
94
102
|
|
95
|
-
# The compressor is determined during the handshake, so it must be an
|
96
|
-
# of the connection.
|
103
|
+
# The compressor is determined during the handshake, so it must be an
|
104
|
+
# attribute of the connection.
|
97
105
|
#
|
98
106
|
# @deprecated
|
99
107
|
def_delegators :connection, :compressor
|
@@ -101,17 +109,6 @@ module Mongo
|
|
101
109
|
# @return [ Monitoring ] monitoring The monitoring.
|
102
110
|
attr_reader :monitoring
|
103
111
|
|
104
|
-
# Get the refresh interval for the server. This will be defined via an
|
105
|
-
# option or will default to 10.
|
106
|
-
#
|
107
|
-
# @return [ Float ] The heartbeat interval, in seconds.
|
108
|
-
#
|
109
|
-
# @since 2.0.0
|
110
|
-
# @deprecated
|
111
|
-
def heartbeat_frequency
|
112
|
-
server.cluster.heartbeat_interval
|
113
|
-
end
|
114
|
-
|
115
112
|
# Runs the server monitor. Refreshing happens on a separate thread per
|
116
113
|
# server.
|
117
114
|
#
|
@@ -123,11 +120,14 @@ module Mongo
|
|
123
120
|
# @since 2.0.0
|
124
121
|
def do_work
|
125
122
|
scan!
|
126
|
-
|
123
|
+
delta = @next_wanted_scan - Time.now
|
124
|
+
if delta > 0
|
125
|
+
server.scan_semaphore.wait(delta)
|
126
|
+
end
|
127
127
|
end
|
128
128
|
|
129
|
-
# Stop the background thread and wait for to terminate for a
|
130
|
-
# amount of time.
|
129
|
+
# Stop the background thread and wait for it to terminate for a
|
130
|
+
# reasonable amount of time.
|
131
131
|
#
|
132
132
|
# @return [ true | false ] Whether the thread was terminated.
|
133
133
|
#
|
@@ -136,39 +136,54 @@ module Mongo
|
|
136
136
|
# Forward super's return value
|
137
137
|
super.tap do
|
138
138
|
# Important: disconnect should happen after the background thread
|
139
|
-
#
|
140
|
-
connection
|
139
|
+
# terminates.
|
140
|
+
connection&.disconnect!
|
141
141
|
end
|
142
142
|
end
|
143
143
|
|
144
144
|
# Perform a check of the server with throttling, and update
|
145
145
|
# the server's description and average round trip time.
|
146
146
|
#
|
147
|
-
# If the server was checked less than
|
148
|
-
# ago, sleep until
|
147
|
+
# If the server was checked less than MIN_SCAN_INTERVAL seconds
|
148
|
+
# ago, sleep until MIN_SCAN_INTERVAL seconds have passed since the last
|
149
149
|
# check. Then perform the check which involves running isMaster
|
150
150
|
# on the server being monitored and updating the server description
|
151
151
|
# as a result.
|
152
152
|
#
|
153
|
-
# @note If the system clock
|
154
|
-
#
|
153
|
+
# @note If the system clock moves backwards, this method can sleep
|
154
|
+
# for a very long time.
|
155
155
|
#
|
156
156
|
# @note The return value of this method is deprecated. In version 3.0.0
|
157
157
|
# this method will not have a return value.
|
158
158
|
#
|
159
|
-
# @example Run a scan.
|
160
|
-
# monitor.scan!
|
161
|
-
#
|
162
159
|
# @return [ Description ] The updated description.
|
163
160
|
#
|
164
161
|
# @since 2.0.0
|
165
162
|
def scan!
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
163
|
+
# Ordinarily the background thread would invoke this method.
|
164
|
+
# But it is also possible to invoke scan! directly on a monitor.
|
165
|
+
# Allow only one scan to be performed at a time.
|
166
|
+
@mutex.synchronize do
|
167
|
+
throttle_scan_frequency!
|
168
|
+
|
169
|
+
result = do_scan
|
170
|
+
|
171
|
+
old_description = server.description
|
172
|
+
|
173
|
+
new_description = Description.new(server.address, result,
|
174
|
+
server.round_trip_time_averager.average_round_trip_time)
|
175
|
+
|
176
|
+
server.cluster.run_sdam_flow(server.description, new_description)
|
177
|
+
|
178
|
+
server.description.tap do |new_description|
|
179
|
+
if new_description.unknown? && !old_description.unknown?
|
180
|
+
@next_earliest_scan = @next_wanted_scan = Time.now
|
181
|
+
else
|
182
|
+
@next_earliest_scan = Time.now + MIN_SCAN_INTERVAL
|
183
|
+
@next_wanted_scan = Time.now + heartbeat_interval
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
172
187
|
end
|
173
188
|
|
174
189
|
# Restarts the server monitor unless the current thread is alive.
|
@@ -193,54 +208,83 @@ module Mongo
|
|
193
208
|
server.scan_semaphore.signal
|
194
209
|
end
|
195
210
|
|
196
|
-
def
|
197
|
-
|
211
|
+
def do_scan
|
212
|
+
if monitoring.monitoring?
|
213
|
+
monitoring.started(
|
214
|
+
Monitoring::SERVER_HEARTBEAT,
|
215
|
+
Monitoring::Event::ServerHeartbeatStarted.new(server.address)
|
216
|
+
)
|
217
|
+
end
|
218
|
+
|
219
|
+
# The duration we publish in heartbeat succeeded/failed events is
|
220
|
+
# the time spent on the entire heartbeat. This could include time
|
221
|
+
# to connect the socket (including TLS handshake), not just time
|
222
|
+
# spent on ismaster call itself.
|
223
|
+
# The spec at https://github.com/mongodb/specifications/blob/master/source/server-discovery-and-monitoring/server-discovery-and-monitoring-monitoring.rst
|
224
|
+
# requires that the duration exposed here start from "sending the
|
225
|
+
# message" (ismaster). This requirement does not make sense if,
|
226
|
+
# for example, we were never able to connect to the server at all
|
227
|
+
# and thus ismaster was never sent.
|
228
|
+
start_time = Time.now
|
229
|
+
|
230
|
+
begin
|
231
|
+
result = ismaster
|
232
|
+
rescue => exc
|
233
|
+
log_warn("Error running ismaster on #{server.address}: #{exc.class}: #{exc}:\n#{exc.backtrace[0..5].join("\n")}")
|
198
234
|
if monitoring.monitoring?
|
199
|
-
monitoring.
|
235
|
+
monitoring.failed(
|
200
236
|
Monitoring::SERVER_HEARTBEAT,
|
201
|
-
Monitoring::Event::
|
237
|
+
Monitoring::Event::ServerHeartbeatFailed.new(server.address, Time.now-start_time, exc)
|
202
238
|
)
|
203
239
|
end
|
204
|
-
|
205
|
-
|
206
|
-
|
240
|
+
result = {}
|
241
|
+
else
|
242
|
+
if monitoring.monitoring?
|
243
|
+
monitoring.succeeded(
|
244
|
+
Monitoring::SERVER_HEARTBEAT,
|
245
|
+
Monitoring::Event::ServerHeartbeatSucceeded.new(server.address, Time.now-start_time)
|
246
|
+
)
|
207
247
|
end
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
)
|
248
|
+
end
|
249
|
+
result
|
250
|
+
end
|
251
|
+
|
252
|
+
def ismaster
|
253
|
+
if @connection && @connection.pid != Process.pid
|
254
|
+
log_warn("Detected PID change - Mongo client should have been reconnected (old pid #{@connection.pid}, new pid #{Process.pid}")
|
255
|
+
@connection.disconnect!
|
256
|
+
@connection = nil
|
257
|
+
end
|
258
|
+
|
259
|
+
if @connection
|
260
|
+
result = server.round_trip_time_averager.measure do
|
261
|
+
begin
|
262
|
+
message = @connection.dispatch_bytes(Monitor::Connection::ISMASTER_BYTES)
|
263
|
+
message.documents.first
|
264
|
+
rescue Mongo::Error
|
265
|
+
@connection.disconnect!
|
266
|
+
@connection = nil
|
267
|
+
raise
|
223
268
|
end
|
224
269
|
end
|
225
|
-
|
270
|
+
else
|
271
|
+
connection = Connection.new(server.address, options)
|
272
|
+
connection.connect!
|
273
|
+
result = server.round_trip_time_averager.measure do
|
274
|
+
connection.handshake!
|
275
|
+
end
|
276
|
+
@connection = connection
|
226
277
|
end
|
278
|
+
result
|
227
279
|
end
|
228
280
|
|
229
281
|
# @note If the system clock is set to a time in the past, this method
|
230
282
|
# can sleep for a very long time.
|
231
283
|
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
|
284
|
+
delta = @next_earliest_scan - Time.now
|
285
|
+
if delta > 0
|
286
|
+
sleep(delta)
|
242
287
|
end
|
243
|
-
@scan_started_at = Time.now
|
244
288
|
end
|
245
289
|
end
|
246
290
|
end
|