mongo 2.22.0 → 2.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/mongo_console +0 -1
- data/lib/mongo/active_support.rb +1 -2
- data/lib/mongo/address/ipv4.rb +3 -6
- data/lib/mongo/address/ipv6.rb +6 -10
- data/lib/mongo/address/unix.rb +1 -4
- data/lib/mongo/address/validator.rb +16 -28
- data/lib/mongo/address.rb +30 -40
- data/lib/mongo/auth/aws/conversation.rb +6 -10
- data/lib/mongo/auth/aws/credentials.rb +0 -1
- data/lib/mongo/auth/aws/credentials_cache.rb +0 -1
- data/lib/mongo/auth/aws/credentials_retriever.rb +45 -59
- data/lib/mongo/auth/aws/request.rb +20 -35
- data/lib/mongo/auth/aws.rb +1 -2
- data/lib/mongo/auth/base.rb +20 -29
- data/lib/mongo/auth/conversation_base.rb +14 -18
- data/lib/mongo/auth/cr/conversation.rb +0 -3
- data/lib/mongo/auth/cr.rb +1 -4
- data/lib/mongo/auth/credential_cache.rb +0 -2
- data/lib/mongo/auth/gssapi/conversation.rb +3 -8
- data/lib/mongo/auth/gssapi.rb +1 -4
- data/lib/mongo/auth/ldap/conversation.rb +0 -3
- data/lib/mongo/auth/ldap.rb +1 -4
- data/lib/mongo/auth/roles.rb +16 -19
- data/lib/mongo/auth/sasl_conversation_base.rb +7 -11
- data/lib/mongo/auth/scram/conversation.rb +2 -5
- data/lib/mongo/auth/scram.rb +5 -10
- data/lib/mongo/auth/scram256/conversation.rb +2 -5
- data/lib/mongo/auth/scram256.rb +1 -3
- data/lib/mongo/auth/scram_conversation_base.rb +18 -24
- data/lib/mongo/auth/stringprep/profiles/sasl.rb +17 -18
- data/lib/mongo/auth/stringprep/tables.rb +2209 -2210
- data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +36 -38
- data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +1142 -1150
- data/lib/mongo/auth/stringprep.rb +9 -12
- data/lib/mongo/auth/user/view.rb +3 -5
- data/lib/mongo/auth/user.rb +14 -24
- data/lib/mongo/auth/x509/conversation.rb +0 -3
- data/lib/mongo/auth/x509.rb +7 -9
- data/lib/mongo/auth.rb +18 -30
- data/lib/mongo/background_thread.rb +9 -17
- data/lib/mongo/bson.rb +0 -2
- data/lib/mongo/bulk_write/combineable.rb +0 -3
- data/lib/mongo/bulk_write/ordered_combiner.rb +1 -3
- data/lib/mongo/bulk_write/result.rb +11 -16
- data/lib/mongo/bulk_write/result_combiner.rb +9 -12
- data/lib/mongo/bulk_write/transformable.rb +16 -19
- data/lib/mongo/bulk_write/unordered_combiner.rb +1 -3
- data/lib/mongo/bulk_write/validatable.rb +11 -18
- data/lib/mongo/bulk_write.rb +76 -91
- data/lib/mongo/caching_cursor.rb +2 -7
- data/lib/mongo/client.rb +267 -276
- data/lib/mongo/client_encryption.rb +4 -5
- data/lib/mongo/cluster/periodic_executor.rb +2 -5
- data/lib/mongo/cluster/reapers/cursor_reaper.rb +21 -29
- data/lib/mongo/cluster/reapers/socket_reaper.rb +1 -6
- data/lib/mongo/cluster/sdam_flow.rb +136 -159
- data/lib/mongo/cluster/topology/base.rb +15 -18
- data/lib/mongo/cluster/topology/load_balanced.rb +24 -14
- data/lib/mongo/cluster/topology/no_replica_set_options.rb +3 -6
- data/lib/mongo/cluster/topology/replica_set_no_primary.rb +20 -23
- data/lib/mongo/cluster/topology/replica_set_with_primary.rb +0 -2
- data/lib/mongo/cluster/topology/sharded.rb +19 -9
- data/lib/mongo/cluster/topology/single.rb +24 -14
- data/lib/mongo/cluster/topology/unknown.rb +20 -10
- data/lib/mongo/cluster/topology.rb +29 -25
- data/lib/mongo/cluster.rb +152 -184
- data/lib/mongo/cluster_time.rb +14 -31
- data/lib/mongo/collection/helpers.rb +5 -8
- data/lib/mongo/collection/view/aggregation/behavior.rb +1 -1
- data/lib/mongo/collection/view/aggregation.rb +10 -12
- data/lib/mongo/collection/view/builder/aggregation.rb +6 -9
- data/lib/mongo/collection/view/builder/map_reduce.rb +18 -17
- data/lib/mongo/collection/view/builder.rb +0 -1
- data/lib/mongo/collection/view/change_stream/retryable.rb +3 -8
- data/lib/mongo/collection/view/change_stream.rb +59 -58
- data/lib/mongo/collection/view/explainable.rb +11 -20
- data/lib/mongo/collection/view/immutable.rb +1 -3
- data/lib/mongo/collection/view/iterable.rb +44 -35
- data/lib/mongo/collection/view/map_reduce.rb +20 -25
- data/lib/mongo/collection/view/readable.rb +96 -94
- data/lib/mongo/collection/view/writable.rb +104 -114
- data/lib/mongo/collection/view.rb +11 -8
- data/lib/mongo/collection.rb +103 -106
- data/lib/mongo/condition_variable.rb +4 -4
- data/lib/mongo/config/options.rb +0 -3
- data/lib/mongo/config/validators/option.rb +3 -5
- data/lib/mongo/config.rb +6 -4
- data/lib/mongo/crypt/auto_decryption_context.rb +9 -3
- data/lib/mongo/crypt/auto_encrypter.rb +34 -43
- data/lib/mongo/crypt/auto_encryption_context.rb +0 -3
- data/lib/mongo/crypt/binary.rb +5 -9
- data/lib/mongo/crypt/binding.rb +150 -156
- data/lib/mongo/crypt/context.rb +20 -17
- data/lib/mongo/crypt/data_key_context.rb +2 -7
- data/lib/mongo/crypt/encryption_io.rb +29 -39
- data/lib/mongo/crypt/explicit_decryption_context.rb +9 -3
- data/lib/mongo/crypt/explicit_encrypter.rb +1 -1
- data/lib/mongo/crypt/explicit_encryption_context.rb +19 -30
- data/lib/mongo/crypt/explicit_encryption_expression_context.rb +0 -2
- data/lib/mongo/crypt/handle.rb +42 -48
- data/lib/mongo/crypt/hooks.rb +12 -15
- data/lib/mongo/crypt/kms/aws/credentials.rb +12 -16
- data/lib/mongo/crypt/kms/aws/master_document.rb +6 -9
- data/lib/mongo/crypt/kms/aws.rb +0 -2
- data/lib/mongo/crypt/kms/azure/credentials_retriever.rb +2 -7
- data/lib/mongo/crypt/kms/azure/master_document.rb +15 -19
- data/lib/mongo/crypt/kms/azure.rb +0 -1
- data/lib/mongo/crypt/kms/credentials.rb +13 -27
- data/lib/mongo/crypt/kms/gcp/credentials.rb +12 -14
- data/lib/mongo/crypt/kms/gcp/credentials_retriever.rb +7 -9
- data/lib/mongo/crypt/kms/gcp/master_document.rb +12 -16
- data/lib/mongo/crypt/kms/gcp.rb +0 -2
- data/lib/mongo/crypt/kms/kmip/credentials.rb +7 -8
- data/lib/mongo/crypt/kms/kmip/master_document.rb +3 -5
- data/lib/mongo/crypt/kms/kmip.rb +0 -1
- data/lib/mongo/crypt/kms/local/credentials.rb +7 -8
- data/lib/mongo/crypt/kms/local/master_document.rb +2 -6
- data/lib/mongo/crypt/kms/local.rb +0 -1
- data/lib/mongo/crypt/kms/master_key_document.rb +11 -15
- data/lib/mongo/crypt/kms.rb +14 -16
- data/lib/mongo/crypt/kms_context.rb +0 -2
- data/lib/mongo/crypt/rewrap_many_data_key_context.rb +2 -7
- data/lib/mongo/crypt/rewrap_many_data_key_result.rb +2 -4
- data/lib/mongo/crypt/status.rb +12 -14
- data/lib/mongo/crypt.rb +0 -1
- data/lib/mongo/csot_timeout_holder.rb +3 -2
- data/lib/mongo/cursor/kill_spec.rb +7 -10
- data/lib/mongo/cursor.rb +74 -64
- data/lib/mongo/cursor_host.rb +8 -10
- data/lib/mongo/database/view.rb +23 -39
- data/lib/mongo/database.rb +68 -65
- data/lib/mongo/dbref.rb +0 -1
- data/lib/mongo/deprecations.rb +98 -0
- data/lib/mongo/distinguishing_semaphore.rb +0 -1
- data/lib/mongo/error/auth_error.rb +0 -2
- data/lib/mongo/error/bad_load_balancer_target.rb +0 -2
- data/lib/mongo/error/bulk_write_error.rb +7 -10
- data/lib/mongo/error/change_stream_resumable.rb +0 -2
- data/lib/mongo/error/client_closed.rb +0 -2
- data/lib/mongo/error/closed_stream.rb +1 -4
- data/lib/mongo/error/connection_check_out_timeout.rb +3 -6
- data/lib/mongo/error/connection_perished.rb +0 -2
- data/lib/mongo/error/connection_unavailable.rb +0 -2
- data/lib/mongo/error/credential_check_error.rb +0 -2
- data/lib/mongo/error/crypt_error.rb +0 -2
- data/lib/mongo/error/extra_file_chunk.rb +1 -4
- data/lib/mongo/error/failed_string_prep_validation.rb +5 -6
- data/lib/mongo/error/file_not_found.rb +0 -3
- data/lib/mongo/error/handshake_error.rb +0 -2
- data/lib/mongo/error/insufficient_iteration_count.rb +1 -4
- data/lib/mongo/error/internal_driver_error.rb +0 -2
- data/lib/mongo/error/invalid_address.rb +0 -2
- data/lib/mongo/error/invalid_application_name.rb +0 -3
- data/lib/mongo/error/invalid_bulk_operation.rb +1 -4
- data/lib/mongo/error/invalid_bulk_operation_type.rb +1 -4
- data/lib/mongo/error/invalid_collection_name.rb +1 -4
- data/lib/mongo/error/invalid_config_option.rb +0 -3
- data/lib/mongo/error/invalid_cursor_operation.rb +0 -2
- data/lib/mongo/error/invalid_database_name.rb +1 -4
- data/lib/mongo/error/invalid_document.rb +1 -4
- data/lib/mongo/error/invalid_file.rb +0 -3
- data/lib/mongo/error/invalid_file_revision.rb +0 -3
- data/lib/mongo/error/invalid_min_pool_size.rb +0 -3
- data/lib/mongo/error/invalid_nonce.rb +0 -3
- data/lib/mongo/error/invalid_read_concern.rb +2 -4
- data/lib/mongo/error/invalid_read_option.rb +0 -3
- data/lib/mongo/error/invalid_replacement_document.rb +2 -5
- data/lib/mongo/error/invalid_server_auth_host.rb +0 -2
- data/lib/mongo/error/invalid_server_auth_response.rb +0 -2
- data/lib/mongo/error/invalid_server_preference.rb +7 -16
- data/lib/mongo/error/invalid_session.rb +1 -4
- data/lib/mongo/error/invalid_signature.rb +0 -3
- data/lib/mongo/error/invalid_transaction_operation.rb +5 -8
- data/lib/mongo/error/invalid_txt_record.rb +0 -2
- data/lib/mongo/error/invalid_update_document.rb +2 -5
- data/lib/mongo/error/invalid_uri.rb +1 -4
- data/lib/mongo/error/invalid_write_concern.rb +2 -5
- data/lib/mongo/error/kms_error.rb +0 -2
- data/lib/mongo/error/labelable.rb +0 -3
- data/lib/mongo/error/lint_error.rb +0 -2
- data/lib/mongo/error/max_bson_size.rb +8 -11
- data/lib/mongo/error/max_message_size.rb +2 -5
- data/lib/mongo/error/mismatched_domain.rb +0 -2
- data/lib/mongo/error/missing_connection.rb +0 -2
- data/lib/mongo/error/missing_file_chunk.rb +0 -3
- data/lib/mongo/error/missing_password.rb +0 -2
- data/lib/mongo/error/missing_resume_token.rb +1 -4
- data/lib/mongo/error/missing_scram_server_signature.rb +2 -4
- data/lib/mongo/error/missing_service_id.rb +0 -2
- data/lib/mongo/error/mongocryptd_spawn_error.rb +0 -2
- data/lib/mongo/error/multi_index_drop.rb +0 -3
- data/lib/mongo/error/need_primary_server.rb +0 -2
- data/lib/mongo/error/no_server_available.rb +3 -8
- data/lib/mongo/error/no_service_connection_available.rb +1 -3
- data/lib/mongo/error/no_srv_records.rb +0 -2
- data/lib/mongo/error/notable.rb +8 -16
- data/lib/mongo/error/operation_failure.rb +22 -35
- data/lib/mongo/error/parser.rb +33 -75
- data/lib/mongo/error/pool_cleared_error.rb +1 -3
- data/lib/mongo/error/pool_closed_error.rb +0 -3
- data/lib/mongo/error/pool_error.rb +0 -3
- data/lib/mongo/error/pool_paused_error.rb +0 -2
- data/lib/mongo/error/raise_original_error.rb +1 -3
- data/lib/mongo/error/read_write_retryable.rb +14 -17
- data/lib/mongo/error/sdam_error_detection.rb +3 -5
- data/lib/mongo/error/server_api_conflict.rb +0 -2
- data/lib/mongo/error/server_certificate_revoked.rb +0 -2
- data/lib/mongo/error/server_not_usable.rb +0 -2
- data/lib/mongo/error/session_ended.rb +1 -3
- data/lib/mongo/error/session_not_materialized.rb +1 -3
- data/lib/mongo/error/sessions_not_supported.rb +1 -4
- data/lib/mongo/error/snapshot_session_invalid_server_version.rb +1 -4
- data/lib/mongo/error/snapshot_session_transaction_prohibited.rb +1 -4
- data/lib/mongo/error/socket_error.rb +0 -2
- data/lib/mongo/error/socket_timeout_error.rb +0 -2
- data/lib/mongo/error/transactions_not_supported.rb +3 -6
- data/lib/mongo/error/unchangeable_collection_option.rb +1 -4
- data/lib/mongo/error/unexpected_chunk_length.rb +0 -3
- data/lib/mongo/error/unexpected_response.rb +1 -4
- data/lib/mongo/error/unknown_payload_type.rb +0 -3
- data/lib/mongo/error/unmet_dependency.rb +0 -2
- data/lib/mongo/error/unsupported_array_filters.rb +3 -24
- data/lib/mongo/error/unsupported_collation.rb +3 -24
- data/lib/mongo/error/unsupported_features.rb +0 -2
- data/lib/mongo/error/unsupported_message_type.rb +0 -2
- data/lib/mongo/error/unsupported_option.rb +19 -21
- data/lib/mongo/error/write_retryable.rb +0 -2
- data/lib/mongo/error.rb +10 -24
- data/lib/mongo/event/base.rb +0 -2
- data/lib/mongo/event/listeners.rb +0 -3
- data/lib/mongo/event/publisher.rb +0 -3
- data/lib/mongo/event/subscriber.rb +0 -4
- data/lib/mongo/event.rb +4 -6
- data/lib/mongo/grid/file/chunk.rb +7 -10
- data/lib/mongo/grid/file/info.rb +20 -24
- data/lib/mongo/grid/file.rb +7 -8
- data/lib/mongo/grid/fs_bucket.rb +40 -48
- data/lib/mongo/grid/stream/read.rb +25 -35
- data/lib/mongo/grid/stream/write.rb +17 -22
- data/lib/mongo/grid/stream.rb +2 -4
- data/lib/mongo/grid.rb +0 -1
- data/lib/mongo/id.rb +0 -1
- data/lib/mongo/index/view.rb +68 -58
- data/lib/mongo/index.rb +7 -10
- data/lib/mongo/lint.rb +31 -37
- data/lib/mongo/loggable.rb +5 -8
- data/lib/mongo/logger.rb +1 -7
- data/lib/mongo/monitoring/cmap_log_subscriber.rb +0 -2
- data/lib/mongo/monitoring/command_log_subscriber.rb +25 -33
- data/lib/mongo/monitoring/event/cmap/base.rb +0 -2
- data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +1 -4
- data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +0 -3
- data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +1 -4
- data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +2 -5
- data/lib/mongo/monitoring/event/cmap/connection_closed.rb +1 -4
- data/lib/mongo/monitoring/event/cmap/connection_created.rb +1 -4
- data/lib/mongo/monitoring/event/cmap/connection_ready.rb +1 -4
- data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +0 -3
- data/lib/mongo/monitoring/event/cmap/pool_closed.rb +1 -4
- data/lib/mongo/monitoring/event/cmap/pool_created.rb +1 -4
- data/lib/mongo/monitoring/event/cmap/pool_ready.rb +1 -4
- data/lib/mongo/monitoring/event/cmap.rb +0 -1
- data/lib/mongo/monitoring/event/command_failed.rb +5 -9
- data/lib/mongo/monitoring/event/command_started.rb +8 -12
- data/lib/mongo/monitoring/event/command_succeeded.rb +7 -15
- data/lib/mongo/monitoring/event/secure.rb +15 -20
- data/lib/mongo/monitoring/event/server_closed.rb +1 -4
- data/lib/mongo/monitoring/event/server_description_changed.rb +4 -8
- data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +5 -10
- data/lib/mongo/monitoring/event/server_heartbeat_started.rb +1 -4
- data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +3 -8
- data/lib/mongo/monitoring/event/server_opening.rb +1 -4
- data/lib/mongo/monitoring/event/topology_changed.rb +2 -5
- data/lib/mongo/monitoring/event/topology_closed.rb +1 -4
- data/lib/mongo/monitoring/event/topology_opening.rb +1 -4
- data/lib/mongo/monitoring/event.rb +0 -1
- data/lib/mongo/monitoring/publishable.rb +20 -30
- data/lib/mongo/monitoring/sdam_log_subscriber.rb +0 -2
- data/lib/mongo/monitoring/server_closed_log_subscriber.rb +0 -3
- data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +0 -3
- data/lib/mongo/monitoring/server_opening_log_subscriber.rb +0 -3
- data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +5 -8
- data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +0 -3
- data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +0 -3
- data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +1 -3
- data/lib/mongo/monitoring.rb +38 -39
- data/lib/mongo/operation/aggregate/op_msg.rb +0 -2
- data/lib/mongo/operation/aggregate/result.rb +3 -6
- data/lib/mongo/operation/aggregate.rb +0 -2
- data/lib/mongo/operation/collections_info/result.rb +0 -3
- data/lib/mongo/operation/collections_info.rb +0 -2
- data/lib/mongo/operation/command/op_msg.rb +1 -4
- data/lib/mongo/operation/command.rb +0 -2
- data/lib/mongo/operation/context.rb +13 -16
- data/lib/mongo/operation/count/op_msg.rb +2 -4
- data/lib/mongo/operation/count.rb +0 -2
- data/lib/mongo/operation/create/op_msg.rb +2 -5
- data/lib/mongo/operation/create.rb +4 -2
- data/lib/mongo/operation/create_index/op_msg.rb +3 -7
- data/lib/mongo/operation/create_index.rb +0 -2
- data/lib/mongo/operation/create_user/op_msg.rb +2 -4
- data/lib/mongo/operation/create_user.rb +0 -2
- data/lib/mongo/operation/delete/bulk_result.rb +2 -3
- data/lib/mongo/operation/delete/op_msg.rb +3 -10
- data/lib/mongo/operation/delete/result.rb +0 -3
- data/lib/mongo/operation/delete.rb +1 -5
- data/lib/mongo/operation/distinct/op_msg.rb +2 -5
- data/lib/mongo/operation/distinct.rb +0 -2
- data/lib/mongo/operation/drop/op_msg.rb +0 -2
- data/lib/mongo/operation/drop.rb +0 -2
- data/lib/mongo/operation/drop_database/op_msg.rb +0 -2
- data/lib/mongo/operation/drop_database.rb +0 -2
- data/lib/mongo/operation/drop_index/op_msg.rb +4 -6
- data/lib/mongo/operation/drop_index.rb +0 -2
- data/lib/mongo/operation/explain/op_msg.rb +0 -2
- data/lib/mongo/operation/explain/result.rb +0 -3
- data/lib/mongo/operation/explain.rb +0 -2
- data/lib/mongo/operation/find/builder/command.rb +4 -12
- data/lib/mongo/operation/find/builder/flags.rb +9 -15
- data/lib/mongo/operation/find/builder/modifiers.rb +1 -4
- data/lib/mongo/operation/find/builder.rb +0 -1
- data/lib/mongo/operation/find/op_msg.rb +4 -12
- data/lib/mongo/operation/find/result.rb +0 -3
- data/lib/mongo/operation/find.rb +0 -2
- data/lib/mongo/operation/get_more/command_builder.rb +1 -6
- data/lib/mongo/operation/get_more/op_msg.rb +10 -4
- data/lib/mongo/operation/get_more/result.rb +0 -3
- data/lib/mongo/operation/get_more.rb +0 -2
- data/lib/mongo/operation/indexes/op_msg.rb +0 -2
- data/lib/mongo/operation/indexes/result.rb +1 -5
- data/lib/mongo/operation/indexes.rb +0 -2
- data/lib/mongo/operation/insert/bulk_result.rb +2 -6
- data/lib/mongo/operation/insert/op_msg.rb +7 -6
- data/lib/mongo/operation/insert/result.rb +0 -3
- data/lib/mongo/operation/insert.rb +2 -5
- data/lib/mongo/operation/kill_cursors/command_builder.rb +0 -3
- data/lib/mongo/operation/kill_cursors/op_msg.rb +1 -3
- data/lib/mongo/operation/kill_cursors.rb +0 -2
- data/lib/mongo/operation/list_collections/op_msg.rb +4 -6
- data/lib/mongo/operation/list_collections/result.rb +1 -4
- data/lib/mongo/operation/list_collections.rb +0 -2
- data/lib/mongo/operation/map_reduce/op_msg.rb +0 -2
- data/lib/mongo/operation/map_reduce/result.rb +3 -6
- data/lib/mongo/operation/map_reduce.rb +0 -2
- data/lib/mongo/operation/op_msg_base.rb +0 -1
- data/lib/mongo/operation/parallel_scan/op_msg.rb +4 -5
- data/lib/mongo/operation/parallel_scan/result.rb +2 -5
- data/lib/mongo/operation/parallel_scan.rb +0 -2
- data/lib/mongo/operation/remove_user/op_msg.rb +2 -4
- data/lib/mongo/operation/remove_user.rb +0 -2
- data/lib/mongo/operation/result.rb +38 -48
- data/lib/mongo/operation/shared/bypass_document_validation.rb +3 -7
- data/lib/mongo/operation/shared/causal_consistency_supported.rb +0 -3
- data/lib/mongo/operation/shared/executable.rb +29 -31
- data/lib/mongo/operation/shared/executable_no_validate.rb +0 -3
- data/lib/mongo/operation/shared/executable_transaction_label.rb +0 -2
- data/lib/mongo/operation/shared/idable.rb +3 -6
- data/lib/mongo/operation/shared/limited.rb +0 -3
- data/lib/mongo/operation/shared/object_id_generator.rb +0 -3
- data/lib/mongo/operation/shared/op_msg_executable.rb +0 -2
- data/lib/mongo/operation/shared/polymorphic_lookup.rb +0 -2
- data/lib/mongo/operation/shared/polymorphic_result.rb +2 -4
- data/lib/mongo/operation/shared/read_preference_supported.rb +10 -15
- data/lib/mongo/operation/shared/response_handling.rb +13 -26
- data/lib/mongo/operation/shared/result/aggregatable.rb +12 -13
- data/lib/mongo/operation/shared/sessions_supported.rb +87 -99
- data/lib/mongo/operation/shared/specifiable.rb +37 -59
- data/lib/mongo/operation/shared/write.rb +12 -17
- data/lib/mongo/operation/shared/write_concern_supported.rb +4 -7
- data/lib/mongo/operation/update/bulk_result.rb +13 -17
- data/lib/mongo/operation/update/op_msg.rb +2 -5
- data/lib/mongo/operation/update/result.rb +5 -5
- data/lib/mongo/operation/update.rb +1 -5
- data/lib/mongo/operation/update_user/op_msg.rb +2 -4
- data/lib/mongo/operation/update_user.rb +0 -2
- data/lib/mongo/operation/users_info/op_msg.rb +2 -4
- data/lib/mongo/operation/users_info/result.rb +1 -4
- data/lib/mongo/operation/users_info.rb +0 -2
- data/lib/mongo/operation/write_command/op_msg.rb +2 -10
- data/lib/mongo/operation/write_command.rb +0 -2
- data/lib/mongo/operation.rb +9 -14
- data/lib/mongo/options/mapper.rb +8 -15
- data/lib/mongo/options/redacted.rb +7 -9
- data/lib/mongo/options.rb +0 -1
- data/lib/mongo/protocol/bit_vector.rb +3 -5
- data/lib/mongo/protocol/caching_hash.rb +2 -7
- data/lib/mongo/protocol/compressed.rb +5 -10
- data/lib/mongo/protocol/get_more.rb +2 -8
- data/lib/mongo/protocol/kill_cursors.rb +2 -8
- data/lib/mongo/protocol/message.rb +103 -105
- data/lib/mongo/protocol/msg.rb +48 -63
- data/lib/mongo/protocol/query.rb +32 -41
- data/lib/mongo/protocol/registry.rb +2 -5
- data/lib/mongo/protocol/reply.rb +10 -16
- data/lib/mongo/protocol/serializers.rb +41 -59
- data/lib/mongo/protocol.rb +0 -1
- data/lib/mongo/query_cache.rb +7 -15
- data/lib/mongo/retryable/backpressure.rb +31 -0
- data/lib/mongo/retryable/base_worker.rb +39 -13
- data/lib/mongo/retryable/read_worker.rb +77 -21
- data/lib/mongo/retryable/retry_policy.rb +59 -0
- data/lib/mongo/retryable/write_worker.rb +155 -56
- data/lib/mongo/retryable.rb +70 -9
- data/lib/mongo/search_index/view.rb +30 -10
- data/lib/mongo/semaphore.rb +0 -1
- data/lib/mongo/server/app_metadata/environment.rb +3 -3
- data/lib/mongo/server/app_metadata/platform.rb +17 -4
- data/lib/mongo/server/app_metadata.rb +4 -5
- data/lib/mongo/server/connection.rb +79 -61
- data/lib/mongo/server/connection_base.rb +43 -53
- data/lib/mongo/server/connection_common.rb +41 -64
- data/lib/mongo/server/connection_pool/generation_manager.rb +6 -11
- data/lib/mongo/server/connection_pool/populator.rb +1 -4
- data/lib/mongo/server/connection_pool.rb +195 -167
- data/lib/mongo/server/description/features.rb +51 -59
- data/lib/mongo/server/description/load_balancer.rb +0 -2
- data/lib/mongo/server/description.rb +117 -138
- data/lib/mongo/server/monitor/app_metadata.rb +3 -4
- data/lib/mongo/server/monitor/connection.rb +28 -35
- data/lib/mongo/server/monitor.rb +65 -60
- data/lib/mongo/server/pending_connection.rb +70 -71
- data/lib/mongo/server/push_monitor/connection.rb +0 -3
- data/lib/mongo/server/push_monitor.rb +21 -29
- data/lib/mongo/server/round_trip_time_calculator.rb +11 -17
- data/lib/mongo/server.rb +62 -94
- data/lib/mongo/server_selector/base.rb +133 -157
- data/lib/mongo/server_selector/nearest.rb +2 -5
- data/lib/mongo/server_selector/primary.rb +1 -5
- data/lib/mongo/server_selector/primary_preferred.rb +2 -6
- data/lib/mongo/server_selector/secondary.rb +2 -6
- data/lib/mongo/server_selector/secondary_preferred.rb +1 -5
- data/lib/mongo/server_selector.rb +3 -4
- data/lib/mongo/session/server_session.rb +6 -7
- data/lib/mongo/session/session_pool.rb +20 -34
- data/lib/mongo/session.rb +334 -199
- data/lib/mongo/socket/ocsp_cache.rb +8 -13
- data/lib/mongo/socket/ocsp_verifier.rb +69 -70
- data/lib/mongo/socket/ssl.rb +44 -43
- data/lib/mongo/socket/tcp.rb +5 -8
- data/lib/mongo/socket/unix.rb +0 -4
- data/lib/mongo/socket.rb +80 -102
- data/lib/mongo/srv/monitor.rb +10 -11
- data/lib/mongo/srv/resolver.rb +15 -24
- data/lib/mongo/srv/result.rb +25 -21
- data/lib/mongo/srv.rb +0 -1
- data/lib/mongo/timeout.rb +4 -11
- data/lib/mongo/topology_version.rb +8 -13
- data/lib/mongo/tracing/open_telemetry/command_tracer.rb +320 -0
- data/lib/mongo/tracing/open_telemetry/operation_tracer.rb +227 -0
- data/lib/mongo/tracing/open_telemetry/tracer.rb +236 -0
- data/lib/mongo/{error/server_api_not_supported.rb → tracing/open_telemetry.rb} +10 -10
- data/lib/mongo/tracing.rb +42 -0
- data/lib/mongo/uri/options_mapper.rb +135 -126
- data/lib/mongo/uri/srv_protocol.rb +34 -42
- data/lib/mongo/uri.rb +95 -139
- data/lib/mongo/utils.rb +5 -12
- data/lib/mongo/version.rb +1 -1
- data/lib/mongo/write_concern/acknowledged.rb +0 -2
- data/lib/mongo/write_concern/base.rb +6 -6
- data/lib/mongo/write_concern/unacknowledged.rb +0 -2
- data/lib/mongo/write_concern.rb +14 -15
- data/lib/mongo.rb +4 -3
- data/mongo.gemspec +17 -17
- metadata +11 -5
- data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +0 -32
- data/lib/mongo/operation/shared/validatable.rb +0 -87
data/lib/mongo/server/monitor.rb
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
# Copyright (C) 2014-2020 MongoDB Inc.
|
|
5
4
|
#
|
|
@@ -17,7 +16,6 @@
|
|
|
17
16
|
|
|
18
17
|
module Mongo
|
|
19
18
|
class Server
|
|
20
|
-
|
|
21
19
|
# Responsible for periodically polling a server via hello commands to
|
|
22
20
|
# keep the server's status up to date.
|
|
23
21
|
#
|
|
@@ -35,19 +33,19 @@ module Mongo
|
|
|
35
33
|
# The default interval between server status refreshes is 10 seconds.
|
|
36
34
|
#
|
|
37
35
|
# @since 2.0.0
|
|
38
|
-
DEFAULT_HEARTBEAT_INTERVAL = 10
|
|
36
|
+
DEFAULT_HEARTBEAT_INTERVAL = 10
|
|
39
37
|
|
|
40
38
|
# The minimum time between forced server scans. Is
|
|
41
39
|
# minHeartbeatFrequencyMS in the SDAM spec.
|
|
42
40
|
#
|
|
43
41
|
# @since 2.0.0
|
|
44
|
-
MIN_SCAN_INTERVAL = 0.5
|
|
42
|
+
MIN_SCAN_INTERVAL = 0.5
|
|
45
43
|
|
|
46
44
|
# The weighting factor (alpha) for calculating the average moving round trip time.
|
|
47
45
|
#
|
|
48
46
|
# @since 2.0.0
|
|
49
47
|
# @deprecated Will be removed in version 3.0.
|
|
50
|
-
RTT_WEIGHT_FACTOR = 0.2
|
|
48
|
+
RTT_WEIGHT_FACTOR = 0.2
|
|
51
49
|
|
|
52
50
|
# Create the new server monitor.
|
|
53
51
|
#
|
|
@@ -58,7 +56,7 @@ module Mongo
|
|
|
58
56
|
#
|
|
59
57
|
# @param [ Server ] server The server to monitor.
|
|
60
58
|
# @param [ Event::Listeners ] event_listeners The event listeners.
|
|
61
|
-
# @param [ Monitoring ] monitoring The monitoring
|
|
59
|
+
# @param [ Monitoring ] monitoring The monitoring.
|
|
62
60
|
# @param [ Hash ] options The options.
|
|
63
61
|
#
|
|
64
62
|
# @option options [ Float ] :connect_timeout The timeout, in seconds, to
|
|
@@ -76,15 +74,10 @@ module Mongo
|
|
|
76
74
|
# @since 2.0.0
|
|
77
75
|
# @api private
|
|
78
76
|
def initialize(server, event_listeners, monitoring, options = {})
|
|
79
|
-
unless monitoring.is_a?(Monitoring)
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
raise ArgumentError, 'App metadata is required'
|
|
84
|
-
end
|
|
85
|
-
unless options[:push_monitor_app_metadata]
|
|
86
|
-
raise ArgumentError, 'Push monitor app metadata is required'
|
|
87
|
-
end
|
|
77
|
+
raise ArgumentError, "Wrong monitoring type: #{monitoring.inspect}" unless monitoring.is_a?(Monitoring)
|
|
78
|
+
raise ArgumentError, 'App metadata is required' unless options[:app_metadata]
|
|
79
|
+
raise ArgumentError, 'Push monitor app metadata is required' unless options[:push_monitor_app_metadata]
|
|
80
|
+
|
|
88
81
|
@server = server
|
|
89
82
|
@event_listeners = event_listeners
|
|
90
83
|
@monitoring = monitoring
|
|
@@ -142,14 +135,10 @@ module Mongo
|
|
|
142
135
|
# thread exits when requested.
|
|
143
136
|
loop do
|
|
144
137
|
delta = @next_wanted_scan - Time.now
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
end
|
|
150
|
-
else
|
|
151
|
-
break
|
|
152
|
-
end
|
|
138
|
+
break unless delta > 0
|
|
139
|
+
|
|
140
|
+
signaled = server.scan_semaphore.wait(delta)
|
|
141
|
+
break if signaled || @stop_requested
|
|
153
142
|
end
|
|
154
143
|
end
|
|
155
144
|
|
|
@@ -172,19 +161,17 @@ module Mongo
|
|
|
172
161
|
|
|
173
162
|
def create_push_monitor!(topology_version)
|
|
174
163
|
@update_mutex.synchronize do
|
|
175
|
-
if @push_monitor && !@push_monitor.running?
|
|
176
|
-
@push_monitor = nil
|
|
177
|
-
end
|
|
164
|
+
@push_monitor = nil if @push_monitor && !@push_monitor.running?
|
|
178
165
|
|
|
179
166
|
@push_monitor ||= PushMonitor.new(
|
|
180
167
|
self,
|
|
181
168
|
topology_version,
|
|
182
169
|
monitoring,
|
|
183
170
|
**Utils.shallow_symbolize_keys(options.merge(
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
171
|
+
socket_timeout: heartbeat_interval + connection.socket_timeout,
|
|
172
|
+
app_metadata: options[:push_monitor_app_metadata],
|
|
173
|
+
check_document: @connection.check_document
|
|
174
|
+
))
|
|
188
175
|
)
|
|
189
176
|
end
|
|
190
177
|
end
|
|
@@ -225,7 +212,7 @@ module Mongo
|
|
|
225
212
|
|
|
226
213
|
begin
|
|
227
214
|
result = do_scan
|
|
228
|
-
rescue => e
|
|
215
|
+
rescue StandardError => e
|
|
229
216
|
run_sdam_flow({}, scan_error: e)
|
|
230
217
|
else
|
|
231
218
|
run_sdam_flow(result)
|
|
@@ -286,19 +273,16 @@ module Mongo
|
|
|
286
273
|
end
|
|
287
274
|
|
|
288
275
|
def do_scan
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
check
|
|
292
|
-
end
|
|
293
|
-
rescue => exc
|
|
294
|
-
msg = "Error checking #{server.address}"
|
|
295
|
-
Utils.warn_bg_exception(msg, exc,
|
|
296
|
-
logger: options[:logger],
|
|
297
|
-
log_prefix: options[:log_prefix],
|
|
298
|
-
bg_error_backtrace: options[:bg_error_backtrace],
|
|
299
|
-
)
|
|
300
|
-
raise exc
|
|
276
|
+
monitoring.publish_heartbeat(server) do
|
|
277
|
+
check
|
|
301
278
|
end
|
|
279
|
+
rescue StandardError => e
|
|
280
|
+
msg = "Error checking #{server.address}"
|
|
281
|
+
Utils.warn_bg_exception(msg, e,
|
|
282
|
+
logger: options[:logger],
|
|
283
|
+
log_prefix: options[:log_prefix],
|
|
284
|
+
bg_error_backtrace: options[:bg_error_backtrace])
|
|
285
|
+
raise e
|
|
302
286
|
end
|
|
303
287
|
|
|
304
288
|
def check
|
|
@@ -310,18 +294,16 @@ module Mongo
|
|
|
310
294
|
|
|
311
295
|
if @connection
|
|
312
296
|
result = server.round_trip_time_calculator.measure do
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
raise
|
|
324
|
-
end
|
|
297
|
+
doc = @connection.check_document
|
|
298
|
+
cmd = Protocol::Query.new(
|
|
299
|
+
Database::ADMIN, Database::COMMAND, doc, limit: -1
|
|
300
|
+
)
|
|
301
|
+
message = @connection.dispatch_bytes(cmd.serialize.to_s)
|
|
302
|
+
message.documents.first
|
|
303
|
+
rescue Mongo::Error
|
|
304
|
+
@connection.disconnect!
|
|
305
|
+
@connection = nil
|
|
306
|
+
raise
|
|
325
307
|
end
|
|
326
308
|
else
|
|
327
309
|
connection = Connection.new(server.address, options)
|
|
@@ -331,9 +313,12 @@ module Mongo
|
|
|
331
313
|
end
|
|
332
314
|
@connection = connection
|
|
333
315
|
if tv_doc = result['topologyVersion']
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
316
|
+
if streaming_enabled?
|
|
317
|
+
create_push_monitor!(TopologyVersion.new(tv_doc))
|
|
318
|
+
push_monitor.run!
|
|
319
|
+
else
|
|
320
|
+
stop_push_monitor!
|
|
321
|
+
end
|
|
337
322
|
else
|
|
338
323
|
# Failed response or pre-4.4 server
|
|
339
324
|
stop_push_monitor!
|
|
@@ -347,8 +332,28 @@ module Mongo
|
|
|
347
332
|
# can sleep for a very long time.
|
|
348
333
|
def throttle_scan_frequency!
|
|
349
334
|
delta = @next_earliest_scan - Time.now
|
|
350
|
-
|
|
351
|
-
|
|
335
|
+
return unless delta > 0
|
|
336
|
+
|
|
337
|
+
sleep(delta)
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
# Returns whether the streaming protocol is enabled, based on the
|
|
341
|
+
# serverMonitoringMode option. Default mode is :auto.
|
|
342
|
+
#
|
|
343
|
+
# - :stream - always use streaming when server supports it
|
|
344
|
+
# - :poll - never use streaming
|
|
345
|
+
# - :auto - use polling on FaaS platforms, streaming otherwise
|
|
346
|
+
#
|
|
347
|
+
# @return [ true | false ] Whether streaming is enabled.
|
|
348
|
+
def streaming_enabled?
|
|
349
|
+
mode = options[:server_monitoring_mode] || :auto
|
|
350
|
+
case mode
|
|
351
|
+
when :poll
|
|
352
|
+
false
|
|
353
|
+
when :stream
|
|
354
|
+
true
|
|
355
|
+
when :auto
|
|
356
|
+
!Server::AppMetadata::Environment.new.faas?
|
|
352
357
|
end
|
|
353
358
|
end
|
|
354
359
|
end
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
# Copyright (C) 2019-2020 MongoDB Inc.
|
|
5
4
|
#
|
|
@@ -17,7 +16,6 @@
|
|
|
17
16
|
|
|
18
17
|
module Mongo
|
|
19
18
|
class Server
|
|
20
|
-
|
|
21
19
|
# This class encapsulates connections during handshake and authentication.
|
|
22
20
|
#
|
|
23
21
|
# @api private
|
|
@@ -44,6 +42,7 @@ module Mongo
|
|
|
44
42
|
# but at this point we don't know the mechanism that ultimately
|
|
45
43
|
# will be used (since this depends on the data returned by
|
|
46
44
|
# the handshake, specifically server version).
|
|
45
|
+
#
|
|
47
46
|
# However, we know that only 4.4+ servers support speculative
|
|
48
47
|
# authentication, and those servers also generally support
|
|
49
48
|
# SCRAM-SHA-256. We expect that user accounts created for 4.4+
|
|
@@ -51,15 +50,17 @@ module Mongo
|
|
|
51
50
|
# user accounts migrated from pre-4.4 servers may only allow
|
|
52
51
|
# SCRAM-SHA-1. The use of SCRAM-SHA-256 by default is thus
|
|
53
52
|
# sensible, and it is also mandated by the speculative auth spec.
|
|
54
|
-
#
|
|
53
|
+
#
|
|
54
|
+
# If no mechanism was specified and we are talking to a 4.2
|
|
55
55
|
# server, we'll send speculative auth document, the server will
|
|
56
56
|
# ignore it and we'll perform authentication using explicit
|
|
57
|
-
# command
|
|
57
|
+
# command.
|
|
58
|
+
#
|
|
58
59
|
# If no mechanism was specified and we are talking to a 4.4+
|
|
59
60
|
# server and the user account doesn't allow SCRAM-SHA-256, we will
|
|
60
61
|
# authenticate in a separate command with SCRAM-SHA-1 after
|
|
61
62
|
# going through SCRAM mechanism negotiation.
|
|
62
|
-
default_options = Options::Redacted.new(:
|
|
63
|
+
default_options = Options::Redacted.new(auth_mech: :scram256)
|
|
63
64
|
speculative_auth_user = Auth::User.new(default_options.merge(options))
|
|
64
65
|
speculative_auth = Auth.get(speculative_auth_user, self)
|
|
65
66
|
speculative_auth_doc = speculative_auth.conversation.speculative_auth_document
|
|
@@ -68,17 +69,15 @@ module Mongo
|
|
|
68
69
|
result = handshake!(speculative_auth_doc: speculative_auth_doc)
|
|
69
70
|
|
|
70
71
|
if description.unknown?
|
|
71
|
-
raise Error::InternalDriverError,
|
|
72
|
+
raise Error::InternalDriverError,
|
|
73
|
+
"Connection description cannot be unknown after successful handshake: #{description.inspect}"
|
|
72
74
|
end
|
|
73
75
|
|
|
74
76
|
begin
|
|
75
77
|
if speculative_auth_doc && (speculative_auth_result = result['speculativeAuthenticate'])
|
|
76
|
-
unless description.features.scram_sha_1_enabled?
|
|
77
|
-
raise Error::InvalidServerAuthResponse, "Speculative auth succeeded on a pre-3.0 server"
|
|
78
|
-
end
|
|
79
78
|
case speculative_auth_user.mechanism
|
|
80
79
|
when :mongodb_x509
|
|
81
|
-
|
|
80
|
+
# Done
|
|
82
81
|
# We default auth mechanism to scram256, but if user specified
|
|
83
82
|
# scram explicitly we may be able to authenticate speculatively
|
|
84
83
|
# with scram.
|
|
@@ -86,26 +85,31 @@ module Mongo
|
|
|
86
85
|
authenticate!(
|
|
87
86
|
speculative_auth_client_nonce: speculative_auth.conversation.client_nonce,
|
|
88
87
|
speculative_auth_mech: speculative_auth_user.mechanism,
|
|
89
|
-
speculative_auth_result: speculative_auth_result
|
|
88
|
+
speculative_auth_result: speculative_auth_result
|
|
90
89
|
)
|
|
91
90
|
else
|
|
92
|
-
raise Error::InternalDriverError,
|
|
91
|
+
raise Error::InternalDriverError,
|
|
92
|
+
"Speculative auth unexpectedly succeeded for mechanism #{speculative_auth_user.mechanism.inspect}"
|
|
93
93
|
end
|
|
94
94
|
elsif !description.arbiter?
|
|
95
95
|
authenticate!
|
|
96
96
|
end
|
|
97
|
-
rescue Mongo::Error, Mongo::Error::AuthError =>
|
|
98
|
-
|
|
97
|
+
rescue Mongo::Error, Mongo::Error::AuthError => e
|
|
98
|
+
e.service_id = service_id
|
|
99
99
|
raise
|
|
100
100
|
end
|
|
101
101
|
|
|
102
102
|
if description.unknown?
|
|
103
|
-
raise Error::InternalDriverError,
|
|
103
|
+
raise Error::InternalDriverError,
|
|
104
|
+
"Connection description cannot be unknown after successful authentication: #{description.inspect}"
|
|
104
105
|
end
|
|
105
106
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
107
|
+
return unless server.load_balancer? && !description.mongos?
|
|
108
|
+
|
|
109
|
+
raise Error::BadLoadBalancerTarget,
|
|
110
|
+
"Load-balanced operation requires being connected a mongos, but the server at #{address.seed} reported itself as #{description.server_type.to_s.tr(
|
|
111
|
+
'_', ' '
|
|
112
|
+
)}"
|
|
109
113
|
end
|
|
110
114
|
|
|
111
115
|
private
|
|
@@ -148,25 +152,31 @@ module Mongo
|
|
|
148
152
|
)
|
|
149
153
|
doc = nil
|
|
150
154
|
@server.handle_handshake_failure! do
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
155
|
+
response = get_handshake_response(hello_command)
|
|
156
|
+
result = Operation::Result.new([ response ])
|
|
157
|
+
result.validate!
|
|
158
|
+
doc = result.documents.first
|
|
159
|
+
rescue StandardError => e
|
|
160
|
+
msg = "Failed to handshake with #{address}"
|
|
161
|
+
Utils.warn_bg_exception(msg, e,
|
|
162
|
+
logger: options[:logger],
|
|
163
|
+
log_prefix: options[:log_prefix],
|
|
164
|
+
bg_error_backtrace: options[:bg_error_backtrace])
|
|
165
|
+
# The SystemOverloadedError label marks errors as back-pressure
|
|
166
|
+
# signals that should not cause the server to be marked Unknown.
|
|
167
|
+
# Per the SDAM spec, this label only applies to network errors
|
|
168
|
+
# during the handshake. Command errors (e.g. OperationFailure
|
|
169
|
+
# with "node is shutting down" codes) must still flow through
|
|
170
|
+
# normal SDAM error handling so the server is marked Unknown
|
|
171
|
+
# and the pool is cleared.
|
|
172
|
+
if e.is_a?(::Mongo::Error) && (e.is_a?(Error::SocketError) || e.is_a?(Error::SocketTimeoutError))
|
|
173
|
+
e.add_label('SystemOverloadedError')
|
|
174
|
+
e.add_label('RetryableError')
|
|
164
175
|
end
|
|
176
|
+
raise
|
|
165
177
|
end
|
|
166
178
|
|
|
167
|
-
if @server.force_load_balancer?
|
|
168
|
-
doc['serviceId'] ||= "fake:#{rand(2**32-1)+1}"
|
|
169
|
-
end
|
|
179
|
+
doc['serviceId'] ||= "fake:#{rand((2**32) - 1) + 1}" if @server.force_load_balancer?
|
|
170
180
|
|
|
171
181
|
post_handshake(
|
|
172
182
|
doc,
|
|
@@ -191,26 +201,23 @@ module Mongo
|
|
|
191
201
|
speculative_auth_mech: nil,
|
|
192
202
|
speculative_auth_result: nil
|
|
193
203
|
)
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
raise
|
|
212
|
-
end
|
|
213
|
-
end
|
|
204
|
+
return unless options[:user] || options[:auth_mech]
|
|
205
|
+
|
|
206
|
+
@server.handle_auth_failure! do
|
|
207
|
+
auth = Auth.get(
|
|
208
|
+
resolved_user(speculative_auth_mech: speculative_auth_mech),
|
|
209
|
+
self,
|
|
210
|
+
speculative_auth_client_nonce: speculative_auth_client_nonce,
|
|
211
|
+
speculative_auth_result: speculative_auth_result
|
|
212
|
+
)
|
|
213
|
+
auth.login
|
|
214
|
+
rescue StandardError => e
|
|
215
|
+
msg = "Failed to authenticate to #{address}"
|
|
216
|
+
Utils.warn_bg_exception(msg, e,
|
|
217
|
+
logger: options[:logger],
|
|
218
|
+
log_prefix: options[:log_prefix],
|
|
219
|
+
bg_error_backtrace: options[:bg_error_backtrace])
|
|
220
|
+
raise
|
|
214
221
|
end
|
|
215
222
|
end
|
|
216
223
|
|
|
@@ -222,8 +229,8 @@ module Mongo
|
|
|
222
229
|
#
|
|
223
230
|
# @return [ Server::Description ] The server description calculated from
|
|
224
231
|
# the handshake response for this particular connection.
|
|
225
|
-
def post_handshake(response, average_rtt,
|
|
226
|
-
if response[
|
|
232
|
+
def post_handshake(response, average_rtt, _minimum_rtt)
|
|
233
|
+
if response['ok'] == 1
|
|
227
234
|
# Auth mechanism is entirely dependent on the contents of
|
|
228
235
|
# hello response *for this connection*.
|
|
229
236
|
# Hello received by the monitoring connection should advertise
|
|
@@ -242,7 +249,7 @@ module Mongo
|
|
|
242
249
|
address, response,
|
|
243
250
|
average_round_trip_time: average_rtt,
|
|
244
251
|
load_balancer: server.load_balancer?,
|
|
245
|
-
force_load_balancer: options[:connect] == :load_balanced
|
|
252
|
+
force_load_balancer: options[:connect] == :load_balanced
|
|
246
253
|
).tap do |new_description|
|
|
247
254
|
@server.cluster.run_sdam_flow(@server.description, new_description)
|
|
248
255
|
end
|
|
@@ -276,28 +283,20 @@ module Mongo
|
|
|
276
283
|
# that is what the conversation was started with, even though
|
|
277
284
|
# SCRAM mechanism negotiation did not return SCRAM-SHA-256 as a
|
|
278
285
|
# valid mechanism to use for these credentials.
|
|
279
|
-
:
|
|
286
|
+
auth_mech: speculative_auth_mech || default_mechanism
|
|
280
287
|
).merge(options)
|
|
281
|
-
if user_options[:auth_mech] == :mongodb_x509
|
|
282
|
-
user_options[:auth_source] = '$external'
|
|
283
|
-
end
|
|
288
|
+
user_options[:auth_source] = '$external' if user_options[:auth_mech] == :mongodb_x509
|
|
284
289
|
Auth::User.new(user_options)
|
|
285
290
|
end
|
|
286
291
|
end
|
|
287
292
|
|
|
288
293
|
def default_mechanism
|
|
289
|
-
if description.nil?
|
|
290
|
-
raise Mongo::Error, 'Trying to query default mechanism when handshake has not completed'
|
|
291
|
-
end
|
|
294
|
+
raise Mongo::Error, 'Trying to query default mechanism when handshake has not completed' if description.nil?
|
|
292
295
|
|
|
293
|
-
if
|
|
294
|
-
|
|
295
|
-
:scram256
|
|
296
|
-
else
|
|
297
|
-
:scram
|
|
298
|
-
end
|
|
296
|
+
if @sasl_supported_mechanisms&.include?('SCRAM-SHA-256')
|
|
297
|
+
:scram256
|
|
299
298
|
else
|
|
300
|
-
:
|
|
299
|
+
:scram
|
|
301
300
|
end
|
|
302
301
|
end
|
|
303
302
|
end
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
# Copyright (C) 2020 MongoDB Inc.
|
|
5
4
|
#
|
|
@@ -18,10 +17,8 @@
|
|
|
18
17
|
module Mongo
|
|
19
18
|
class Server
|
|
20
19
|
class PushMonitor
|
|
21
|
-
|
|
22
20
|
# @api private
|
|
23
21
|
class Connection < Server::Monitor::Connection
|
|
24
|
-
|
|
25
22
|
def socket_timeout
|
|
26
23
|
options[:socket_timeout]
|
|
27
24
|
end
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
# Copyright (C) 2020 MongoDB Inc.
|
|
5
4
|
#
|
|
@@ -17,7 +16,6 @@
|
|
|
17
16
|
|
|
18
17
|
module Mongo
|
|
19
18
|
class Server
|
|
20
|
-
|
|
21
19
|
# A monitor utilizing server-pushed hello requests.
|
|
22
20
|
#
|
|
23
21
|
# When a Monitor handshakes with a 4.4+ server, it creates an instance
|
|
@@ -33,15 +31,10 @@ module Mongo
|
|
|
33
31
|
include BackgroundThread
|
|
34
32
|
|
|
35
33
|
def initialize(monitor, topology_version, monitoring, **options)
|
|
36
|
-
if topology_version.nil?
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
raise ArgumentError, 'App metadata is required'
|
|
41
|
-
end
|
|
42
|
-
unless options[:check_document]
|
|
43
|
-
raise ArgumentError, 'Check document is required'
|
|
44
|
-
end
|
|
34
|
+
raise ArgumentError, 'Topology version must be provided but it was nil' if topology_version.nil?
|
|
35
|
+
raise ArgumentError, 'App metadata is required' unless options[:app_metadata]
|
|
36
|
+
raise ArgumentError, 'Check document is required' unless options[:check_document]
|
|
37
|
+
|
|
45
38
|
@app_metadata = options[:app_metadata]
|
|
46
39
|
@check_document = options[:check_document]
|
|
47
40
|
@monitor = monitor
|
|
@@ -78,7 +71,11 @@ module Mongo
|
|
|
78
71
|
if @connection
|
|
79
72
|
# Interrupt any in-progress exhausted hello reads by
|
|
80
73
|
# disconnecting the connection.
|
|
81
|
-
|
|
74
|
+
begin
|
|
75
|
+
@connection.send(:socket).close
|
|
76
|
+
rescue StandardError
|
|
77
|
+
nil
|
|
78
|
+
end
|
|
82
79
|
end
|
|
83
80
|
end
|
|
84
81
|
super.tap do
|
|
@@ -107,10 +104,8 @@ module Mongo
|
|
|
107
104
|
# https://github.com/mongodb/specifications/blob/master/source/server-discovery-and-monitoring/server-monitoring.md#streamable-hello-or-legacy-hello-command
|
|
108
105
|
# says that topologyVersion should only be updated from successful
|
|
109
106
|
# hello responses.
|
|
110
|
-
if new_description.topology_version
|
|
111
|
-
|
|
112
|
-
end
|
|
113
|
-
rescue IOError, SocketError, SystemCallError, Mongo::Error => exc
|
|
107
|
+
@topology_version = new_description.topology_version if new_description.topology_version
|
|
108
|
+
rescue IOError, SocketError, SystemCallError, Mongo::Error => e
|
|
114
109
|
stop_requested = @lock.synchronize { @stop_requested }
|
|
115
110
|
if stop_requested
|
|
116
111
|
# Ignore the exception, see RUBY-2771.
|
|
@@ -118,11 +113,10 @@ module Mongo
|
|
|
118
113
|
end
|
|
119
114
|
|
|
120
115
|
msg = "Error running awaited hello on #{server.address}"
|
|
121
|
-
Utils.warn_bg_exception(msg,
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
)
|
|
116
|
+
Utils.warn_bg_exception(msg, e,
|
|
117
|
+
logger: options[:logger],
|
|
118
|
+
log_prefix: options[:log_prefix],
|
|
119
|
+
bg_error_backtrace: options[:bg_error_backtrace])
|
|
126
120
|
|
|
127
121
|
# If a request failed on a connection, stop push monitoring.
|
|
128
122
|
# In case the server is dead we don't want to have two connections
|
|
@@ -153,9 +147,7 @@ module Mongo
|
|
|
153
147
|
end
|
|
154
148
|
|
|
155
149
|
resp_msg = begin
|
|
156
|
-
unless @server_pushing
|
|
157
|
-
write_check_command
|
|
158
|
-
end
|
|
150
|
+
write_check_command unless @server_pushing
|
|
159
151
|
read_response
|
|
160
152
|
rescue Mongo::Error
|
|
161
153
|
@lock.synchronize do
|
|
@@ -173,10 +165,10 @@ module Mongo
|
|
|
173
165
|
def write_check_command
|
|
174
166
|
document = @check_document.merge(
|
|
175
167
|
topologyVersion: topology_version.to_doc,
|
|
176
|
-
maxAwaitTimeMS: monitor.heartbeat_interval * 1000
|
|
168
|
+
maxAwaitTimeMS: monitor.heartbeat_interval * 1000
|
|
177
169
|
)
|
|
178
170
|
command = Protocol::Msg.new(
|
|
179
|
-
[:exhaust_allowed], {}, document.merge({'$db' => Database::ADMIN})
|
|
171
|
+
[ :exhaust_allowed ], {}, document.merge({ '$db' => Database::ADMIN })
|
|
180
172
|
)
|
|
181
173
|
@lock.synchronize { @connection }.write_bytes(command.serialize.to_s)
|
|
182
174
|
end
|
|
@@ -184,14 +176,15 @@ module Mongo
|
|
|
184
176
|
def read_response
|
|
185
177
|
if timeout = options[:connect_timeout]
|
|
186
178
|
if timeout < 0
|
|
187
|
-
raise Mongo::SocketTimeoutError,
|
|
179
|
+
raise Mongo::SocketTimeoutError, 'Requested to read with a negative timeout: '
|
|
188
180
|
elsif timeout > 0
|
|
189
181
|
timeout += options[:heartbeat_frequency] || Monitor::DEFAULT_HEARTBEAT_INTERVAL
|
|
190
182
|
end
|
|
191
183
|
end
|
|
192
184
|
# We set the timeout twice: once passed into read_socket which applies
|
|
193
185
|
# to each individual read operation, and again around the entire read.
|
|
194
|
-
Timeout.timeout(timeout, Error::SocketTimeoutError,
|
|
186
|
+
Timeout.timeout(timeout, Error::SocketTimeoutError,
|
|
187
|
+
"Failed to read an awaited hello response in #{timeout} seconds") do
|
|
195
188
|
@lock.synchronize { @connection }.read_response(socket_timeout: timeout)
|
|
196
189
|
end
|
|
197
190
|
end
|
|
@@ -199,7 +192,6 @@ module Mongo
|
|
|
199
192
|
def to_s
|
|
200
193
|
"#<#{self.class.name}:#{object_id} #{server.address}>"
|
|
201
194
|
end
|
|
202
|
-
|
|
203
195
|
end
|
|
204
196
|
end
|
|
205
197
|
end
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
# Copyright (C) 2018-2020 MongoDB Inc.
|
|
5
4
|
|
|
@@ -19,10 +18,9 @@ module Mongo
|
|
|
19
18
|
class Server
|
|
20
19
|
# @api private
|
|
21
20
|
class RoundTripTimeCalculator
|
|
22
|
-
|
|
23
21
|
# The weighting factor (alpha) for calculating the average moving
|
|
24
22
|
# round trip time.
|
|
25
|
-
RTT_WEIGHT_FACTOR = 0.2
|
|
23
|
+
RTT_WEIGHT_FACTOR = 0.2
|
|
26
24
|
private_constant :RTT_WEIGHT_FACTOR
|
|
27
25
|
|
|
28
26
|
RTT_SAMPLES_FOR_MINIMUM = 10
|
|
@@ -39,9 +37,7 @@ module Mongo
|
|
|
39
37
|
@rtts = []
|
|
40
38
|
end
|
|
41
39
|
|
|
42
|
-
attr_reader :last_round_trip_time
|
|
43
|
-
attr_reader :average_round_trip_time
|
|
44
|
-
attr_reader :minimum_round_trip_time
|
|
40
|
+
attr_reader :last_round_trip_time, :average_round_trip_time, :minimum_round_trip_time
|
|
45
41
|
|
|
46
42
|
def measure
|
|
47
43
|
start = Utils.monotonic_time
|
|
@@ -51,7 +47,7 @@ module Mongo
|
|
|
51
47
|
# If we encountered a network error, the round-trip is not
|
|
52
48
|
# complete and thus RTT for it does not make sense.
|
|
53
49
|
raise
|
|
54
|
-
rescue Error, Error::AuthError =>
|
|
50
|
+
rescue Error, Error::AuthError => e
|
|
55
51
|
# For other errors, RTT is valid.
|
|
56
52
|
end
|
|
57
53
|
last_rtt = Utils.monotonic_time - start
|
|
@@ -59,7 +55,7 @@ module Mongo
|
|
|
59
55
|
# If hello fails, we need to return the last round trip time
|
|
60
56
|
# because it is used in the heartbeat failed SDAM event,
|
|
61
57
|
# but we must not update the round trip time recorded in the server.
|
|
62
|
-
unless
|
|
58
|
+
unless e
|
|
63
59
|
@last_round_trip_time = last_rtt
|
|
64
60
|
@lock.synchronize do
|
|
65
61
|
update_average_round_trip_time
|
|
@@ -67,19 +63,17 @@ module Mongo
|
|
|
67
63
|
end
|
|
68
64
|
end
|
|
69
65
|
|
|
70
|
-
if
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
rv
|
|
74
|
-
end
|
|
66
|
+
raise e if e
|
|
67
|
+
|
|
68
|
+
rv
|
|
75
69
|
end
|
|
76
70
|
|
|
77
71
|
def update_average_round_trip_time
|
|
78
72
|
@average_round_trip_time = if average_round_trip_time
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
73
|
+
(RTT_WEIGHT_FACTOR * last_round_trip_time) + ((1 - RTT_WEIGHT_FACTOR) * average_round_trip_time)
|
|
74
|
+
else
|
|
75
|
+
last_round_trip_time
|
|
76
|
+
end
|
|
83
77
|
end
|
|
84
78
|
|
|
85
79
|
def update_minimum_round_trip_time
|