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) 2020 MongoDB Inc.
|
|
5
4
|
#
|
|
@@ -16,11 +15,8 @@
|
|
|
16
15
|
# limitations under the License.
|
|
17
16
|
|
|
18
17
|
module Mongo
|
|
19
|
-
|
|
20
18
|
module ServerSelector
|
|
21
|
-
|
|
22
19
|
class Base
|
|
23
|
-
|
|
24
20
|
# Initialize the server selector.
|
|
25
21
|
#
|
|
26
22
|
# @example Initialize the selector.
|
|
@@ -41,6 +37,8 @@ module Mongo
|
|
|
41
37
|
# reads on the server. Hedged reads are not enabled by default. When
|
|
42
38
|
# specifying this option, it must be in the format: { enabled: true },
|
|
43
39
|
# where the value of the :enabled key is a boolean value.
|
|
40
|
+
# @deprecated Hedged reads are deprecated in MongoDB Server 8.0 and will
|
|
41
|
+
# be removed in a future version.
|
|
44
42
|
#
|
|
45
43
|
# @raise [ Error::InvalidServerPreference ] If tag sets are specified
|
|
46
44
|
# but not allowed.
|
|
@@ -48,15 +46,21 @@ module Mongo
|
|
|
48
46
|
# @api private
|
|
49
47
|
def initialize(options = nil)
|
|
50
48
|
options = options ? options.dup : {}
|
|
51
|
-
if options[:max_staleness] == -1
|
|
52
|
-
options.delete(:max_staleness)
|
|
53
|
-
end
|
|
49
|
+
options.delete(:max_staleness) if options[:max_staleness] == -1
|
|
54
50
|
@options = options
|
|
55
51
|
@tag_sets = options[:tag_sets] || []
|
|
56
52
|
@max_staleness = options[:max_staleness]
|
|
57
53
|
@hedge = options[:hedge]
|
|
58
54
|
|
|
59
55
|
validate!
|
|
56
|
+
|
|
57
|
+
return if @hedge.nil?
|
|
58
|
+
|
|
59
|
+
Mongo::Deprecations.warn(
|
|
60
|
+
:hedge_read_preference,
|
|
61
|
+
'The hedge read preference option is deprecated. Hedged reads are ' \
|
|
62
|
+
'deprecated in MongoDB Server 8.0 and will be removed in a future version.'
|
|
63
|
+
)
|
|
60
64
|
end
|
|
61
65
|
|
|
62
66
|
# @return [ Hash ] options The options.
|
|
@@ -73,6 +77,9 @@ module Mongo
|
|
|
73
77
|
|
|
74
78
|
# @return [ Hash | nil ] hedge The document specifying whether to enable
|
|
75
79
|
# hedged reads.
|
|
80
|
+
#
|
|
81
|
+
# @deprecated Hedged reads are deprecated in MongoDB Server 8.0 and will
|
|
82
|
+
# be removed in a future version.
|
|
76
83
|
attr_reader :hedge
|
|
77
84
|
|
|
78
85
|
# Get the timeout for server selection.
|
|
@@ -88,7 +95,7 @@ module Mongo
|
|
|
88
95
|
# a server is selected. Will be removed in version 3.0.
|
|
89
96
|
def server_selection_timeout
|
|
90
97
|
@server_selection_timeout ||=
|
|
91
|
-
|
|
98
|
+
options[:server_selection_timeout] || ServerSelector::SERVER_SELECTION_TIMEOUT
|
|
92
99
|
end
|
|
93
100
|
|
|
94
101
|
# Get the local threshold boundary for nearest selection in seconds.
|
|
@@ -103,7 +110,7 @@ module Mongo
|
|
|
103
110
|
# @deprecated This setting is now taken from the cluster options when
|
|
104
111
|
# a server is selected. Will be removed in version 3.0.
|
|
105
112
|
def local_threshold
|
|
106
|
-
@local_threshold ||=
|
|
113
|
+
@local_threshold ||= options[:local_threshold] || ServerSelector::LOCAL_THRESHOLD
|
|
107
114
|
end
|
|
108
115
|
|
|
109
116
|
# @api private
|
|
@@ -161,13 +168,12 @@ module Mongo
|
|
|
161
168
|
# @param [ true, false ] ping Whether to ping the server before selection.
|
|
162
169
|
# Deprecated and ignored.
|
|
163
170
|
# @param [ Session | nil ] session Optional session to take into account
|
|
164
|
-
# for mongos pinning.
|
|
171
|
+
# for mongos pinning.
|
|
165
172
|
# @param [ true | false ] write_aggregation Whether we need a server that
|
|
166
173
|
# supports writing aggregations (e.g. with $merge/$out) on secondaries.
|
|
167
174
|
# @param [ Array<Server> ] deprioritized A list of servers that should
|
|
168
|
-
# be selected from only if no other servers are available.
|
|
169
|
-
#
|
|
170
|
-
# retrying a command.
|
|
175
|
+
# be selected from only if no other servers are available.
|
|
176
|
+
#
|
|
171
177
|
# @param [ Float | nil ] :timeout Timeout in seconds for the operation,
|
|
172
178
|
# if any.
|
|
173
179
|
#
|
|
@@ -197,15 +203,20 @@ module Mongo
|
|
|
197
203
|
|
|
198
204
|
# Parameters and return values are the same as for select_server, only
|
|
199
205
|
# the +timeout+ param is renamed to +csot_timeout+.
|
|
200
|
-
private def select_server_impl(cluster,
|
|
206
|
+
private def select_server_impl(cluster, _ping, session, write_aggregation, deprioritized, csot_timeout)
|
|
201
207
|
if cluster.topology.is_a?(Cluster::Topology::LoadBalanced)
|
|
208
|
+
# In load-balanced mode, release the pinned connection if the session
|
|
209
|
+
# is no longer in a transaction (e.g. after commit or abort).
|
|
210
|
+
if session&.pinned_connection_global_id && !session.in_transaction?
|
|
211
|
+
session.unpin
|
|
212
|
+
end
|
|
202
213
|
return cluster.servers.first
|
|
203
214
|
end
|
|
204
215
|
|
|
205
216
|
timeout = cluster.options[:server_selection_timeout] || SERVER_SELECTION_TIMEOUT
|
|
206
217
|
|
|
207
218
|
server_selection_timeout = if csot_timeout && csot_timeout > 0
|
|
208
|
-
[timeout, csot_timeout].min
|
|
219
|
+
[ timeout, csot_timeout ].min
|
|
209
220
|
else
|
|
210
221
|
timeout
|
|
211
222
|
end
|
|
@@ -214,23 +225,19 @@ module Mongo
|
|
|
214
225
|
# and the timeout is zero, fail immediately (since server selection
|
|
215
226
|
# will take some non-zero amount of time in any case).
|
|
216
227
|
if server_selection_timeout == 0
|
|
217
|
-
msg =
|
|
218
|
-
|
|
228
|
+
msg = 'Failing server selection due to zero timeout. ' +
|
|
229
|
+
" Requested #{name} in cluster: #{cluster.summary}"
|
|
219
230
|
raise Error::NoServerAvailable.new(self, cluster, msg)
|
|
220
231
|
end
|
|
221
232
|
|
|
222
233
|
deadline = Utils.monotonic_time + server_selection_timeout
|
|
223
234
|
|
|
224
235
|
if session && session.pinned_server
|
|
225
|
-
if Mongo::Lint.enabled?
|
|
226
|
-
|
|
227
|
-
raise Error::LintError, "Session has a pinned server in a non-sharded topology: #{topology}"
|
|
228
|
-
end
|
|
236
|
+
if Mongo::Lint.enabled? && !cluster.sharded?
|
|
237
|
+
raise Error::LintError, "Session has a pinned server in a non-sharded topology: #{topology}"
|
|
229
238
|
end
|
|
230
239
|
|
|
231
|
-
|
|
232
|
-
session.unpin
|
|
233
|
-
end
|
|
240
|
+
session.unpin unless session.in_transaction?
|
|
234
241
|
|
|
235
242
|
if server = session.pinned_server
|
|
236
243
|
# Here we assume that a mongos stays in the topology indefinitely.
|
|
@@ -243,7 +250,7 @@ module Mongo
|
|
|
243
250
|
|
|
244
251
|
unless server.mongos?
|
|
245
252
|
msg = "The session being used is pinned to the server which is not a mongos: #{server.summary} " +
|
|
246
|
-
|
|
253
|
+
"(after #{server_selection_timeout} seconds)"
|
|
247
254
|
raise Error::NoServerAvailable.new(self, cluster, msg)
|
|
248
255
|
end
|
|
249
256
|
end
|
|
@@ -252,26 +259,22 @@ module Mongo
|
|
|
252
259
|
end
|
|
253
260
|
end
|
|
254
261
|
|
|
255
|
-
if cluster.replica_set?
|
|
256
|
-
validate_max_staleness_value_early!
|
|
257
|
-
end
|
|
262
|
+
validate_max_staleness_value_early! if cluster.replica_set?
|
|
258
263
|
|
|
259
264
|
if cluster.addresses.empty?
|
|
260
|
-
if Lint.enabled?
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
end
|
|
265
|
+
if Lint.enabled? && !cluster.servers.empty?
|
|
266
|
+
raise Error::LintError,
|
|
267
|
+
"Cluster has no addresses but has servers: #{cluster.servers.map(&:inspect).join(', ')}"
|
|
264
268
|
end
|
|
265
|
-
msg =
|
|
269
|
+
msg = 'Cluster has no addresses, and therefore will never have a server'
|
|
266
270
|
raise Error::NoServerAvailable.new(self, cluster, msg)
|
|
267
271
|
end
|
|
268
272
|
|
|
269
|
-
|
|
270
|
-
unless cluster.connected?
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
end
|
|
274
|
-
=end
|
|
273
|
+
# Add this check in version 3.0.0
|
|
274
|
+
# unless cluster.connected?
|
|
275
|
+
# msg = 'Cluster is disconnected'
|
|
276
|
+
# raise Error::NoServerAvailable.new(self, cluster, msg)
|
|
277
|
+
# end
|
|
275
278
|
|
|
276
279
|
loop do
|
|
277
280
|
if Lint.enabled?
|
|
@@ -287,15 +290,16 @@ module Mongo
|
|
|
287
290
|
end
|
|
288
291
|
|
|
289
292
|
server = try_select_server(cluster, write_aggregation: write_aggregation, deprioritized: deprioritized)
|
|
293
|
+
if server.nil? && deprioritized.any?
|
|
294
|
+
server = try_select_server(cluster, write_aggregation: write_aggregation, deprioritized: [])
|
|
295
|
+
end
|
|
290
296
|
|
|
291
297
|
if server
|
|
292
298
|
unless cluster.topology.compatible?
|
|
293
299
|
raise Error::UnsupportedFeatures, cluster.topology.compatibility_error.to_s
|
|
294
300
|
end
|
|
295
301
|
|
|
296
|
-
if session && session.starting_transaction? && cluster.sharded?
|
|
297
|
-
session.pin_to_server(server)
|
|
298
|
-
end
|
|
302
|
+
session.pin_to_server(server) if session && session.starting_transaction? && cluster.sharded?
|
|
299
303
|
|
|
300
304
|
return server
|
|
301
305
|
end
|
|
@@ -303,34 +307,28 @@ module Mongo
|
|
|
303
307
|
cluster.scan!(false)
|
|
304
308
|
|
|
305
309
|
time_remaining = deadline - Utils.monotonic_time
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
break
|
|
315
|
-
end
|
|
310
|
+
break unless time_remaining > 0
|
|
311
|
+
|
|
312
|
+
wait_for_server_selection(cluster, time_remaining)
|
|
313
|
+
|
|
314
|
+
# If we wait for server selection, perform another round of
|
|
315
|
+
# attempting to locate a suitable server. Otherwise server selection
|
|
316
|
+
# can raise NoServerAvailable message when the diagnostics
|
|
317
|
+
# reports an available server of the requested type.
|
|
316
318
|
end
|
|
317
319
|
|
|
318
320
|
msg = "No #{name} server"
|
|
319
|
-
if is_a?(ServerSelector::Secondary) && !tag_sets.empty?
|
|
320
|
-
msg += " with tag sets: #{tag_sets}"
|
|
321
|
-
end
|
|
321
|
+
msg += " with tag sets: #{tag_sets}" if is_a?(ServerSelector::Secondary) && !tag_sets.empty?
|
|
322
322
|
msg += " is available in cluster: #{cluster.summary} " +
|
|
323
|
-
|
|
324
|
-
|
|
323
|
+
"with timeout=#{server_selection_timeout}, " +
|
|
324
|
+
"LT=#{local_threshold_with_cluster(cluster)}"
|
|
325
325
|
msg += server_selection_diagnostic_message(cluster)
|
|
326
326
|
raise Error::NoServerAvailable.new(self, cluster, msg)
|
|
327
327
|
rescue Error::NoServerAvailable => e
|
|
328
328
|
if session && session.in_transaction? && !session.committing_transaction?
|
|
329
329
|
e.add_label('TransientTransactionError')
|
|
330
330
|
end
|
|
331
|
-
if session && session.committing_transaction?
|
|
332
|
-
e.add_label('UnknownTransactionCommitResult')
|
|
333
|
-
end
|
|
331
|
+
e.add_label('UnknownTransactionCommitResult') if session && session.committing_transaction?
|
|
334
332
|
raise e
|
|
335
333
|
end
|
|
336
334
|
|
|
@@ -351,40 +349,36 @@ module Mongo
|
|
|
351
349
|
# @api private
|
|
352
350
|
def try_select_server(cluster, write_aggregation: false, deprioritized: [])
|
|
353
351
|
servers = if write_aggregation && cluster.replica_set?
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
352
|
+
# 1. Check if ALL servers in cluster support secondary writes.
|
|
353
|
+
is_write_supported = cluster.servers.reduce(true) do |res, server|
|
|
354
|
+
res && server.features.merge_out_on_secondary_enabled?
|
|
355
|
+
end
|
|
356
|
+
|
|
357
|
+
if is_write_supported
|
|
358
|
+
# 2. If all servers support secondary writes, we respect read preference.
|
|
359
|
+
suitable_servers(cluster, deprioritized)
|
|
360
|
+
else
|
|
361
|
+
# 3. Otherwise we fallback to primary for replica set.
|
|
362
|
+
[ cluster.servers.detect(&:primary?) ]
|
|
363
|
+
end
|
|
364
|
+
else
|
|
365
|
+
suitable_servers(cluster, deprioritized)
|
|
366
|
+
end
|
|
369
367
|
|
|
370
368
|
# This list of servers may be ordered in a specific way
|
|
371
369
|
# by the selector (e.g. for secondary preferred, the first
|
|
372
370
|
# server may be a secondary and the second server may be primary)
|
|
373
371
|
# and we should take the first server here respecting the order
|
|
374
|
-
server = suitable_server(servers
|
|
372
|
+
server = suitable_server(servers)
|
|
375
373
|
|
|
376
|
-
if server
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
if server.average_round_trip_time.nil?
|
|
385
|
-
raise Error::LintError, "Server #{server.address} has nil average rtt"
|
|
386
|
-
end
|
|
387
|
-
end
|
|
374
|
+
if server && Lint.enabled? && server.average_round_trip_time.nil?
|
|
375
|
+
# It is possible for a server to have a nil average RTT here
|
|
376
|
+
# because the ARTT comes from description which may be updated
|
|
377
|
+
# by a background thread while server selection is running.
|
|
378
|
+
# Currently lint mode is not a public feature, if/when this
|
|
379
|
+
# changes (https://jira.mongodb.org/browse/RUBY-1576) the
|
|
380
|
+
# requirement for ARTT to be not nil would need to be removed.
|
|
381
|
+
raise Error::LintError, "Server #{server.address} has nil average rtt"
|
|
388
382
|
end
|
|
389
383
|
|
|
390
384
|
server
|
|
@@ -396,15 +390,14 @@ module Mongo
|
|
|
396
390
|
# latency filtering.
|
|
397
391
|
#
|
|
398
392
|
# @param [ Cluster ] cluster The cluster.
|
|
393
|
+
# @param [ Array<Server> ] deprioritized A list of servers that should
|
|
394
|
+
# be selected from only if no other servers are available.
|
|
399
395
|
#
|
|
400
396
|
# @return [ Array<Server> ] The candidate servers.
|
|
401
397
|
#
|
|
402
398
|
# @api private
|
|
403
|
-
def candidates(cluster)
|
|
404
|
-
servers = cluster.servers
|
|
405
|
-
servers.each do |server|
|
|
406
|
-
validate_max_staleness_support!(server)
|
|
407
|
-
end
|
|
399
|
+
def candidates(cluster, deprioritized = [])
|
|
400
|
+
servers = cluster.servers.reject { |s| deprioritized.include?(s) }
|
|
408
401
|
if cluster.single?
|
|
409
402
|
servers
|
|
410
403
|
elsif cluster.sharded?
|
|
@@ -420,44 +413,55 @@ module Mongo
|
|
|
420
413
|
# Returns servers satisfying the server selector from the cluster.
|
|
421
414
|
#
|
|
422
415
|
# @param [ Cluster ] cluster The cluster.
|
|
416
|
+
# @param [ Array<Server> ] deprioritized A list of servers that should
|
|
417
|
+
# be selected from only if no other servers are available.
|
|
423
418
|
#
|
|
424
419
|
# @return [ Array<Server> ] The suitable servers.
|
|
425
420
|
#
|
|
426
421
|
# @api private
|
|
427
|
-
def suitable_servers(cluster)
|
|
422
|
+
def suitable_servers(cluster, deprioritized = [])
|
|
423
|
+
result = suitable_servers_impl(cluster, deprioritized)
|
|
424
|
+
result = suitable_servers_impl(cluster, []) if result.empty? && deprioritized.any?
|
|
425
|
+
result
|
|
426
|
+
end
|
|
427
|
+
|
|
428
|
+
private
|
|
429
|
+
|
|
430
|
+
# Internal implementation of suitable_servers that applies deprioritization
|
|
431
|
+
# filtering to the candidate servers.
|
|
432
|
+
#
|
|
433
|
+
# @param [ Cluster ] cluster The cluster.
|
|
434
|
+
# @param [ Array<Server> ] deprioritized A list of servers that should
|
|
435
|
+
# be excluded from the candidate pool.
|
|
436
|
+
#
|
|
437
|
+
# @return [ Array<Server> ] The suitable servers.
|
|
438
|
+
#
|
|
439
|
+
# @api private
|
|
440
|
+
def suitable_servers_impl(cluster, deprioritized)
|
|
428
441
|
if cluster.single?
|
|
429
|
-
candidates(cluster)
|
|
442
|
+
candidates(cluster, deprioritized)
|
|
430
443
|
elsif cluster.sharded?
|
|
431
444
|
local_threshold = local_threshold_with_cluster(cluster)
|
|
432
|
-
servers = candidates(cluster)
|
|
445
|
+
servers = candidates(cluster, deprioritized)
|
|
433
446
|
near_servers(servers, local_threshold)
|
|
434
447
|
elsif cluster.replica_set?
|
|
435
448
|
validate_max_staleness_value!(cluster)
|
|
436
|
-
candidates(cluster)
|
|
449
|
+
candidates(cluster, deprioritized)
|
|
437
450
|
else
|
|
438
451
|
# Unknown cluster - no servers
|
|
439
452
|
[]
|
|
440
453
|
end
|
|
441
454
|
end
|
|
442
455
|
|
|
443
|
-
private
|
|
444
|
-
|
|
445
456
|
# Returns a server from the list of servers that is suitable for
|
|
446
457
|
# executing the operation.
|
|
447
458
|
#
|
|
448
459
|
# @param [ Array<Server> ] servers The candidate servers.
|
|
449
|
-
# @param [ Array<Server> ] deprioritized A list of servers that should
|
|
450
|
-
# be selected from only if no other servers are available.
|
|
451
460
|
#
|
|
452
461
|
# @return [ Server | nil ] The suitable server or nil if no suitable
|
|
453
462
|
# server is available.
|
|
454
|
-
def suitable_server(servers
|
|
455
|
-
|
|
456
|
-
if preferred.empty?
|
|
457
|
-
servers.first
|
|
458
|
-
else
|
|
459
|
-
preferred.first
|
|
460
|
-
end
|
|
463
|
+
def suitable_server(servers)
|
|
464
|
+
servers.first
|
|
461
465
|
end
|
|
462
466
|
|
|
463
467
|
# Convert this server preference definition into a format appropriate
|
|
@@ -468,7 +472,7 @@ module Mongo
|
|
|
468
472
|
# @since 2.0.0
|
|
469
473
|
def full_doc
|
|
470
474
|
@full_doc ||= begin
|
|
471
|
-
preference = { :
|
|
475
|
+
preference = { mode: self.class.const_get(:SERVER_FORMATTED_NAME) }
|
|
472
476
|
preference.update(tags: tag_sets) unless tag_sets.empty?
|
|
473
477
|
preference.update(maxStalenessSeconds: max_staleness) if max_staleness
|
|
474
478
|
preference.update(hedge: hedge) if hedge
|
|
@@ -529,7 +533,7 @@ module Mongo
|
|
|
529
533
|
# of this method.
|
|
530
534
|
|
|
531
535
|
candidates = candidates.map do |server|
|
|
532
|
-
{server: server, artt: server.average_round_trip_time}
|
|
536
|
+
{ server: server, artt: server.average_round_trip_time }
|
|
533
537
|
end.reject do |candidate|
|
|
534
538
|
candidate[:artt].nil?
|
|
535
539
|
end
|
|
@@ -540,7 +544,7 @@ module Mongo
|
|
|
540
544
|
candidate[:artt]
|
|
541
545
|
end
|
|
542
546
|
|
|
543
|
-
# Default for legacy
|
|
547
|
+
# Default for legacy signature
|
|
544
548
|
local_threshold ||= self.local_threshold
|
|
545
549
|
|
|
546
550
|
threshold = nearest_candidate[:artt] + local_threshold
|
|
@@ -578,16 +582,14 @@ module Mongo
|
|
|
578
582
|
# last_scan here.
|
|
579
583
|
if primary
|
|
580
584
|
candidates.select do |server|
|
|
581
|
-
validate_max_staleness_support!(server)
|
|
582
585
|
staleness = (server.last_scan - server.last_write_date) -
|
|
583
|
-
(primary.last_scan - primary.last_write_date)
|
|
586
|
+
(primary.last_scan - primary.last_write_date) +
|
|
584
587
|
server.cluster.heartbeat_interval
|
|
585
588
|
staleness <= @max_staleness
|
|
586
589
|
end
|
|
587
590
|
else
|
|
588
591
|
max_write_date = candidates.collect(&:last_write_date).max
|
|
589
592
|
candidates.select do |server|
|
|
590
|
-
validate_max_staleness_support!(server)
|
|
591
593
|
staleness = max_write_date - server.last_write_date + server.cluster.heartbeat_interval
|
|
592
594
|
staleness <= @max_staleness
|
|
593
595
|
end
|
|
@@ -601,49 +603,39 @@ module Mongo
|
|
|
601
603
|
raise Error::InvalidServerPreference.new(Error::InvalidServerPreference::NO_MAX_STALENESS_SUPPORT)
|
|
602
604
|
end
|
|
603
605
|
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
raise Error::InvalidServerPreference.new(Error::InvalidServerPreference::NO_HEDGE_SUPPORT)
|
|
607
|
-
end
|
|
608
|
-
|
|
609
|
-
unless @hedge.is_a?(Hash) && @hedge.key?(:enabled) &&
|
|
610
|
-
[true, false].include?(@hedge[:enabled])
|
|
611
|
-
raise Error::InvalidServerPreference.new(
|
|
612
|
-
"`hedge` value (#{hedge}) is invalid - hedge must be a Hash in the " \
|
|
613
|
-
"format { enabled: true }"
|
|
614
|
-
)
|
|
615
|
-
end
|
|
616
|
-
end
|
|
617
|
-
end
|
|
606
|
+
return unless @hedge
|
|
607
|
+
raise Error::InvalidServerPreference.new(Error::InvalidServerPreference::NO_HEDGE_SUPPORT) unless hedge_allowed?
|
|
618
608
|
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
raise Error::InvalidServerPreference.new(
|
|
609
|
+
unless @hedge.is_a?(Hash) && @hedge.key?(:enabled) &&
|
|
610
|
+
[ true, false ].include?(@hedge[:enabled])
|
|
611
|
+
raise Error::InvalidServerPreference.new(
|
|
612
|
+
"`hedge` value (#{hedge}) is invalid - hedge must be a Hash in the " \
|
|
613
|
+
'format { enabled: true }'
|
|
614
|
+
)
|
|
622
615
|
end
|
|
623
616
|
end
|
|
624
617
|
|
|
625
618
|
def validate_max_staleness_value_early!
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
619
|
+
return unless @max_staleness
|
|
620
|
+
return if @max_staleness >= SMALLEST_MAX_STALENESS_SECONDS
|
|
621
|
+
|
|
622
|
+
msg = "`max_staleness` value (#{@max_staleness}) is too small - it must be at least " +
|
|
629
623
|
"`Mongo::ServerSelector::SMALLEST_MAX_STALENESS_SECONDS` (#{ServerSelector::SMALLEST_MAX_STALENESS_SECONDS})"
|
|
630
|
-
|
|
631
|
-
end
|
|
632
|
-
end
|
|
624
|
+
raise Error::InvalidServerPreference.new(msg)
|
|
633
625
|
end
|
|
634
626
|
|
|
635
627
|
def validate_max_staleness_value!(cluster)
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
628
|
+
return unless @max_staleness
|
|
629
|
+
|
|
630
|
+
heartbeat_interval = cluster.heartbeat_interval
|
|
631
|
+
unless @max_staleness >= [
|
|
632
|
+
SMALLEST_MAX_STALENESS_SECONDS,
|
|
633
|
+
min_cluster_staleness = heartbeat_interval + Cluster::IDLE_WRITE_PERIOD_SECONDS,
|
|
634
|
+
].max
|
|
635
|
+
msg = "`max_staleness` value (#{@max_staleness}) is too small - it must be at least " +
|
|
636
|
+
"`Mongo::ServerSelector::SMALLEST_MAX_STALENESS_SECONDS` (#{ServerSelector::SMALLEST_MAX_STALENESS_SECONDS}) and (the cluster's heartbeat_frequency " +
|
|
637
|
+
"setting + `Mongo::Cluster::IDLE_WRITE_PERIOD_SECONDS`) (#{min_cluster_staleness})"
|
|
638
|
+
raise Error::InvalidServerPreference.new(msg)
|
|
647
639
|
end
|
|
648
640
|
end
|
|
649
641
|
|
|
@@ -669,12 +661,13 @@ module Mongo
|
|
|
669
661
|
# the servers list earlier and the wait call below, we should not
|
|
670
662
|
# wait for the full remaining time - wait for up to 0.5 second, then
|
|
671
663
|
# recheck the state.
|
|
672
|
-
cluster.server_selection_semaphore.wait([time_remaining, 0.5].min)
|
|
664
|
+
cluster.server_selection_semaphore.wait([ time_remaining, 0.5 ].min)
|
|
673
665
|
else
|
|
674
666
|
if Lint.enabled?
|
|
675
667
|
raise Error::LintError, 'Waiting for server selection without having a server selection semaphore'
|
|
676
668
|
end
|
|
677
|
-
|
|
669
|
+
|
|
670
|
+
sleep [ time_remaining, 0.25 ].min
|
|
678
671
|
end
|
|
679
672
|
end
|
|
680
673
|
|
|
@@ -696,17 +689,13 @@ module Mongo
|
|
|
696
689
|
msg = ''
|
|
697
690
|
dead_monitors = []
|
|
698
691
|
cluster.servers_list.each do |server|
|
|
699
|
-
thread = server.monitor.instance_variable_get(
|
|
700
|
-
if thread.nil? || !thread.alive?
|
|
701
|
-
dead_monitors << server
|
|
702
|
-
end
|
|
692
|
+
thread = server.monitor.instance_variable_get(:@thread)
|
|
693
|
+
dead_monitors << server if thread.nil? || !thread.alive?
|
|
703
694
|
end
|
|
704
695
|
if dead_monitors.any?
|
|
705
696
|
msg += ". The following servers have dead monitor threads: #{dead_monitors.map(&:summary).join(', ')}"
|
|
706
697
|
end
|
|
707
|
-
unless cluster.connected?
|
|
708
|
-
msg += ". The cluster is disconnected (client may have been closed)"
|
|
709
|
-
end
|
|
698
|
+
msg += '. The cluster is disconnected (client may have been closed)' unless cluster.connected?
|
|
710
699
|
msg
|
|
711
700
|
end
|
|
712
701
|
end
|
|
@@ -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,17 +16,15 @@
|
|
|
17
16
|
|
|
18
17
|
module Mongo
|
|
19
18
|
module ServerSelector
|
|
20
|
-
|
|
21
19
|
# Encapsulates specifications for selecting near servers given a list
|
|
22
20
|
# of candidates.
|
|
23
21
|
#
|
|
24
22
|
# @since 2.0.0
|
|
25
23
|
class Nearest < Base
|
|
26
|
-
|
|
27
24
|
# Name of the this read preference in the server's format.
|
|
28
25
|
#
|
|
29
26
|
# @since 2.5.0
|
|
30
|
-
SERVER_FORMATTED_NAME = 'nearest'
|
|
27
|
+
SERVER_FORMATTED_NAME = 'nearest'
|
|
31
28
|
|
|
32
29
|
# Get the name of the server mode type.
|
|
33
30
|
#
|
|
@@ -62,6 +59,9 @@ module Mongo
|
|
|
62
59
|
# Whether the hedge option is allowed to be defined for this server preference.
|
|
63
60
|
#
|
|
64
61
|
# @return [ true ] true
|
|
62
|
+
#
|
|
63
|
+
# @deprecated Hedged reads are deprecated in MongoDB Server 8.0 and will
|
|
64
|
+
# be removed in a future version.
|
|
65
65
|
def hedge_allowed?
|
|
66
66
|
true
|
|
67
67
|
end
|
|
@@ -86,7 +86,7 @@ module Mongo
|
|
|
86
86
|
# command field value.
|
|
87
87
|
#
|
|
88
88
|
# @since 2.0.0
|
|
89
|
-
alias
|
|
89
|
+
alias to_mongos to_doc
|
|
90
90
|
|
|
91
91
|
private
|
|
92
92
|
|
|
@@ -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
|
#
|
|
@@ -16,19 +15,16 @@
|
|
|
16
15
|
# limitations under the License.
|
|
17
16
|
|
|
18
17
|
module Mongo
|
|
19
|
-
|
|
20
18
|
module ServerSelector
|
|
21
|
-
|
|
22
19
|
# Encapsulates specifications for selecting the primary server given a list
|
|
23
20
|
# of candidates.
|
|
24
21
|
#
|
|
25
22
|
# @since 2.0.0
|
|
26
23
|
class Primary < Base
|
|
27
|
-
|
|
28
24
|
# Name of the this read preference in the server's format.
|
|
29
25
|
#
|
|
30
26
|
# @since 2.5.0
|
|
31
|
-
SERVER_FORMATTED_NAME = 'primary'
|
|
27
|
+
SERVER_FORMATTED_NAME = 'primary'
|
|
32
28
|
|
|
33
29
|
# Get the name of the server mode type.
|
|
34
30
|
#
|
|
@@ -63,6 +59,9 @@ module Mongo
|
|
|
63
59
|
# Whether the hedge option is allowed to be defined for this server preference.
|
|
64
60
|
#
|
|
65
61
|
# @return [ false ] false
|
|
62
|
+
#
|
|
63
|
+
# @deprecated Hedged reads are deprecated in MongoDB Server 8.0 and will
|
|
64
|
+
# be removed in a future version.
|
|
66
65
|
def hedge_allowed?
|
|
67
66
|
false
|
|
68
67
|
end
|