mongo 2.23.0 → 2.24.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- 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 +20 -17
- data/lib/mongo/bulk_write/result_combiner.rb +17 -13
- 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 +230 -275
- 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 +148 -183
- data/lib/mongo/cluster_time.rb +14 -31
- data/lib/mongo/collection/helpers.rb +5 -8
- data/lib/mongo/collection/view/aggregation.rb +5 -10
- 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 +35 -28
- data/lib/mongo/collection/view/map_reduce.rb +20 -25
- data/lib/mongo/collection/view/readable.rb +50 -57
- data/lib/mongo/collection/view/writable.rb +56 -72
- data/lib/mongo/collection/view.rb +9 -8
- data/lib/mongo/collection.rb +63 -76
- 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 +7 -4
- data/lib/mongo/crypt/auto_decryption_context.rb +0 -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 +149 -155
- data/lib/mongo/crypt/context.rb +10 -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 +0 -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 +16 -37
- data/lib/mongo/database.rb +52 -56
- data/lib/mongo/dbref.rb +0 -1
- 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 +35 -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 +10 -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 +62 -36
- 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 +49 -48
- 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 +2 -3
- data/lib/mongo/monitoring/server_opening_log_subscriber.rb +0 -3
- data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +8 -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 +0 -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 +2 -4
- 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 -47
- 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 +20 -29
- 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 +32 -58
- 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 +1 -1
- data/lib/mongo/semaphore.rb +0 -1
- data/lib/mongo/server/app_metadata/environment.rb +3 -3
- data/lib/mongo/server/app_metadata.rb +4 -5
- data/lib/mongo/server/connection.rb +61 -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 +250 -175
- data/lib/mongo/server/description/features.rb +23 -60
- data/lib/mongo/server/description/load_balancer.rb +0 -2
- data/lib/mongo/server/description.rb +138 -137
- 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 +60 -93
- data/lib/mongo/server_selector/base.rb +146 -157
- data/lib/mongo/server_selector/nearest.rb +5 -5
- data/lib/mongo/server_selector/primary.rb +4 -5
- data/lib/mongo/server_selector/primary_preferred.rb +5 -6
- data/lib/mongo/server_selector/secondary.rb +5 -6
- data/lib/mongo/server_selector/secondary_preferred.rb +4 -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 +321 -189
- 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 +6 -11
- data/lib/mongo/srv/resolver.rb +15 -24
- data/lib/mongo/srv/result.rb +18 -24
- 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 +28 -1
- data/lib/mongo/tracing/open_telemetry/operation_tracer.rb +1 -1
- data/lib/mongo/tracing/open_telemetry/tracer.rb +1 -1
- data/lib/mongo/uri/options_mapper.rb +135 -126
- data/lib/mongo/uri/srv_protocol.rb +25 -38
- 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 +2 -3
- data/mongo.gemspec +17 -17
- metadata +5 -5
- data/lib/mongo/error/server_api_not_supported.rb +0 -27
- data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +0 -32
- data/lib/mongo/operation/shared/validatable.rb +0 -87
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
# Copyright (C) 2015-2020 MongoDB Inc.
|
|
5
4
|
#
|
|
@@ -18,7 +17,6 @@
|
|
|
18
17
|
module Mongo
|
|
19
18
|
class Server
|
|
20
19
|
class Monitor
|
|
21
|
-
|
|
22
20
|
# This class models the monitor connections and their behavior.
|
|
23
21
|
#
|
|
24
22
|
# @since 2.0.0
|
|
@@ -58,9 +56,8 @@ module Mongo
|
|
|
58
56
|
def initialize(address, options = {})
|
|
59
57
|
@address = address
|
|
60
58
|
@options = options.dup.freeze
|
|
61
|
-
unless @app_metadata = options[:app_metadata]
|
|
62
|
-
|
|
63
|
-
end
|
|
59
|
+
raise ArgumentError, 'App metadata is required' unless @app_metadata = options[:app_metadata]
|
|
60
|
+
|
|
64
61
|
@socket = nil
|
|
65
62
|
@pid = Process.pid
|
|
66
63
|
@compressor = nil
|
|
@@ -109,14 +106,12 @@ module Mongo
|
|
|
109
106
|
def dispatch_bytes(bytes, **opts)
|
|
110
107
|
write_bytes(bytes)
|
|
111
108
|
read_response(
|
|
112
|
-
socket_timeout: opts[:read_socket_timeout]
|
|
109
|
+
socket_timeout: opts[:read_socket_timeout]
|
|
113
110
|
)
|
|
114
111
|
end
|
|
115
112
|
|
|
116
113
|
def write_bytes(bytes)
|
|
117
|
-
unless connected?
|
|
118
|
-
raise ArgumentError, "Trying to dispatch on an unconnected connection #{self}"
|
|
119
|
-
end
|
|
114
|
+
raise ArgumentError, "Trying to dispatch on an unconnected connection #{self}" unless connected?
|
|
120
115
|
|
|
121
116
|
add_server_connection_id do
|
|
122
117
|
add_server_diagnostics do
|
|
@@ -128,16 +123,14 @@ module Mongo
|
|
|
128
123
|
# @option opts [ Numeric ] :socket_timeout The timeout to use for
|
|
129
124
|
# each read operation.
|
|
130
125
|
def read_response(**opts)
|
|
131
|
-
unless connected?
|
|
132
|
-
raise ArgumentError, "Trying to read on an unconnected connection #{self}"
|
|
133
|
-
end
|
|
126
|
+
raise ArgumentError, "Trying to read on an unconnected connection #{self}" unless connected?
|
|
134
127
|
|
|
135
128
|
add_server_connection_id do
|
|
136
129
|
add_server_diagnostics do
|
|
137
130
|
Protocol::Message.deserialize(socket,
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
131
|
+
Protocol::Message::MAX_MESSAGE_SIZE,
|
|
132
|
+
nil,
|
|
133
|
+
**opts)
|
|
141
134
|
end
|
|
142
135
|
end
|
|
143
136
|
end
|
|
@@ -156,13 +149,12 @@ module Mongo
|
|
|
156
149
|
#
|
|
157
150
|
# @since 2.0.0
|
|
158
151
|
def connect!
|
|
159
|
-
if @socket
|
|
160
|
-
raise ArgumentError, 'Monitoring connection already connected'
|
|
161
|
-
end
|
|
152
|
+
raise ArgumentError, 'Monitoring connection already connected' if @socket
|
|
162
153
|
|
|
163
154
|
@socket = add_server_diagnostics do
|
|
164
155
|
address.socket(socket_timeout, ssl_options.merge(
|
|
165
|
-
|
|
156
|
+
connection_address: address, monitor: true
|
|
157
|
+
))
|
|
166
158
|
end
|
|
167
159
|
true
|
|
168
160
|
end
|
|
@@ -181,9 +173,13 @@ module Mongo
|
|
|
181
173
|
# @return [ true ] If the disconnect succeeded.
|
|
182
174
|
#
|
|
183
175
|
# @since 2.0.0
|
|
184
|
-
def disconnect!(
|
|
176
|
+
def disconnect!(_options = nil)
|
|
185
177
|
if socket
|
|
186
|
-
|
|
178
|
+
begin
|
|
179
|
+
socket.close
|
|
180
|
+
rescue StandardError
|
|
181
|
+
nil
|
|
182
|
+
end
|
|
187
183
|
@socket = nil
|
|
188
184
|
end
|
|
189
185
|
true
|
|
@@ -210,13 +206,12 @@ module Mongo
|
|
|
210
206
|
set_hello_ok!(reply)
|
|
211
207
|
@server_connection_id = reply['connectionId']
|
|
212
208
|
reply
|
|
213
|
-
rescue =>
|
|
209
|
+
rescue StandardError => e
|
|
214
210
|
msg = "Failed to handshake with #{address}"
|
|
215
|
-
Utils.warn_bg_exception(msg,
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
)
|
|
211
|
+
Utils.warn_bg_exception(msg, e,
|
|
212
|
+
logger: options[:logger],
|
|
213
|
+
log_prefix: options[:log_prefix],
|
|
214
|
+
bg_error_backtrace: options[:bg_error_backtrace])
|
|
220
215
|
raise
|
|
221
216
|
end
|
|
222
217
|
|
|
@@ -229,14 +224,12 @@ module Mongo
|
|
|
229
224
|
def check_document
|
|
230
225
|
server_api = @app_metadata.server_api || options[:server_api]
|
|
231
226
|
doc = if hello_ok? || server_api
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
LEGACY_HELLO_DOC
|
|
239
|
-
end
|
|
227
|
+
_doc = HELLO_DOC
|
|
228
|
+
_doc = _doc.merge(Utils.transform_server_api(server_api)) if server_api
|
|
229
|
+
_doc
|
|
230
|
+
else
|
|
231
|
+
LEGACY_HELLO_DOC
|
|
232
|
+
end
|
|
240
233
|
# compressors must be set to maintain correct compression status
|
|
241
234
|
# in the server description. See RUBY-2427
|
|
242
235
|
if compressors = options[:compressors]
|
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
|