mongo 2.23.0 → 2.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/mongo_console +0 -1
- data/lib/mongo/active_support.rb +1 -2
- data/lib/mongo/address/ipv4.rb +3 -6
- data/lib/mongo/address/ipv6.rb +6 -10
- data/lib/mongo/address/unix.rb +1 -4
- data/lib/mongo/address/validator.rb +16 -28
- data/lib/mongo/address.rb +30 -40
- data/lib/mongo/auth/aws/conversation.rb +6 -10
- data/lib/mongo/auth/aws/credentials.rb +0 -1
- data/lib/mongo/auth/aws/credentials_cache.rb +0 -1
- data/lib/mongo/auth/aws/credentials_retriever.rb +45 -59
- data/lib/mongo/auth/aws/request.rb +20 -35
- data/lib/mongo/auth/aws.rb +1 -2
- data/lib/mongo/auth/base.rb +20 -29
- data/lib/mongo/auth/conversation_base.rb +14 -18
- data/lib/mongo/auth/cr/conversation.rb +0 -3
- data/lib/mongo/auth/cr.rb +1 -4
- data/lib/mongo/auth/credential_cache.rb +0 -2
- data/lib/mongo/auth/gssapi/conversation.rb +3 -8
- data/lib/mongo/auth/gssapi.rb +1 -4
- data/lib/mongo/auth/ldap/conversation.rb +0 -3
- data/lib/mongo/auth/ldap.rb +1 -4
- data/lib/mongo/auth/roles.rb +16 -19
- data/lib/mongo/auth/sasl_conversation_base.rb +7 -11
- data/lib/mongo/auth/scram/conversation.rb +2 -5
- data/lib/mongo/auth/scram.rb +5 -10
- data/lib/mongo/auth/scram256/conversation.rb +2 -5
- data/lib/mongo/auth/scram256.rb +1 -3
- data/lib/mongo/auth/scram_conversation_base.rb +18 -24
- data/lib/mongo/auth/stringprep/profiles/sasl.rb +17 -18
- data/lib/mongo/auth/stringprep/tables.rb +2209 -2210
- data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +36 -38
- data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +1142 -1150
- data/lib/mongo/auth/stringprep.rb +9 -12
- data/lib/mongo/auth/user/view.rb +3 -5
- data/lib/mongo/auth/user.rb +14 -24
- data/lib/mongo/auth/x509/conversation.rb +0 -3
- data/lib/mongo/auth/x509.rb +7 -9
- data/lib/mongo/auth.rb +18 -30
- data/lib/mongo/background_thread.rb +9 -17
- data/lib/mongo/bson.rb +0 -2
- data/lib/mongo/bulk_write/combineable.rb +0 -3
- data/lib/mongo/bulk_write/ordered_combiner.rb +1 -3
- data/lib/mongo/bulk_write/result.rb +11 -16
- data/lib/mongo/bulk_write/result_combiner.rb +9 -12
- data/lib/mongo/bulk_write/transformable.rb +16 -19
- data/lib/mongo/bulk_write/unordered_combiner.rb +1 -3
- data/lib/mongo/bulk_write/validatable.rb +11 -18
- data/lib/mongo/bulk_write.rb +76 -91
- data/lib/mongo/caching_cursor.rb +2 -7
- data/lib/mongo/client.rb +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 +2 -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 +7 -10
- data/lib/mongo/error/change_stream_resumable.rb +0 -2
- data/lib/mongo/error/client_closed.rb +0 -2
- data/lib/mongo/error/closed_stream.rb +1 -4
- data/lib/mongo/error/connection_check_out_timeout.rb +3 -6
- data/lib/mongo/error/connection_perished.rb +0 -2
- data/lib/mongo/error/connection_unavailable.rb +0 -2
- data/lib/mongo/error/credential_check_error.rb +0 -2
- data/lib/mongo/error/crypt_error.rb +0 -2
- data/lib/mongo/error/extra_file_chunk.rb +1 -4
- data/lib/mongo/error/failed_string_prep_validation.rb +5 -6
- data/lib/mongo/error/file_not_found.rb +0 -3
- data/lib/mongo/error/handshake_error.rb +0 -2
- data/lib/mongo/error/insufficient_iteration_count.rb +1 -4
- data/lib/mongo/error/internal_driver_error.rb +0 -2
- data/lib/mongo/error/invalid_address.rb +0 -2
- data/lib/mongo/error/invalid_application_name.rb +0 -3
- data/lib/mongo/error/invalid_bulk_operation.rb +1 -4
- data/lib/mongo/error/invalid_bulk_operation_type.rb +1 -4
- data/lib/mongo/error/invalid_collection_name.rb +1 -4
- data/lib/mongo/error/invalid_config_option.rb +0 -3
- data/lib/mongo/error/invalid_cursor_operation.rb +0 -2
- data/lib/mongo/error/invalid_database_name.rb +1 -4
- data/lib/mongo/error/invalid_document.rb +1 -4
- data/lib/mongo/error/invalid_file.rb +0 -3
- data/lib/mongo/error/invalid_file_revision.rb +0 -3
- data/lib/mongo/error/invalid_min_pool_size.rb +0 -3
- data/lib/mongo/error/invalid_nonce.rb +0 -3
- data/lib/mongo/error/invalid_read_concern.rb +2 -4
- data/lib/mongo/error/invalid_read_option.rb +0 -3
- data/lib/mongo/error/invalid_replacement_document.rb +2 -5
- data/lib/mongo/error/invalid_server_auth_host.rb +0 -2
- data/lib/mongo/error/invalid_server_auth_response.rb +0 -2
- data/lib/mongo/error/invalid_server_preference.rb +7 -16
- data/lib/mongo/error/invalid_session.rb +1 -4
- data/lib/mongo/error/invalid_signature.rb +0 -3
- data/lib/mongo/error/invalid_transaction_operation.rb +5 -8
- data/lib/mongo/error/invalid_txt_record.rb +0 -2
- data/lib/mongo/error/invalid_update_document.rb +2 -5
- data/lib/mongo/error/invalid_uri.rb +1 -4
- data/lib/mongo/error/invalid_write_concern.rb +2 -5
- data/lib/mongo/error/kms_error.rb +0 -2
- data/lib/mongo/error/labelable.rb +0 -3
- data/lib/mongo/error/lint_error.rb +0 -2
- data/lib/mongo/error/max_bson_size.rb +8 -11
- data/lib/mongo/error/max_message_size.rb +2 -5
- data/lib/mongo/error/mismatched_domain.rb +0 -2
- data/lib/mongo/error/missing_connection.rb +0 -2
- data/lib/mongo/error/missing_file_chunk.rb +0 -3
- data/lib/mongo/error/missing_password.rb +0 -2
- data/lib/mongo/error/missing_resume_token.rb +1 -4
- data/lib/mongo/error/missing_scram_server_signature.rb +2 -4
- data/lib/mongo/error/missing_service_id.rb +0 -2
- data/lib/mongo/error/mongocryptd_spawn_error.rb +0 -2
- data/lib/mongo/error/multi_index_drop.rb +0 -3
- data/lib/mongo/error/need_primary_server.rb +0 -2
- data/lib/mongo/error/no_server_available.rb +3 -8
- data/lib/mongo/error/no_service_connection_available.rb +1 -3
- data/lib/mongo/error/no_srv_records.rb +0 -2
- data/lib/mongo/error/notable.rb +8 -16
- data/lib/mongo/error/operation_failure.rb +22 -35
- data/lib/mongo/error/parser.rb +33 -75
- data/lib/mongo/error/pool_cleared_error.rb +1 -3
- data/lib/mongo/error/pool_closed_error.rb +0 -3
- data/lib/mongo/error/pool_error.rb +0 -3
- data/lib/mongo/error/pool_paused_error.rb +0 -2
- data/lib/mongo/error/raise_original_error.rb +1 -3
- data/lib/mongo/error/read_write_retryable.rb +14 -17
- data/lib/mongo/error/sdam_error_detection.rb +3 -5
- data/lib/mongo/error/server_api_conflict.rb +0 -2
- data/lib/mongo/error/server_certificate_revoked.rb +0 -2
- data/lib/mongo/error/server_not_usable.rb +0 -2
- data/lib/mongo/error/session_ended.rb +1 -3
- data/lib/mongo/error/session_not_materialized.rb +1 -3
- data/lib/mongo/error/sessions_not_supported.rb +1 -4
- data/lib/mongo/error/snapshot_session_invalid_server_version.rb +1 -4
- data/lib/mongo/error/snapshot_session_transaction_prohibited.rb +1 -4
- data/lib/mongo/error/socket_error.rb +0 -2
- data/lib/mongo/error/socket_timeout_error.rb +0 -2
- data/lib/mongo/error/transactions_not_supported.rb +3 -6
- data/lib/mongo/error/unchangeable_collection_option.rb +1 -4
- data/lib/mongo/error/unexpected_chunk_length.rb +0 -3
- data/lib/mongo/error/unexpected_response.rb +1 -4
- data/lib/mongo/error/unknown_payload_type.rb +0 -3
- data/lib/mongo/error/unmet_dependency.rb +0 -2
- data/lib/mongo/error/unsupported_array_filters.rb +3 -24
- data/lib/mongo/error/unsupported_collation.rb +3 -24
- data/lib/mongo/error/unsupported_features.rb +0 -2
- data/lib/mongo/error/unsupported_message_type.rb +0 -2
- data/lib/mongo/error/unsupported_option.rb +19 -21
- data/lib/mongo/error/write_retryable.rb +0 -2
- data/lib/mongo/error.rb +10 -24
- data/lib/mongo/event/base.rb +0 -2
- data/lib/mongo/event/listeners.rb +0 -3
- data/lib/mongo/event/publisher.rb +0 -3
- data/lib/mongo/event/subscriber.rb +0 -4
- data/lib/mongo/event.rb +4 -6
- data/lib/mongo/grid/file/chunk.rb +7 -10
- data/lib/mongo/grid/file/info.rb +20 -24
- data/lib/mongo/grid/file.rb +7 -8
- data/lib/mongo/grid/fs_bucket.rb +40 -48
- data/lib/mongo/grid/stream/read.rb +25 -35
- data/lib/mongo/grid/stream/write.rb +17 -22
- data/lib/mongo/grid/stream.rb +2 -4
- data/lib/mongo/grid.rb +0 -1
- data/lib/mongo/id.rb +0 -1
- data/lib/mongo/index/view.rb +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 +0 -3
- data/lib/mongo/monitoring/server_opening_log_subscriber.rb +0 -3
- data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +5 -8
- data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +0 -3
- data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +0 -3
- data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +1 -3
- data/lib/mongo/monitoring.rb +38 -39
- data/lib/mongo/operation/aggregate/op_msg.rb +0 -2
- data/lib/mongo/operation/aggregate/result.rb +3 -6
- data/lib/mongo/operation/aggregate.rb +0 -2
- data/lib/mongo/operation/collections_info/result.rb +0 -3
- data/lib/mongo/operation/collections_info.rb +0 -2
- data/lib/mongo/operation/command/op_msg.rb +1 -4
- data/lib/mongo/operation/command.rb +0 -2
- data/lib/mongo/operation/context.rb +13 -16
- data/lib/mongo/operation/count/op_msg.rb +2 -4
- data/lib/mongo/operation/count.rb +0 -2
- data/lib/mongo/operation/create/op_msg.rb +2 -5
- data/lib/mongo/operation/create.rb +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 -48
- data/lib/mongo/operation/shared/bypass_document_validation.rb +3 -7
- data/lib/mongo/operation/shared/causal_consistency_supported.rb +0 -3
- data/lib/mongo/operation/shared/executable.rb +19 -28
- 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 +195 -167
- 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 +117 -138
- data/lib/mongo/server/monitor/app_metadata.rb +3 -4
- data/lib/mongo/server/monitor/connection.rb +28 -35
- data/lib/mongo/server/monitor.rb +65 -60
- data/lib/mongo/server/pending_connection.rb +70 -71
- data/lib/mongo/server/push_monitor/connection.rb +0 -3
- data/lib/mongo/server/push_monitor.rb +21 -29
- data/lib/mongo/server/round_trip_time_calculator.rb +11 -17
- data/lib/mongo/server.rb +60 -93
- data/lib/mongo/server_selector/base.rb +133 -157
- data/lib/mongo/server_selector/nearest.rb +2 -5
- data/lib/mongo/server_selector/primary.rb +1 -5
- data/lib/mongo/server_selector/primary_preferred.rb +2 -6
- data/lib/mongo/server_selector/secondary.rb +2 -6
- data/lib/mongo/server_selector/secondary_preferred.rb +1 -5
- data/lib/mongo/server_selector.rb +3 -4
- data/lib/mongo/session/server_session.rb +6 -7
- data/lib/mongo/session/session_pool.rb +20 -34
- data/lib/mongo/session.rb +287 -188
- 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 +1 -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 +1 -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.
|
|
@@ -48,9 +44,7 @@ module Mongo
|
|
|
48
44
|
# @api private
|
|
49
45
|
def initialize(options = nil)
|
|
50
46
|
options = options ? options.dup : {}
|
|
51
|
-
if options[:max_staleness] == -1
|
|
52
|
-
options.delete(:max_staleness)
|
|
53
|
-
end
|
|
47
|
+
options.delete(:max_staleness) if options[:max_staleness] == -1
|
|
54
48
|
@options = options
|
|
55
49
|
@tag_sets = options[:tag_sets] || []
|
|
56
50
|
@max_staleness = options[:max_staleness]
|
|
@@ -88,7 +82,7 @@ module Mongo
|
|
|
88
82
|
# a server is selected. Will be removed in version 3.0.
|
|
89
83
|
def server_selection_timeout
|
|
90
84
|
@server_selection_timeout ||=
|
|
91
|
-
|
|
85
|
+
options[:server_selection_timeout] || ServerSelector::SERVER_SELECTION_TIMEOUT
|
|
92
86
|
end
|
|
93
87
|
|
|
94
88
|
# Get the local threshold boundary for nearest selection in seconds.
|
|
@@ -103,7 +97,7 @@ module Mongo
|
|
|
103
97
|
# @deprecated This setting is now taken from the cluster options when
|
|
104
98
|
# a server is selected. Will be removed in version 3.0.
|
|
105
99
|
def local_threshold
|
|
106
|
-
@local_threshold ||=
|
|
100
|
+
@local_threshold ||= options[:local_threshold] || ServerSelector::LOCAL_THRESHOLD
|
|
107
101
|
end
|
|
108
102
|
|
|
109
103
|
# @api private
|
|
@@ -161,13 +155,12 @@ module Mongo
|
|
|
161
155
|
# @param [ true, false ] ping Whether to ping the server before selection.
|
|
162
156
|
# Deprecated and ignored.
|
|
163
157
|
# @param [ Session | nil ] session Optional session to take into account
|
|
164
|
-
# for mongos pinning.
|
|
158
|
+
# for mongos pinning.
|
|
165
159
|
# @param [ true | false ] write_aggregation Whether we need a server that
|
|
166
160
|
# supports writing aggregations (e.g. with $merge/$out) on secondaries.
|
|
167
161
|
# @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.
|
|
162
|
+
# be selected from only if no other servers are available.
|
|
163
|
+
#
|
|
171
164
|
# @param [ Float | nil ] :timeout Timeout in seconds for the operation,
|
|
172
165
|
# if any.
|
|
173
166
|
#
|
|
@@ -197,15 +190,20 @@ module Mongo
|
|
|
197
190
|
|
|
198
191
|
# Parameters and return values are the same as for select_server, only
|
|
199
192
|
# the +timeout+ param is renamed to +csot_timeout+.
|
|
200
|
-
private def select_server_impl(cluster,
|
|
193
|
+
private def select_server_impl(cluster, _ping, session, write_aggregation, deprioritized, csot_timeout)
|
|
201
194
|
if cluster.topology.is_a?(Cluster::Topology::LoadBalanced)
|
|
195
|
+
# In load-balanced mode, release the pinned connection if the session
|
|
196
|
+
# is no longer in a transaction (e.g. after commit or abort).
|
|
197
|
+
if session&.pinned_connection_global_id && !session.in_transaction?
|
|
198
|
+
session.unpin
|
|
199
|
+
end
|
|
202
200
|
return cluster.servers.first
|
|
203
201
|
end
|
|
204
202
|
|
|
205
203
|
timeout = cluster.options[:server_selection_timeout] || SERVER_SELECTION_TIMEOUT
|
|
206
204
|
|
|
207
205
|
server_selection_timeout = if csot_timeout && csot_timeout > 0
|
|
208
|
-
[timeout, csot_timeout].min
|
|
206
|
+
[ timeout, csot_timeout ].min
|
|
209
207
|
else
|
|
210
208
|
timeout
|
|
211
209
|
end
|
|
@@ -214,23 +212,19 @@ module Mongo
|
|
|
214
212
|
# and the timeout is zero, fail immediately (since server selection
|
|
215
213
|
# will take some non-zero amount of time in any case).
|
|
216
214
|
if server_selection_timeout == 0
|
|
217
|
-
msg =
|
|
218
|
-
|
|
215
|
+
msg = 'Failing server selection due to zero timeout. ' +
|
|
216
|
+
" Requested #{name} in cluster: #{cluster.summary}"
|
|
219
217
|
raise Error::NoServerAvailable.new(self, cluster, msg)
|
|
220
218
|
end
|
|
221
219
|
|
|
222
220
|
deadline = Utils.monotonic_time + server_selection_timeout
|
|
223
221
|
|
|
224
222
|
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
|
|
223
|
+
if Mongo::Lint.enabled? && !cluster.sharded?
|
|
224
|
+
raise Error::LintError, "Session has a pinned server in a non-sharded topology: #{topology}"
|
|
229
225
|
end
|
|
230
226
|
|
|
231
|
-
|
|
232
|
-
session.unpin
|
|
233
|
-
end
|
|
227
|
+
session.unpin unless session.in_transaction?
|
|
234
228
|
|
|
235
229
|
if server = session.pinned_server
|
|
236
230
|
# Here we assume that a mongos stays in the topology indefinitely.
|
|
@@ -243,7 +237,7 @@ module Mongo
|
|
|
243
237
|
|
|
244
238
|
unless server.mongos?
|
|
245
239
|
msg = "The session being used is pinned to the server which is not a mongos: #{server.summary} " +
|
|
246
|
-
|
|
240
|
+
"(after #{server_selection_timeout} seconds)"
|
|
247
241
|
raise Error::NoServerAvailable.new(self, cluster, msg)
|
|
248
242
|
end
|
|
249
243
|
end
|
|
@@ -252,26 +246,22 @@ module Mongo
|
|
|
252
246
|
end
|
|
253
247
|
end
|
|
254
248
|
|
|
255
|
-
if cluster.replica_set?
|
|
256
|
-
validate_max_staleness_value_early!
|
|
257
|
-
end
|
|
249
|
+
validate_max_staleness_value_early! if cluster.replica_set?
|
|
258
250
|
|
|
259
251
|
if cluster.addresses.empty?
|
|
260
|
-
if Lint.enabled?
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
end
|
|
252
|
+
if Lint.enabled? && !cluster.servers.empty?
|
|
253
|
+
raise Error::LintError,
|
|
254
|
+
"Cluster has no addresses but has servers: #{cluster.servers.map(&:inspect).join(', ')}"
|
|
264
255
|
end
|
|
265
|
-
msg =
|
|
256
|
+
msg = 'Cluster has no addresses, and therefore will never have a server'
|
|
266
257
|
raise Error::NoServerAvailable.new(self, cluster, msg)
|
|
267
258
|
end
|
|
268
259
|
|
|
269
|
-
|
|
270
|
-
unless cluster.connected?
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
end
|
|
274
|
-
=end
|
|
260
|
+
# Add this check in version 3.0.0
|
|
261
|
+
# unless cluster.connected?
|
|
262
|
+
# msg = 'Cluster is disconnected'
|
|
263
|
+
# raise Error::NoServerAvailable.new(self, cluster, msg)
|
|
264
|
+
# end
|
|
275
265
|
|
|
276
266
|
loop do
|
|
277
267
|
if Lint.enabled?
|
|
@@ -287,15 +277,16 @@ module Mongo
|
|
|
287
277
|
end
|
|
288
278
|
|
|
289
279
|
server = try_select_server(cluster, write_aggregation: write_aggregation, deprioritized: deprioritized)
|
|
280
|
+
if server.nil? && deprioritized.any?
|
|
281
|
+
server = try_select_server(cluster, write_aggregation: write_aggregation, deprioritized: [])
|
|
282
|
+
end
|
|
290
283
|
|
|
291
284
|
if server
|
|
292
285
|
unless cluster.topology.compatible?
|
|
293
286
|
raise Error::UnsupportedFeatures, cluster.topology.compatibility_error.to_s
|
|
294
287
|
end
|
|
295
288
|
|
|
296
|
-
if session && session.starting_transaction? && cluster.sharded?
|
|
297
|
-
session.pin_to_server(server)
|
|
298
|
-
end
|
|
289
|
+
session.pin_to_server(server) if session && session.starting_transaction? && cluster.sharded?
|
|
299
290
|
|
|
300
291
|
return server
|
|
301
292
|
end
|
|
@@ -303,34 +294,28 @@ module Mongo
|
|
|
303
294
|
cluster.scan!(false)
|
|
304
295
|
|
|
305
296
|
time_remaining = deadline - Utils.monotonic_time
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
break
|
|
315
|
-
end
|
|
297
|
+
break unless time_remaining > 0
|
|
298
|
+
|
|
299
|
+
wait_for_server_selection(cluster, time_remaining)
|
|
300
|
+
|
|
301
|
+
# If we wait for server selection, perform another round of
|
|
302
|
+
# attempting to locate a suitable server. Otherwise server selection
|
|
303
|
+
# can raise NoServerAvailable message when the diagnostics
|
|
304
|
+
# reports an available server of the requested type.
|
|
316
305
|
end
|
|
317
306
|
|
|
318
307
|
msg = "No #{name} server"
|
|
319
|
-
if is_a?(ServerSelector::Secondary) && !tag_sets.empty?
|
|
320
|
-
msg += " with tag sets: #{tag_sets}"
|
|
321
|
-
end
|
|
308
|
+
msg += " with tag sets: #{tag_sets}" if is_a?(ServerSelector::Secondary) && !tag_sets.empty?
|
|
322
309
|
msg += " is available in cluster: #{cluster.summary} " +
|
|
323
|
-
|
|
324
|
-
|
|
310
|
+
"with timeout=#{server_selection_timeout}, " +
|
|
311
|
+
"LT=#{local_threshold_with_cluster(cluster)}"
|
|
325
312
|
msg += server_selection_diagnostic_message(cluster)
|
|
326
313
|
raise Error::NoServerAvailable.new(self, cluster, msg)
|
|
327
314
|
rescue Error::NoServerAvailable => e
|
|
328
315
|
if session && session.in_transaction? && !session.committing_transaction?
|
|
329
316
|
e.add_label('TransientTransactionError')
|
|
330
317
|
end
|
|
331
|
-
if session && session.committing_transaction?
|
|
332
|
-
e.add_label('UnknownTransactionCommitResult')
|
|
333
|
-
end
|
|
318
|
+
e.add_label('UnknownTransactionCommitResult') if session && session.committing_transaction?
|
|
334
319
|
raise e
|
|
335
320
|
end
|
|
336
321
|
|
|
@@ -351,40 +336,36 @@ module Mongo
|
|
|
351
336
|
# @api private
|
|
352
337
|
def try_select_server(cluster, write_aggregation: false, deprioritized: [])
|
|
353
338
|
servers = if write_aggregation && cluster.replica_set?
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
339
|
+
# 1. Check if ALL servers in cluster support secondary writes.
|
|
340
|
+
is_write_supported = cluster.servers.reduce(true) do |res, server|
|
|
341
|
+
res && server.features.merge_out_on_secondary_enabled?
|
|
342
|
+
end
|
|
343
|
+
|
|
344
|
+
if is_write_supported
|
|
345
|
+
# 2. If all servers support secondary writes, we respect read preference.
|
|
346
|
+
suitable_servers(cluster, deprioritized)
|
|
347
|
+
else
|
|
348
|
+
# 3. Otherwise we fallback to primary for replica set.
|
|
349
|
+
[ cluster.servers.detect(&:primary?) ]
|
|
350
|
+
end
|
|
351
|
+
else
|
|
352
|
+
suitable_servers(cluster, deprioritized)
|
|
353
|
+
end
|
|
369
354
|
|
|
370
355
|
# This list of servers may be ordered in a specific way
|
|
371
356
|
# by the selector (e.g. for secondary preferred, the first
|
|
372
357
|
# server may be a secondary and the second server may be primary)
|
|
373
358
|
# and we should take the first server here respecting the order
|
|
374
|
-
server = suitable_server(servers
|
|
359
|
+
server = suitable_server(servers)
|
|
375
360
|
|
|
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
|
|
361
|
+
if server && Lint.enabled? && server.average_round_trip_time.nil?
|
|
362
|
+
# It is possible for a server to have a nil average RTT here
|
|
363
|
+
# because the ARTT comes from description which may be updated
|
|
364
|
+
# by a background thread while server selection is running.
|
|
365
|
+
# Currently lint mode is not a public feature, if/when this
|
|
366
|
+
# changes (https://jira.mongodb.org/browse/RUBY-1576) the
|
|
367
|
+
# requirement for ARTT to be not nil would need to be removed.
|
|
368
|
+
raise Error::LintError, "Server #{server.address} has nil average rtt"
|
|
388
369
|
end
|
|
389
370
|
|
|
390
371
|
server
|
|
@@ -396,15 +377,14 @@ module Mongo
|
|
|
396
377
|
# latency filtering.
|
|
397
378
|
#
|
|
398
379
|
# @param [ Cluster ] cluster The cluster.
|
|
380
|
+
# @param [ Array<Server> ] deprioritized A list of servers that should
|
|
381
|
+
# be selected from only if no other servers are available.
|
|
399
382
|
#
|
|
400
383
|
# @return [ Array<Server> ] The candidate servers.
|
|
401
384
|
#
|
|
402
385
|
# @api private
|
|
403
|
-
def candidates(cluster)
|
|
404
|
-
servers = cluster.servers
|
|
405
|
-
servers.each do |server|
|
|
406
|
-
validate_max_staleness_support!(server)
|
|
407
|
-
end
|
|
386
|
+
def candidates(cluster, deprioritized = [])
|
|
387
|
+
servers = cluster.servers.reject { |s| deprioritized.include?(s) }
|
|
408
388
|
if cluster.single?
|
|
409
389
|
servers
|
|
410
390
|
elsif cluster.sharded?
|
|
@@ -420,44 +400,55 @@ module Mongo
|
|
|
420
400
|
# Returns servers satisfying the server selector from the cluster.
|
|
421
401
|
#
|
|
422
402
|
# @param [ Cluster ] cluster The cluster.
|
|
403
|
+
# @param [ Array<Server> ] deprioritized A list of servers that should
|
|
404
|
+
# be selected from only if no other servers are available.
|
|
405
|
+
#
|
|
406
|
+
# @return [ Array<Server> ] The suitable servers.
|
|
407
|
+
#
|
|
408
|
+
# @api private
|
|
409
|
+
def suitable_servers(cluster, deprioritized = [])
|
|
410
|
+
result = suitable_servers_impl(cluster, deprioritized)
|
|
411
|
+
result = suitable_servers_impl(cluster, []) if result.empty? && deprioritized.any?
|
|
412
|
+
result
|
|
413
|
+
end
|
|
414
|
+
|
|
415
|
+
private
|
|
416
|
+
|
|
417
|
+
# Internal implementation of suitable_servers that applies deprioritization
|
|
418
|
+
# filtering to the candidate servers.
|
|
419
|
+
#
|
|
420
|
+
# @param [ Cluster ] cluster The cluster.
|
|
421
|
+
# @param [ Array<Server> ] deprioritized A list of servers that should
|
|
422
|
+
# be excluded from the candidate pool.
|
|
423
423
|
#
|
|
424
424
|
# @return [ Array<Server> ] The suitable servers.
|
|
425
425
|
#
|
|
426
426
|
# @api private
|
|
427
|
-
def
|
|
427
|
+
def suitable_servers_impl(cluster, deprioritized)
|
|
428
428
|
if cluster.single?
|
|
429
|
-
candidates(cluster)
|
|
429
|
+
candidates(cluster, deprioritized)
|
|
430
430
|
elsif cluster.sharded?
|
|
431
431
|
local_threshold = local_threshold_with_cluster(cluster)
|
|
432
|
-
servers = candidates(cluster)
|
|
432
|
+
servers = candidates(cluster, deprioritized)
|
|
433
433
|
near_servers(servers, local_threshold)
|
|
434
434
|
elsif cluster.replica_set?
|
|
435
435
|
validate_max_staleness_value!(cluster)
|
|
436
|
-
candidates(cluster)
|
|
436
|
+
candidates(cluster, deprioritized)
|
|
437
437
|
else
|
|
438
438
|
# Unknown cluster - no servers
|
|
439
439
|
[]
|
|
440
440
|
end
|
|
441
441
|
end
|
|
442
442
|
|
|
443
|
-
private
|
|
444
|
-
|
|
445
443
|
# Returns a server from the list of servers that is suitable for
|
|
446
444
|
# executing the operation.
|
|
447
445
|
#
|
|
448
446
|
# @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
447
|
#
|
|
452
448
|
# @return [ Server | nil ] The suitable server or nil if no suitable
|
|
453
449
|
# server is available.
|
|
454
|
-
def suitable_server(servers
|
|
455
|
-
|
|
456
|
-
if preferred.empty?
|
|
457
|
-
servers.first
|
|
458
|
-
else
|
|
459
|
-
preferred.first
|
|
460
|
-
end
|
|
450
|
+
def suitable_server(servers)
|
|
451
|
+
servers.first
|
|
461
452
|
end
|
|
462
453
|
|
|
463
454
|
# Convert this server preference definition into a format appropriate
|
|
@@ -468,7 +459,7 @@ module Mongo
|
|
|
468
459
|
# @since 2.0.0
|
|
469
460
|
def full_doc
|
|
470
461
|
@full_doc ||= begin
|
|
471
|
-
preference = { :
|
|
462
|
+
preference = { mode: self.class.const_get(:SERVER_FORMATTED_NAME) }
|
|
472
463
|
preference.update(tags: tag_sets) unless tag_sets.empty?
|
|
473
464
|
preference.update(maxStalenessSeconds: max_staleness) if max_staleness
|
|
474
465
|
preference.update(hedge: hedge) if hedge
|
|
@@ -529,7 +520,7 @@ module Mongo
|
|
|
529
520
|
# of this method.
|
|
530
521
|
|
|
531
522
|
candidates = candidates.map do |server|
|
|
532
|
-
{server: server, artt: server.average_round_trip_time}
|
|
523
|
+
{ server: server, artt: server.average_round_trip_time }
|
|
533
524
|
end.reject do |candidate|
|
|
534
525
|
candidate[:artt].nil?
|
|
535
526
|
end
|
|
@@ -540,7 +531,7 @@ module Mongo
|
|
|
540
531
|
candidate[:artt]
|
|
541
532
|
end
|
|
542
533
|
|
|
543
|
-
# Default for legacy
|
|
534
|
+
# Default for legacy signature
|
|
544
535
|
local_threshold ||= self.local_threshold
|
|
545
536
|
|
|
546
537
|
threshold = nearest_candidate[:artt] + local_threshold
|
|
@@ -578,16 +569,14 @@ module Mongo
|
|
|
578
569
|
# last_scan here.
|
|
579
570
|
if primary
|
|
580
571
|
candidates.select do |server|
|
|
581
|
-
validate_max_staleness_support!(server)
|
|
582
572
|
staleness = (server.last_scan - server.last_write_date) -
|
|
583
|
-
(primary.last_scan - primary.last_write_date)
|
|
573
|
+
(primary.last_scan - primary.last_write_date) +
|
|
584
574
|
server.cluster.heartbeat_interval
|
|
585
575
|
staleness <= @max_staleness
|
|
586
576
|
end
|
|
587
577
|
else
|
|
588
578
|
max_write_date = candidates.collect(&:last_write_date).max
|
|
589
579
|
candidates.select do |server|
|
|
590
|
-
validate_max_staleness_support!(server)
|
|
591
580
|
staleness = max_write_date - server.last_write_date + server.cluster.heartbeat_interval
|
|
592
581
|
staleness <= @max_staleness
|
|
593
582
|
end
|
|
@@ -601,49 +590,39 @@ module Mongo
|
|
|
601
590
|
raise Error::InvalidServerPreference.new(Error::InvalidServerPreference::NO_MAX_STALENESS_SUPPORT)
|
|
602
591
|
end
|
|
603
592
|
|
|
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
|
|
593
|
+
return unless @hedge
|
|
594
|
+
raise Error::InvalidServerPreference.new(Error::InvalidServerPreference::NO_HEDGE_SUPPORT) unless hedge_allowed?
|
|
618
595
|
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
raise Error::InvalidServerPreference.new(
|
|
596
|
+
unless @hedge.is_a?(Hash) && @hedge.key?(:enabled) &&
|
|
597
|
+
[ true, false ].include?(@hedge[:enabled])
|
|
598
|
+
raise Error::InvalidServerPreference.new(
|
|
599
|
+
"`hedge` value (#{hedge}) is invalid - hedge must be a Hash in the " \
|
|
600
|
+
'format { enabled: true }'
|
|
601
|
+
)
|
|
622
602
|
end
|
|
623
603
|
end
|
|
624
604
|
|
|
625
605
|
def validate_max_staleness_value_early!
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
606
|
+
return unless @max_staleness
|
|
607
|
+
return if @max_staleness >= SMALLEST_MAX_STALENESS_SECONDS
|
|
608
|
+
|
|
609
|
+
msg = "`max_staleness` value (#{@max_staleness}) is too small - it must be at least " +
|
|
629
610
|
"`Mongo::ServerSelector::SMALLEST_MAX_STALENESS_SECONDS` (#{ServerSelector::SMALLEST_MAX_STALENESS_SECONDS})"
|
|
630
|
-
|
|
631
|
-
end
|
|
632
|
-
end
|
|
611
|
+
raise Error::InvalidServerPreference.new(msg)
|
|
633
612
|
end
|
|
634
613
|
|
|
635
614
|
def validate_max_staleness_value!(cluster)
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
615
|
+
return unless @max_staleness
|
|
616
|
+
|
|
617
|
+
heartbeat_interval = cluster.heartbeat_interval
|
|
618
|
+
unless @max_staleness >= [
|
|
619
|
+
SMALLEST_MAX_STALENESS_SECONDS,
|
|
620
|
+
min_cluster_staleness = heartbeat_interval + Cluster::IDLE_WRITE_PERIOD_SECONDS,
|
|
621
|
+
].max
|
|
622
|
+
msg = "`max_staleness` value (#{@max_staleness}) is too small - it must be at least " +
|
|
623
|
+
"`Mongo::ServerSelector::SMALLEST_MAX_STALENESS_SECONDS` (#{ServerSelector::SMALLEST_MAX_STALENESS_SECONDS}) and (the cluster's heartbeat_frequency " +
|
|
624
|
+
"setting + `Mongo::Cluster::IDLE_WRITE_PERIOD_SECONDS`) (#{min_cluster_staleness})"
|
|
625
|
+
raise Error::InvalidServerPreference.new(msg)
|
|
647
626
|
end
|
|
648
627
|
end
|
|
649
628
|
|
|
@@ -669,12 +648,13 @@ module Mongo
|
|
|
669
648
|
# the servers list earlier and the wait call below, we should not
|
|
670
649
|
# wait for the full remaining time - wait for up to 0.5 second, then
|
|
671
650
|
# recheck the state.
|
|
672
|
-
cluster.server_selection_semaphore.wait([time_remaining, 0.5].min)
|
|
651
|
+
cluster.server_selection_semaphore.wait([ time_remaining, 0.5 ].min)
|
|
673
652
|
else
|
|
674
653
|
if Lint.enabled?
|
|
675
654
|
raise Error::LintError, 'Waiting for server selection without having a server selection semaphore'
|
|
676
655
|
end
|
|
677
|
-
|
|
656
|
+
|
|
657
|
+
sleep [ time_remaining, 0.25 ].min
|
|
678
658
|
end
|
|
679
659
|
end
|
|
680
660
|
|
|
@@ -696,17 +676,13 @@ module Mongo
|
|
|
696
676
|
msg = ''
|
|
697
677
|
dead_monitors = []
|
|
698
678
|
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
|
|
679
|
+
thread = server.monitor.instance_variable_get(:@thread)
|
|
680
|
+
dead_monitors << server if thread.nil? || !thread.alive?
|
|
703
681
|
end
|
|
704
682
|
if dead_monitors.any?
|
|
705
683
|
msg += ". The following servers have dead monitor threads: #{dead_monitors.map(&:summary).join(', ')}"
|
|
706
684
|
end
|
|
707
|
-
unless cluster.connected?
|
|
708
|
-
msg += ". The cluster is disconnected (client may have been closed)"
|
|
709
|
-
end
|
|
685
|
+
msg += '. The cluster is disconnected (client may have been closed)' unless cluster.connected?
|
|
710
686
|
msg
|
|
711
687
|
end
|
|
712
688
|
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
|
#
|
|
@@ -86,7 +83,7 @@ module Mongo
|
|
|
86
83
|
# command field value.
|
|
87
84
|
#
|
|
88
85
|
# @since 2.0.0
|
|
89
|
-
alias
|
|
86
|
+
alias to_mongos to_doc
|
|
90
87
|
|
|
91
88
|
private
|
|
92
89
|
|
|
@@ -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
|
#
|
|
@@ -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 servers, with the
|
|
23
20
|
# primary preferred, given a list of candidates.
|
|
24
21
|
#
|
|
25
22
|
# @since 2.0.0
|
|
26
23
|
class PrimaryPreferred < 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 = 'primaryPreferred'
|
|
27
|
+
SERVER_FORMATTED_NAME = 'primaryPreferred'
|
|
32
28
|
|
|
33
29
|
# Get the name of the server mode type.
|
|
34
30
|
#
|
|
@@ -87,7 +83,7 @@ module Mongo
|
|
|
87
83
|
# command field value.
|
|
88
84
|
#
|
|
89
85
|
# @since 2.0.0
|
|
90
|
-
alias
|
|
86
|
+
alias to_mongos to_doc
|
|
91
87
|
|
|
92
88
|
private
|
|
93
89
|
|
|
@@ -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 secondary servers given a list
|
|
23
20
|
# of candidates.
|
|
24
21
|
#
|
|
25
22
|
# @since 2.0.0
|
|
26
23
|
class Secondary < 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 = 'secondary'
|
|
27
|
+
SERVER_FORMATTED_NAME = 'secondary'
|
|
32
28
|
|
|
33
29
|
# Get the name of the server mode type.
|
|
34
30
|
#
|
|
@@ -87,7 +83,7 @@ module Mongo
|
|
|
87
83
|
# command field value.
|
|
88
84
|
#
|
|
89
85
|
# @since 2.0.0
|
|
90
|
-
alias
|
|
86
|
+
alias to_mongos to_doc
|
|
91
87
|
|
|
92
88
|
private
|
|
93
89
|
|