mongo 2.22.0 → 2.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/mongo_console +0 -1
- data/lib/mongo/active_support.rb +1 -2
- data/lib/mongo/address/ipv4.rb +3 -6
- data/lib/mongo/address/ipv6.rb +6 -10
- data/lib/mongo/address/unix.rb +1 -4
- data/lib/mongo/address/validator.rb +16 -28
- data/lib/mongo/address.rb +30 -40
- data/lib/mongo/auth/aws/conversation.rb +6 -10
- data/lib/mongo/auth/aws/credentials.rb +0 -1
- data/lib/mongo/auth/aws/credentials_cache.rb +0 -1
- data/lib/mongo/auth/aws/credentials_retriever.rb +45 -59
- data/lib/mongo/auth/aws/request.rb +20 -35
- data/lib/mongo/auth/aws.rb +1 -2
- data/lib/mongo/auth/base.rb +20 -29
- data/lib/mongo/auth/conversation_base.rb +14 -18
- data/lib/mongo/auth/cr/conversation.rb +0 -3
- data/lib/mongo/auth/cr.rb +1 -4
- data/lib/mongo/auth/credential_cache.rb +0 -2
- data/lib/mongo/auth/gssapi/conversation.rb +3 -8
- data/lib/mongo/auth/gssapi.rb +1 -4
- data/lib/mongo/auth/ldap/conversation.rb +0 -3
- data/lib/mongo/auth/ldap.rb +1 -4
- data/lib/mongo/auth/roles.rb +16 -19
- data/lib/mongo/auth/sasl_conversation_base.rb +7 -11
- data/lib/mongo/auth/scram/conversation.rb +2 -5
- data/lib/mongo/auth/scram.rb +5 -10
- data/lib/mongo/auth/scram256/conversation.rb +2 -5
- data/lib/mongo/auth/scram256.rb +1 -3
- data/lib/mongo/auth/scram_conversation_base.rb +18 -24
- data/lib/mongo/auth/stringprep/profiles/sasl.rb +17 -18
- data/lib/mongo/auth/stringprep/tables.rb +2209 -2210
- data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +36 -38
- data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +1142 -1150
- data/lib/mongo/auth/stringprep.rb +9 -12
- data/lib/mongo/auth/user/view.rb +3 -5
- data/lib/mongo/auth/user.rb +14 -24
- data/lib/mongo/auth/x509/conversation.rb +0 -3
- data/lib/mongo/auth/x509.rb +7 -9
- data/lib/mongo/auth.rb +18 -30
- data/lib/mongo/background_thread.rb +9 -17
- data/lib/mongo/bson.rb +0 -2
- data/lib/mongo/bulk_write/combineable.rb +0 -3
- data/lib/mongo/bulk_write/ordered_combiner.rb +1 -3
- data/lib/mongo/bulk_write/result.rb +11 -16
- data/lib/mongo/bulk_write/result_combiner.rb +9 -12
- data/lib/mongo/bulk_write/transformable.rb +16 -19
- data/lib/mongo/bulk_write/unordered_combiner.rb +1 -3
- data/lib/mongo/bulk_write/validatable.rb +11 -18
- data/lib/mongo/bulk_write.rb +76 -91
- data/lib/mongo/caching_cursor.rb +2 -7
- data/lib/mongo/client.rb +267 -276
- data/lib/mongo/client_encryption.rb +4 -5
- data/lib/mongo/cluster/periodic_executor.rb +2 -5
- data/lib/mongo/cluster/reapers/cursor_reaper.rb +21 -29
- data/lib/mongo/cluster/reapers/socket_reaper.rb +1 -6
- data/lib/mongo/cluster/sdam_flow.rb +136 -159
- data/lib/mongo/cluster/topology/base.rb +15 -18
- data/lib/mongo/cluster/topology/load_balanced.rb +24 -14
- data/lib/mongo/cluster/topology/no_replica_set_options.rb +3 -6
- data/lib/mongo/cluster/topology/replica_set_no_primary.rb +20 -23
- data/lib/mongo/cluster/topology/replica_set_with_primary.rb +0 -2
- data/lib/mongo/cluster/topology/sharded.rb +19 -9
- data/lib/mongo/cluster/topology/single.rb +24 -14
- data/lib/mongo/cluster/topology/unknown.rb +20 -10
- data/lib/mongo/cluster/topology.rb +29 -25
- data/lib/mongo/cluster.rb +152 -184
- data/lib/mongo/cluster_time.rb +14 -31
- data/lib/mongo/collection/helpers.rb +5 -8
- data/lib/mongo/collection/view/aggregation/behavior.rb +1 -1
- data/lib/mongo/collection/view/aggregation.rb +10 -12
- data/lib/mongo/collection/view/builder/aggregation.rb +6 -9
- data/lib/mongo/collection/view/builder/map_reduce.rb +18 -17
- data/lib/mongo/collection/view/builder.rb +0 -1
- data/lib/mongo/collection/view/change_stream/retryable.rb +3 -8
- data/lib/mongo/collection/view/change_stream.rb +59 -58
- data/lib/mongo/collection/view/explainable.rb +11 -20
- data/lib/mongo/collection/view/immutable.rb +1 -3
- data/lib/mongo/collection/view/iterable.rb +44 -35
- data/lib/mongo/collection/view/map_reduce.rb +20 -25
- data/lib/mongo/collection/view/readable.rb +96 -94
- data/lib/mongo/collection/view/writable.rb +104 -114
- data/lib/mongo/collection/view.rb +11 -8
- data/lib/mongo/collection.rb +103 -106
- data/lib/mongo/condition_variable.rb +4 -4
- data/lib/mongo/config/options.rb +0 -3
- data/lib/mongo/config/validators/option.rb +3 -5
- data/lib/mongo/config.rb +6 -4
- data/lib/mongo/crypt/auto_decryption_context.rb +9 -3
- data/lib/mongo/crypt/auto_encrypter.rb +34 -43
- data/lib/mongo/crypt/auto_encryption_context.rb +0 -3
- data/lib/mongo/crypt/binary.rb +5 -9
- data/lib/mongo/crypt/binding.rb +150 -156
- data/lib/mongo/crypt/context.rb +20 -17
- data/lib/mongo/crypt/data_key_context.rb +2 -7
- data/lib/mongo/crypt/encryption_io.rb +29 -39
- data/lib/mongo/crypt/explicit_decryption_context.rb +9 -3
- data/lib/mongo/crypt/explicit_encrypter.rb +1 -1
- data/lib/mongo/crypt/explicit_encryption_context.rb +19 -30
- data/lib/mongo/crypt/explicit_encryption_expression_context.rb +0 -2
- data/lib/mongo/crypt/handle.rb +42 -48
- data/lib/mongo/crypt/hooks.rb +12 -15
- data/lib/mongo/crypt/kms/aws/credentials.rb +12 -16
- data/lib/mongo/crypt/kms/aws/master_document.rb +6 -9
- data/lib/mongo/crypt/kms/aws.rb +0 -2
- data/lib/mongo/crypt/kms/azure/credentials_retriever.rb +2 -7
- data/lib/mongo/crypt/kms/azure/master_document.rb +15 -19
- data/lib/mongo/crypt/kms/azure.rb +0 -1
- data/lib/mongo/crypt/kms/credentials.rb +13 -27
- data/lib/mongo/crypt/kms/gcp/credentials.rb +12 -14
- data/lib/mongo/crypt/kms/gcp/credentials_retriever.rb +7 -9
- data/lib/mongo/crypt/kms/gcp/master_document.rb +12 -16
- data/lib/mongo/crypt/kms/gcp.rb +0 -2
- data/lib/mongo/crypt/kms/kmip/credentials.rb +7 -8
- data/lib/mongo/crypt/kms/kmip/master_document.rb +3 -5
- data/lib/mongo/crypt/kms/kmip.rb +0 -1
- data/lib/mongo/crypt/kms/local/credentials.rb +7 -8
- data/lib/mongo/crypt/kms/local/master_document.rb +2 -6
- data/lib/mongo/crypt/kms/local.rb +0 -1
- data/lib/mongo/crypt/kms/master_key_document.rb +11 -15
- data/lib/mongo/crypt/kms.rb +14 -16
- data/lib/mongo/crypt/kms_context.rb +0 -2
- data/lib/mongo/crypt/rewrap_many_data_key_context.rb +2 -7
- data/lib/mongo/crypt/rewrap_many_data_key_result.rb +2 -4
- data/lib/mongo/crypt/status.rb +12 -14
- data/lib/mongo/crypt.rb +0 -1
- data/lib/mongo/csot_timeout_holder.rb +3 -2
- data/lib/mongo/cursor/kill_spec.rb +7 -10
- data/lib/mongo/cursor.rb +74 -64
- data/lib/mongo/cursor_host.rb +8 -10
- data/lib/mongo/database/view.rb +23 -39
- data/lib/mongo/database.rb +68 -65
- data/lib/mongo/dbref.rb +0 -1
- data/lib/mongo/deprecations.rb +98 -0
- data/lib/mongo/distinguishing_semaphore.rb +0 -1
- data/lib/mongo/error/auth_error.rb +0 -2
- data/lib/mongo/error/bad_load_balancer_target.rb +0 -2
- data/lib/mongo/error/bulk_write_error.rb +7 -10
- data/lib/mongo/error/change_stream_resumable.rb +0 -2
- data/lib/mongo/error/client_closed.rb +0 -2
- data/lib/mongo/error/closed_stream.rb +1 -4
- data/lib/mongo/error/connection_check_out_timeout.rb +3 -6
- data/lib/mongo/error/connection_perished.rb +0 -2
- data/lib/mongo/error/connection_unavailable.rb +0 -2
- data/lib/mongo/error/credential_check_error.rb +0 -2
- data/lib/mongo/error/crypt_error.rb +0 -2
- data/lib/mongo/error/extra_file_chunk.rb +1 -4
- data/lib/mongo/error/failed_string_prep_validation.rb +5 -6
- data/lib/mongo/error/file_not_found.rb +0 -3
- data/lib/mongo/error/handshake_error.rb +0 -2
- data/lib/mongo/error/insufficient_iteration_count.rb +1 -4
- data/lib/mongo/error/internal_driver_error.rb +0 -2
- data/lib/mongo/error/invalid_address.rb +0 -2
- data/lib/mongo/error/invalid_application_name.rb +0 -3
- data/lib/mongo/error/invalid_bulk_operation.rb +1 -4
- data/lib/mongo/error/invalid_bulk_operation_type.rb +1 -4
- data/lib/mongo/error/invalid_collection_name.rb +1 -4
- data/lib/mongo/error/invalid_config_option.rb +0 -3
- data/lib/mongo/error/invalid_cursor_operation.rb +0 -2
- data/lib/mongo/error/invalid_database_name.rb +1 -4
- data/lib/mongo/error/invalid_document.rb +1 -4
- data/lib/mongo/error/invalid_file.rb +0 -3
- data/lib/mongo/error/invalid_file_revision.rb +0 -3
- data/lib/mongo/error/invalid_min_pool_size.rb +0 -3
- data/lib/mongo/error/invalid_nonce.rb +0 -3
- data/lib/mongo/error/invalid_read_concern.rb +2 -4
- data/lib/mongo/error/invalid_read_option.rb +0 -3
- data/lib/mongo/error/invalid_replacement_document.rb +2 -5
- data/lib/mongo/error/invalid_server_auth_host.rb +0 -2
- data/lib/mongo/error/invalid_server_auth_response.rb +0 -2
- data/lib/mongo/error/invalid_server_preference.rb +7 -16
- data/lib/mongo/error/invalid_session.rb +1 -4
- data/lib/mongo/error/invalid_signature.rb +0 -3
- data/lib/mongo/error/invalid_transaction_operation.rb +5 -8
- data/lib/mongo/error/invalid_txt_record.rb +0 -2
- data/lib/mongo/error/invalid_update_document.rb +2 -5
- data/lib/mongo/error/invalid_uri.rb +1 -4
- data/lib/mongo/error/invalid_write_concern.rb +2 -5
- data/lib/mongo/error/kms_error.rb +0 -2
- data/lib/mongo/error/labelable.rb +0 -3
- data/lib/mongo/error/lint_error.rb +0 -2
- data/lib/mongo/error/max_bson_size.rb +8 -11
- data/lib/mongo/error/max_message_size.rb +2 -5
- data/lib/mongo/error/mismatched_domain.rb +0 -2
- data/lib/mongo/error/missing_connection.rb +0 -2
- data/lib/mongo/error/missing_file_chunk.rb +0 -3
- data/lib/mongo/error/missing_password.rb +0 -2
- data/lib/mongo/error/missing_resume_token.rb +1 -4
- data/lib/mongo/error/missing_scram_server_signature.rb +2 -4
- data/lib/mongo/error/missing_service_id.rb +0 -2
- data/lib/mongo/error/mongocryptd_spawn_error.rb +0 -2
- data/lib/mongo/error/multi_index_drop.rb +0 -3
- data/lib/mongo/error/need_primary_server.rb +0 -2
- data/lib/mongo/error/no_server_available.rb +3 -8
- data/lib/mongo/error/no_service_connection_available.rb +1 -3
- data/lib/mongo/error/no_srv_records.rb +0 -2
- data/lib/mongo/error/notable.rb +8 -16
- data/lib/mongo/error/operation_failure.rb +22 -35
- data/lib/mongo/error/parser.rb +33 -75
- data/lib/mongo/error/pool_cleared_error.rb +1 -3
- data/lib/mongo/error/pool_closed_error.rb +0 -3
- data/lib/mongo/error/pool_error.rb +0 -3
- data/lib/mongo/error/pool_paused_error.rb +0 -2
- data/lib/mongo/error/raise_original_error.rb +1 -3
- data/lib/mongo/error/read_write_retryable.rb +14 -17
- data/lib/mongo/error/sdam_error_detection.rb +3 -5
- data/lib/mongo/error/server_api_conflict.rb +0 -2
- data/lib/mongo/error/server_certificate_revoked.rb +0 -2
- data/lib/mongo/error/server_not_usable.rb +0 -2
- data/lib/mongo/error/session_ended.rb +1 -3
- data/lib/mongo/error/session_not_materialized.rb +1 -3
- data/lib/mongo/error/sessions_not_supported.rb +1 -4
- data/lib/mongo/error/snapshot_session_invalid_server_version.rb +1 -4
- data/lib/mongo/error/snapshot_session_transaction_prohibited.rb +1 -4
- data/lib/mongo/error/socket_error.rb +0 -2
- data/lib/mongo/error/socket_timeout_error.rb +0 -2
- data/lib/mongo/error/transactions_not_supported.rb +3 -6
- data/lib/mongo/error/unchangeable_collection_option.rb +1 -4
- data/lib/mongo/error/unexpected_chunk_length.rb +0 -3
- data/lib/mongo/error/unexpected_response.rb +1 -4
- data/lib/mongo/error/unknown_payload_type.rb +0 -3
- data/lib/mongo/error/unmet_dependency.rb +0 -2
- data/lib/mongo/error/unsupported_array_filters.rb +3 -24
- data/lib/mongo/error/unsupported_collation.rb +3 -24
- data/lib/mongo/error/unsupported_features.rb +0 -2
- data/lib/mongo/error/unsupported_message_type.rb +0 -2
- data/lib/mongo/error/unsupported_option.rb +19 -21
- data/lib/mongo/error/write_retryable.rb +0 -2
- data/lib/mongo/error.rb +10 -24
- data/lib/mongo/event/base.rb +0 -2
- data/lib/mongo/event/listeners.rb +0 -3
- data/lib/mongo/event/publisher.rb +0 -3
- data/lib/mongo/event/subscriber.rb +0 -4
- data/lib/mongo/event.rb +4 -6
- data/lib/mongo/grid/file/chunk.rb +7 -10
- data/lib/mongo/grid/file/info.rb +20 -24
- data/lib/mongo/grid/file.rb +7 -8
- data/lib/mongo/grid/fs_bucket.rb +40 -48
- data/lib/mongo/grid/stream/read.rb +25 -35
- data/lib/mongo/grid/stream/write.rb +17 -22
- data/lib/mongo/grid/stream.rb +2 -4
- data/lib/mongo/grid.rb +0 -1
- data/lib/mongo/id.rb +0 -1
- data/lib/mongo/index/view.rb +68 -58
- data/lib/mongo/index.rb +7 -10
- data/lib/mongo/lint.rb +31 -37
- data/lib/mongo/loggable.rb +5 -8
- data/lib/mongo/logger.rb +1 -7
- data/lib/mongo/monitoring/cmap_log_subscriber.rb +0 -2
- data/lib/mongo/monitoring/command_log_subscriber.rb +25 -33
- data/lib/mongo/monitoring/event/cmap/base.rb +0 -2
- data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +1 -4
- data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +0 -3
- data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +1 -4
- data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +2 -5
- data/lib/mongo/monitoring/event/cmap/connection_closed.rb +1 -4
- data/lib/mongo/monitoring/event/cmap/connection_created.rb +1 -4
- data/lib/mongo/monitoring/event/cmap/connection_ready.rb +1 -4
- data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +0 -3
- data/lib/mongo/monitoring/event/cmap/pool_closed.rb +1 -4
- data/lib/mongo/monitoring/event/cmap/pool_created.rb +1 -4
- data/lib/mongo/monitoring/event/cmap/pool_ready.rb +1 -4
- data/lib/mongo/monitoring/event/cmap.rb +0 -1
- data/lib/mongo/monitoring/event/command_failed.rb +5 -9
- data/lib/mongo/monitoring/event/command_started.rb +8 -12
- data/lib/mongo/monitoring/event/command_succeeded.rb +7 -15
- data/lib/mongo/monitoring/event/secure.rb +15 -20
- data/lib/mongo/monitoring/event/server_closed.rb +1 -4
- data/lib/mongo/monitoring/event/server_description_changed.rb +4 -8
- data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +5 -10
- data/lib/mongo/monitoring/event/server_heartbeat_started.rb +1 -4
- data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +3 -8
- data/lib/mongo/monitoring/event/server_opening.rb +1 -4
- data/lib/mongo/monitoring/event/topology_changed.rb +2 -5
- data/lib/mongo/monitoring/event/topology_closed.rb +1 -4
- data/lib/mongo/monitoring/event/topology_opening.rb +1 -4
- data/lib/mongo/monitoring/event.rb +0 -1
- data/lib/mongo/monitoring/publishable.rb +20 -30
- data/lib/mongo/monitoring/sdam_log_subscriber.rb +0 -2
- data/lib/mongo/monitoring/server_closed_log_subscriber.rb +0 -3
- data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +0 -3
- data/lib/mongo/monitoring/server_opening_log_subscriber.rb +0 -3
- data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +5 -8
- data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +0 -3
- data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +0 -3
- data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +1 -3
- data/lib/mongo/monitoring.rb +38 -39
- data/lib/mongo/operation/aggregate/op_msg.rb +0 -2
- data/lib/mongo/operation/aggregate/result.rb +3 -6
- data/lib/mongo/operation/aggregate.rb +0 -2
- data/lib/mongo/operation/collections_info/result.rb +0 -3
- data/lib/mongo/operation/collections_info.rb +0 -2
- data/lib/mongo/operation/command/op_msg.rb +1 -4
- data/lib/mongo/operation/command.rb +0 -2
- data/lib/mongo/operation/context.rb +13 -16
- data/lib/mongo/operation/count/op_msg.rb +2 -4
- data/lib/mongo/operation/count.rb +0 -2
- data/lib/mongo/operation/create/op_msg.rb +2 -5
- data/lib/mongo/operation/create.rb +4 -2
- data/lib/mongo/operation/create_index/op_msg.rb +3 -7
- data/lib/mongo/operation/create_index.rb +0 -2
- data/lib/mongo/operation/create_user/op_msg.rb +2 -4
- data/lib/mongo/operation/create_user.rb +0 -2
- data/lib/mongo/operation/delete/bulk_result.rb +2 -3
- data/lib/mongo/operation/delete/op_msg.rb +3 -10
- data/lib/mongo/operation/delete/result.rb +0 -3
- data/lib/mongo/operation/delete.rb +1 -5
- data/lib/mongo/operation/distinct/op_msg.rb +2 -5
- data/lib/mongo/operation/distinct.rb +0 -2
- data/lib/mongo/operation/drop/op_msg.rb +0 -2
- data/lib/mongo/operation/drop.rb +0 -2
- data/lib/mongo/operation/drop_database/op_msg.rb +0 -2
- data/lib/mongo/operation/drop_database.rb +0 -2
- data/lib/mongo/operation/drop_index/op_msg.rb +4 -6
- data/lib/mongo/operation/drop_index.rb +0 -2
- data/lib/mongo/operation/explain/op_msg.rb +0 -2
- data/lib/mongo/operation/explain/result.rb +0 -3
- data/lib/mongo/operation/explain.rb +0 -2
- data/lib/mongo/operation/find/builder/command.rb +4 -12
- data/lib/mongo/operation/find/builder/flags.rb +9 -15
- data/lib/mongo/operation/find/builder/modifiers.rb +1 -4
- data/lib/mongo/operation/find/builder.rb +0 -1
- data/lib/mongo/operation/find/op_msg.rb +4 -12
- data/lib/mongo/operation/find/result.rb +0 -3
- data/lib/mongo/operation/find.rb +0 -2
- data/lib/mongo/operation/get_more/command_builder.rb +1 -6
- data/lib/mongo/operation/get_more/op_msg.rb +10 -4
- data/lib/mongo/operation/get_more/result.rb +0 -3
- data/lib/mongo/operation/get_more.rb +0 -2
- data/lib/mongo/operation/indexes/op_msg.rb +0 -2
- data/lib/mongo/operation/indexes/result.rb +1 -5
- data/lib/mongo/operation/indexes.rb +0 -2
- data/lib/mongo/operation/insert/bulk_result.rb +2 -6
- data/lib/mongo/operation/insert/op_msg.rb +7 -6
- data/lib/mongo/operation/insert/result.rb +0 -3
- data/lib/mongo/operation/insert.rb +2 -5
- data/lib/mongo/operation/kill_cursors/command_builder.rb +0 -3
- data/lib/mongo/operation/kill_cursors/op_msg.rb +1 -3
- data/lib/mongo/operation/kill_cursors.rb +0 -2
- data/lib/mongo/operation/list_collections/op_msg.rb +4 -6
- data/lib/mongo/operation/list_collections/result.rb +1 -4
- data/lib/mongo/operation/list_collections.rb +0 -2
- data/lib/mongo/operation/map_reduce/op_msg.rb +0 -2
- data/lib/mongo/operation/map_reduce/result.rb +3 -6
- data/lib/mongo/operation/map_reduce.rb +0 -2
- data/lib/mongo/operation/op_msg_base.rb +0 -1
- data/lib/mongo/operation/parallel_scan/op_msg.rb +4 -5
- data/lib/mongo/operation/parallel_scan/result.rb +2 -5
- data/lib/mongo/operation/parallel_scan.rb +0 -2
- data/lib/mongo/operation/remove_user/op_msg.rb +2 -4
- data/lib/mongo/operation/remove_user.rb +0 -2
- data/lib/mongo/operation/result.rb +38 -48
- data/lib/mongo/operation/shared/bypass_document_validation.rb +3 -7
- data/lib/mongo/operation/shared/causal_consistency_supported.rb +0 -3
- data/lib/mongo/operation/shared/executable.rb +29 -31
- data/lib/mongo/operation/shared/executable_no_validate.rb +0 -3
- data/lib/mongo/operation/shared/executable_transaction_label.rb +0 -2
- data/lib/mongo/operation/shared/idable.rb +3 -6
- data/lib/mongo/operation/shared/limited.rb +0 -3
- data/lib/mongo/operation/shared/object_id_generator.rb +0 -3
- data/lib/mongo/operation/shared/op_msg_executable.rb +0 -2
- data/lib/mongo/operation/shared/polymorphic_lookup.rb +0 -2
- data/lib/mongo/operation/shared/polymorphic_result.rb +2 -4
- data/lib/mongo/operation/shared/read_preference_supported.rb +10 -15
- data/lib/mongo/operation/shared/response_handling.rb +13 -26
- data/lib/mongo/operation/shared/result/aggregatable.rb +12 -13
- data/lib/mongo/operation/shared/sessions_supported.rb +87 -99
- data/lib/mongo/operation/shared/specifiable.rb +37 -59
- data/lib/mongo/operation/shared/write.rb +12 -17
- data/lib/mongo/operation/shared/write_concern_supported.rb +4 -7
- data/lib/mongo/operation/update/bulk_result.rb +13 -17
- data/lib/mongo/operation/update/op_msg.rb +2 -5
- data/lib/mongo/operation/update/result.rb +5 -5
- data/lib/mongo/operation/update.rb +1 -5
- data/lib/mongo/operation/update_user/op_msg.rb +2 -4
- data/lib/mongo/operation/update_user.rb +0 -2
- data/lib/mongo/operation/users_info/op_msg.rb +2 -4
- data/lib/mongo/operation/users_info/result.rb +1 -4
- data/lib/mongo/operation/users_info.rb +0 -2
- data/lib/mongo/operation/write_command/op_msg.rb +2 -10
- data/lib/mongo/operation/write_command.rb +0 -2
- data/lib/mongo/operation.rb +9 -14
- data/lib/mongo/options/mapper.rb +8 -15
- data/lib/mongo/options/redacted.rb +7 -9
- data/lib/mongo/options.rb +0 -1
- data/lib/mongo/protocol/bit_vector.rb +3 -5
- data/lib/mongo/protocol/caching_hash.rb +2 -7
- data/lib/mongo/protocol/compressed.rb +5 -10
- data/lib/mongo/protocol/get_more.rb +2 -8
- data/lib/mongo/protocol/kill_cursors.rb +2 -8
- data/lib/mongo/protocol/message.rb +103 -105
- data/lib/mongo/protocol/msg.rb +48 -63
- data/lib/mongo/protocol/query.rb +32 -41
- data/lib/mongo/protocol/registry.rb +2 -5
- data/lib/mongo/protocol/reply.rb +10 -16
- data/lib/mongo/protocol/serializers.rb +41 -59
- data/lib/mongo/protocol.rb +0 -1
- data/lib/mongo/query_cache.rb +7 -15
- data/lib/mongo/retryable/backpressure.rb +31 -0
- data/lib/mongo/retryable/base_worker.rb +39 -13
- data/lib/mongo/retryable/read_worker.rb +77 -21
- data/lib/mongo/retryable/retry_policy.rb +59 -0
- data/lib/mongo/retryable/write_worker.rb +155 -56
- data/lib/mongo/retryable.rb +70 -9
- data/lib/mongo/search_index/view.rb +30 -10
- data/lib/mongo/semaphore.rb +0 -1
- data/lib/mongo/server/app_metadata/environment.rb +3 -3
- data/lib/mongo/server/app_metadata/platform.rb +17 -4
- data/lib/mongo/server/app_metadata.rb +4 -5
- data/lib/mongo/server/connection.rb +79 -61
- data/lib/mongo/server/connection_base.rb +43 -53
- data/lib/mongo/server/connection_common.rb +41 -64
- data/lib/mongo/server/connection_pool/generation_manager.rb +6 -11
- data/lib/mongo/server/connection_pool/populator.rb +1 -4
- data/lib/mongo/server/connection_pool.rb +195 -167
- data/lib/mongo/server/description/features.rb +51 -59
- data/lib/mongo/server/description/load_balancer.rb +0 -2
- data/lib/mongo/server/description.rb +117 -138
- data/lib/mongo/server/monitor/app_metadata.rb +3 -4
- data/lib/mongo/server/monitor/connection.rb +28 -35
- data/lib/mongo/server/monitor.rb +65 -60
- data/lib/mongo/server/pending_connection.rb +70 -71
- data/lib/mongo/server/push_monitor/connection.rb +0 -3
- data/lib/mongo/server/push_monitor.rb +21 -29
- data/lib/mongo/server/round_trip_time_calculator.rb +11 -17
- data/lib/mongo/server.rb +62 -94
- data/lib/mongo/server_selector/base.rb +133 -157
- data/lib/mongo/server_selector/nearest.rb +2 -5
- data/lib/mongo/server_selector/primary.rb +1 -5
- data/lib/mongo/server_selector/primary_preferred.rb +2 -6
- data/lib/mongo/server_selector/secondary.rb +2 -6
- data/lib/mongo/server_selector/secondary_preferred.rb +1 -5
- data/lib/mongo/server_selector.rb +3 -4
- data/lib/mongo/session/server_session.rb +6 -7
- data/lib/mongo/session/session_pool.rb +20 -34
- data/lib/mongo/session.rb +334 -199
- data/lib/mongo/socket/ocsp_cache.rb +8 -13
- data/lib/mongo/socket/ocsp_verifier.rb +69 -70
- data/lib/mongo/socket/ssl.rb +44 -43
- data/lib/mongo/socket/tcp.rb +5 -8
- data/lib/mongo/socket/unix.rb +0 -4
- data/lib/mongo/socket.rb +80 -102
- data/lib/mongo/srv/monitor.rb +10 -11
- data/lib/mongo/srv/resolver.rb +15 -24
- data/lib/mongo/srv/result.rb +25 -21
- data/lib/mongo/srv.rb +0 -1
- data/lib/mongo/timeout.rb +4 -11
- data/lib/mongo/topology_version.rb +8 -13
- data/lib/mongo/tracing/open_telemetry/command_tracer.rb +320 -0
- data/lib/mongo/tracing/open_telemetry/operation_tracer.rb +227 -0
- data/lib/mongo/tracing/open_telemetry/tracer.rb +236 -0
- data/lib/mongo/{error/server_api_not_supported.rb → tracing/open_telemetry.rb} +10 -10
- data/lib/mongo/tracing.rb +42 -0
- data/lib/mongo/uri/options_mapper.rb +135 -126
- data/lib/mongo/uri/srv_protocol.rb +34 -42
- data/lib/mongo/uri.rb +95 -139
- data/lib/mongo/utils.rb +5 -12
- data/lib/mongo/version.rb +1 -1
- data/lib/mongo/write_concern/acknowledged.rb +0 -2
- data/lib/mongo/write_concern/base.rb +6 -6
- data/lib/mongo/write_concern/unacknowledged.rb +0 -2
- data/lib/mongo/write_concern.rb +14 -15
- data/lib/mongo.rb +4 -3
- data/mongo.gemspec +17 -17
- metadata +11 -5
- data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +0 -32
- data/lib/mongo/operation/shared/validatable.rb +0 -87
data/lib/mongo/cluster.rb
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
# Copyright (C) 2014-2020 MongoDB Inc.
|
|
5
4
|
#
|
|
@@ -21,7 +20,6 @@ require 'mongo/cluster/reapers/cursor_reaper'
|
|
|
21
20
|
require 'mongo/cluster/periodic_executor'
|
|
22
21
|
|
|
23
22
|
module Mongo
|
|
24
|
-
|
|
25
23
|
# Represents a group of servers on the server side, either as a
|
|
26
24
|
# single server, a replica set, or a single or multiple mongos.
|
|
27
25
|
#
|
|
@@ -58,7 +56,7 @@ module Mongo
|
|
|
58
56
|
#
|
|
59
57
|
# @since 2.5.0
|
|
60
58
|
# @deprecated
|
|
61
|
-
CLUSTER_TIME = 'clusterTime'
|
|
59
|
+
CLUSTER_TIME = 'clusterTime'
|
|
62
60
|
|
|
63
61
|
# Instantiate the new cluster.
|
|
64
62
|
#
|
|
@@ -118,14 +116,11 @@ module Mongo
|
|
|
118
116
|
#
|
|
119
117
|
# @since 2.0.0
|
|
120
118
|
def initialize(seeds, monitoring, options = Options::Redacted.new)
|
|
121
|
-
if seeds.nil?
|
|
122
|
-
raise ArgumentError, 'Seeds cannot be nil'
|
|
123
|
-
end
|
|
119
|
+
raise ArgumentError, 'Seeds cannot be nil' if seeds.nil?
|
|
124
120
|
|
|
125
121
|
options = options.dup
|
|
126
|
-
if options[:monitoring_io] == false && !options.key?(:cleanup)
|
|
127
|
-
|
|
128
|
-
end
|
|
122
|
+
options[:cleanup] = false if options[:monitoring_io] == false && !options.key?(:cleanup)
|
|
123
|
+
@tracer = options.delete(:tracer)
|
|
129
124
|
@options = options.freeze
|
|
130
125
|
|
|
131
126
|
# @update_lock covers @servers, @connecting, @connected, @topology and
|
|
@@ -147,7 +142,7 @@ module Mongo
|
|
|
147
142
|
@server_selection_semaphore = Semaphore.new
|
|
148
143
|
@topology = Topology.initial(self, monitoring, options)
|
|
149
144
|
# State change lock is similar to the sdam flow lock, but is designed
|
|
150
|
-
# to serialize state changes
|
|
145
|
+
# to serialize state changes initiated by consumers of Cluster
|
|
151
146
|
# (e.g. application connecting or disconnecting the cluster), so that
|
|
152
147
|
# e.g. an application calling disconnect-connect-disconnect rapidly
|
|
153
148
|
# does not put the cluster into an inconsistent state.
|
|
@@ -159,9 +154,7 @@ module Mongo
|
|
|
159
154
|
@sdam_flow_lock = Mutex.new
|
|
160
155
|
@session_pool = Session::SessionPool.new(self)
|
|
161
156
|
|
|
162
|
-
if seeds.empty? && load_balanced?
|
|
163
|
-
raise ArgumentError, 'Load-balanced clusters with no seeds are prohibited'
|
|
164
|
-
end
|
|
157
|
+
raise ArgumentError, 'Load-balanced clusters with no seeds are prohibited' if seeds.empty? && load_balanced?
|
|
165
158
|
|
|
166
159
|
# The opening topology is always unknown with no servers.
|
|
167
160
|
# https://github.com/mongodb/specifications/pull/388
|
|
@@ -221,62 +214,59 @@ module Mongo
|
|
|
221
214
|
@cursor_reaper = CursorReaper.new(self)
|
|
222
215
|
@socket_reaper = SocketReaper.new(self)
|
|
223
216
|
@periodic_executor = PeriodicExecutor.new([
|
|
224
|
-
|
|
225
|
-
|
|
217
|
+
@cursor_reaper, @socket_reaper,
|
|
218
|
+
], options)
|
|
226
219
|
|
|
227
220
|
@periodic_executor.run!
|
|
228
221
|
end
|
|
229
222
|
|
|
230
|
-
|
|
231
|
-
# Need to record start time prior to starting monitoring
|
|
232
|
-
start_monotime = Utils.monotonic_time
|
|
223
|
+
return if load_balanced?
|
|
233
224
|
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
225
|
+
# Need to record start time prior to starting monitoring
|
|
226
|
+
start_monotime = Utils.monotonic_time
|
|
227
|
+
|
|
228
|
+
servers.each do |server|
|
|
229
|
+
server.start_monitoring
|
|
230
|
+
end
|
|
237
231
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
232
|
+
if options[:scan] != false
|
|
233
|
+
server_selection_timeout = options[:server_selection_timeout] || ServerSelector::SERVER_SELECTION_TIMEOUT
|
|
234
|
+
# The server selection timeout can be very short especially in
|
|
235
|
+
# tests, when the client waits for a synchronous scan before
|
|
236
|
+
# starting server selection. Limiting the scan to server selection time
|
|
237
|
+
# then aborts the scan before it can process even local servers.
|
|
238
|
+
# Therefore, allow at least 3 seconds for the scan here.
|
|
239
|
+
server_selection_timeout = 3 if server_selection_timeout < 3
|
|
240
|
+
deadline = start_monotime + server_selection_timeout
|
|
241
|
+
# Wait for the first scan of each server to complete, for
|
|
242
|
+
# backwards compatibility.
|
|
243
|
+
# If any servers are discovered during this SDAM round we are going to
|
|
244
|
+
# wait for these servers to also be queried, and so on, up to the
|
|
245
|
+
# server selection timeout or the 3 second minimum.
|
|
246
|
+
loop do
|
|
247
|
+
# Ensure we do not try to read the servers list while SDAM is running
|
|
248
|
+
servers = @sdam_flow_lock.synchronize do
|
|
249
|
+
servers_list.dup
|
|
247
250
|
end
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
# If any servers are discovered during this SDAM round we are going to
|
|
252
|
-
# wait for these servers to also be queried, and so on, up to the
|
|
253
|
-
# server selection timeout or the 3 second minimum.
|
|
254
|
-
loop do
|
|
255
|
-
# Ensure we do not try to read the servers list while SDAM is running
|
|
256
|
-
servers = @sdam_flow_lock.synchronize do
|
|
257
|
-
servers_list.dup
|
|
258
|
-
end
|
|
259
|
-
if servers.all? { |server| server.last_scan_monotime && server.last_scan_monotime >= start_monotime }
|
|
260
|
-
break
|
|
261
|
-
end
|
|
262
|
-
if (time_remaining = deadline - Utils.monotonic_time) <= 0
|
|
263
|
-
break
|
|
264
|
-
end
|
|
265
|
-
log_debug("Waiting for up to #{'%.2f' % time_remaining} seconds for servers to be scanned: #{summary}")
|
|
266
|
-
# Since the semaphore may have been signaled between us checking
|
|
267
|
-
# the servers list above and the wait call below, we should not
|
|
268
|
-
# wait for the full remaining time - wait for up to 0.5 second, then
|
|
269
|
-
# recheck the state.
|
|
270
|
-
begin
|
|
271
|
-
server_selection_semaphore.wait([time_remaining, 0.5].min)
|
|
272
|
-
rescue ::Timeout::Error
|
|
273
|
-
# nothing
|
|
274
|
-
end
|
|
251
|
+
break if servers.all? { |server| server.last_scan_monotime && server.last_scan_monotime >= start_monotime }
|
|
252
|
+
if (time_remaining = deadline - Utils.monotonic_time) <= 0
|
|
253
|
+
break
|
|
275
254
|
end
|
|
276
|
-
end
|
|
277
255
|
|
|
278
|
-
|
|
256
|
+
log_debug("Waiting for up to #{'%.2f' % time_remaining} seconds for servers to be scanned: #{summary}")
|
|
257
|
+
# Since the semaphore may have been signaled between us checking
|
|
258
|
+
# the servers list above and the wait call below, we should not
|
|
259
|
+
# wait for the full remaining time - wait for up to 0.5 second, then
|
|
260
|
+
# recheck the state.
|
|
261
|
+
begin
|
|
262
|
+
server_selection_semaphore.wait([ time_remaining, 0.5 ].min)
|
|
263
|
+
rescue ::Timeout::Error
|
|
264
|
+
# nothing
|
|
265
|
+
end
|
|
266
|
+
end
|
|
279
267
|
end
|
|
268
|
+
|
|
269
|
+
start_stop_srv_monitor
|
|
280
270
|
end
|
|
281
271
|
|
|
282
272
|
# Create a cluster for the provided client, for use when we don't want the
|
|
@@ -298,7 +288,7 @@ module Mongo
|
|
|
298
288
|
cluster = Cluster.new(
|
|
299
289
|
client.cluster.addresses.map(&:to_s),
|
|
300
290
|
monitoring || Monitoring.new,
|
|
301
|
-
client.cluster_options
|
|
291
|
+
client.cluster_options
|
|
302
292
|
)
|
|
303
293
|
client.instance_variable_set(:@cluster, cluster)
|
|
304
294
|
end
|
|
@@ -309,6 +299,8 @@ module Mongo
|
|
|
309
299
|
# @return [ Monitoring ] monitoring The monitoring.
|
|
310
300
|
attr_reader :monitoring
|
|
311
301
|
|
|
302
|
+
attr_reader :tracer
|
|
303
|
+
|
|
312
304
|
# @return [ Object ] The cluster topology.
|
|
313
305
|
attr_reader :topology
|
|
314
306
|
|
|
@@ -348,11 +340,11 @@ module Mongo
|
|
|
348
340
|
topology.is_a?(Topology::LoadBalanced)
|
|
349
341
|
end
|
|
350
342
|
|
|
351
|
-
[
|
|
343
|
+
%i[register_cursor schedule_kill_cursor unregister_cursor].each do |m|
|
|
352
344
|
define_method(m) do |*args|
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
345
|
+
return unless options[:cleanup] != false
|
|
346
|
+
|
|
347
|
+
@cursor_reaper.send(m, *args)
|
|
356
348
|
end
|
|
357
349
|
end
|
|
358
350
|
|
|
@@ -481,9 +473,9 @@ module Mongo
|
|
|
481
473
|
# @api experimental
|
|
482
474
|
# @since 2.7.0
|
|
483
475
|
def summary
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
476
|
+
'#<Cluster ' +
|
|
477
|
+
"topology=#{topology.summary} " +
|
|
478
|
+
"servers=[#{servers_list.map(&:summary).join(',')}]>"
|
|
487
479
|
end
|
|
488
480
|
|
|
489
481
|
# @api private
|
|
@@ -507,26 +499,23 @@ module Mongo
|
|
|
507
499
|
# @api private
|
|
508
500
|
def close
|
|
509
501
|
@state_change_lock.synchronize do
|
|
510
|
-
unless connecting? || connected?
|
|
511
|
-
|
|
512
|
-
end
|
|
502
|
+
return nil unless connecting? || connected?
|
|
503
|
+
|
|
513
504
|
if options[:cleanup] != false
|
|
514
505
|
session_pool.end_sessions
|
|
515
506
|
@periodic_executor.stop!
|
|
516
507
|
end
|
|
517
508
|
@srv_monitor_lock.synchronize do
|
|
518
|
-
if @srv_monitor
|
|
519
|
-
@srv_monitor.stop!
|
|
520
|
-
end
|
|
509
|
+
@srv_monitor.stop! if @srv_monitor
|
|
521
510
|
end
|
|
522
511
|
@servers.each do |server|
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
)
|
|
529
|
-
|
|
512
|
+
next unless server.connected?
|
|
513
|
+
|
|
514
|
+
server.close
|
|
515
|
+
publish_sdam_event(
|
|
516
|
+
Monitoring::SERVER_CLOSED,
|
|
517
|
+
Monitoring::Event::ServerClosed.new(server.address, topology)
|
|
518
|
+
)
|
|
530
519
|
end
|
|
531
520
|
publish_sdam_event(
|
|
532
521
|
Monitoring::TOPOLOGY_CLOSED,
|
|
@@ -560,9 +549,7 @@ module Mongo
|
|
|
560
549
|
end
|
|
561
550
|
@periodic_executor.restart!
|
|
562
551
|
@srv_monitor_lock.synchronize do
|
|
563
|
-
if @srv_monitor
|
|
564
|
-
@srv_monitor.run!
|
|
565
|
-
end
|
|
552
|
+
@srv_monitor.run! if @srv_monitor
|
|
566
553
|
end
|
|
567
554
|
@update_lock.synchronize do
|
|
568
555
|
@connecting = false
|
|
@@ -594,7 +581,7 @@ module Mongo
|
|
|
594
581
|
# @return [ true ] Always true.
|
|
595
582
|
#
|
|
596
583
|
# @since 2.0.0
|
|
597
|
-
def scan!(sync=true)
|
|
584
|
+
def scan!(sync = true)
|
|
598
585
|
if sync
|
|
599
586
|
servers_list.each do |server|
|
|
600
587
|
if server.monitor
|
|
@@ -637,16 +624,14 @@ module Mongo
|
|
|
637
624
|
# @api private
|
|
638
625
|
def run_sdam_flow(previous_desc, updated_desc, options = {})
|
|
639
626
|
if load_balanced?
|
|
640
|
-
if updated_desc.config.empty?
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
server.clear_connection_pool(service_id: options[:service_id], interrupt_in_use_connections: interrupt)
|
|
649
|
-
end
|
|
627
|
+
if updated_desc.config.empty? && !options[:keep_connection_pool]
|
|
628
|
+
servers_list.each do |server|
|
|
629
|
+
# TODO: should service id be taken out of updated_desc?
|
|
630
|
+
# We could also assert that
|
|
631
|
+
# options[:service_id] == updated_desc.service_id
|
|
632
|
+
err = options[:scan_error]
|
|
633
|
+
interrupt = err && (err.is_a?(Error::SocketError) || err.is_a?(Error::SocketTimeoutError))
|
|
634
|
+
server.clear_connection_pool(service_id: options[:service_id], interrupt_in_use_connections: interrupt)
|
|
650
635
|
end
|
|
651
636
|
end
|
|
652
637
|
return
|
|
@@ -654,22 +639,20 @@ module Mongo
|
|
|
654
639
|
|
|
655
640
|
@sdam_flow_lock.synchronize do
|
|
656
641
|
flow = SdamFlow.new(self, previous_desc, updated_desc,
|
|
657
|
-
|
|
642
|
+
awaited: options[:awaited])
|
|
658
643
|
flow.server_description_changed
|
|
659
644
|
|
|
660
645
|
# SDAM flow may alter the updated description - grab the final
|
|
661
646
|
# version for the purposes of broadcasting if a server is available
|
|
662
647
|
updated_desc = flow.updated_desc
|
|
663
648
|
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
end
|
|
672
|
-
end
|
|
649
|
+
if !options[:keep_connection_pool] && flow.became_unknown?
|
|
650
|
+
servers_list.each do |server|
|
|
651
|
+
next unless server.address == updated_desc.address
|
|
652
|
+
|
|
653
|
+
err = options[:scan_error]
|
|
654
|
+
interrupt = err && (err.is_a?(Error::SocketError) || err.is_a?(Error::SocketTimeoutError))
|
|
655
|
+
server.clear_connection_pool(interrupt_in_use_connections: interrupt)
|
|
673
656
|
end
|
|
674
657
|
end
|
|
675
658
|
|
|
@@ -687,9 +670,9 @@ module Mongo
|
|
|
687
670
|
# thread got killed the server should have been closed and no client
|
|
688
671
|
# should be currently waiting for it, thus not signaling the semaphore
|
|
689
672
|
# shouldn't cause any problems.
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
673
|
+
return if updated_desc.unknown?
|
|
674
|
+
|
|
675
|
+
server_selection_semaphore.broadcast
|
|
693
676
|
end
|
|
694
677
|
|
|
695
678
|
# Sets the list of servers to the addresses in the provided list of address
|
|
@@ -711,9 +694,7 @@ module Mongo
|
|
|
711
694
|
# If one of the new addresses is not in the current servers list,
|
|
712
695
|
# add it to the servers list.
|
|
713
696
|
server_address_strs.each do |address_str|
|
|
714
|
-
unless servers_list.any? { |server| server.address.seed == address_str }
|
|
715
|
-
add(address_str)
|
|
716
|
-
end
|
|
697
|
+
add(address_str) unless servers_list.any? { |server| server.address.seed == address_str }
|
|
717
698
|
end
|
|
718
699
|
|
|
719
700
|
# If one of the servers' addresses are not in the new address list,
|
|
@@ -739,6 +720,7 @@ module Mongo
|
|
|
739
720
|
# @since 2.0.0
|
|
740
721
|
def ==(other)
|
|
741
722
|
return false unless other.is_a?(Cluster)
|
|
723
|
+
|
|
742
724
|
addresses == other.addresses && options == other.options
|
|
743
725
|
end
|
|
744
726
|
|
|
@@ -785,7 +767,7 @@ module Mongo
|
|
|
785
767
|
# @return [ Mongo::Server ] A primary server.
|
|
786
768
|
#
|
|
787
769
|
# @since 2.0.0
|
|
788
|
-
def next_primary(
|
|
770
|
+
def next_primary(_ping = nil, session = nil, timeout: nil)
|
|
789
771
|
ServerSelector.primary.select_server(
|
|
790
772
|
self,
|
|
791
773
|
nil,
|
|
@@ -820,10 +802,10 @@ module Mongo
|
|
|
820
802
|
#
|
|
821
803
|
# @since 2.5.0
|
|
822
804
|
def update_cluster_time(result)
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
805
|
+
return unless cluster_time_doc = result.cluster_time
|
|
806
|
+
|
|
807
|
+
@cluster_time_lock.synchronize do
|
|
808
|
+
advance_cluster_time(cluster_time_doc)
|
|
827
809
|
end
|
|
828
810
|
end
|
|
829
811
|
|
|
@@ -842,34 +824,32 @@ module Mongo
|
|
|
842
824
|
# @return [ Server ] The newly added server, if not present already.
|
|
843
825
|
#
|
|
844
826
|
# @since 2.0.0
|
|
845
|
-
def add(host, add_options=nil)
|
|
827
|
+
def add(host, add_options = nil)
|
|
846
828
|
address = Address.new(host, options)
|
|
847
|
-
if
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
829
|
+
return if addresses.include?(address)
|
|
830
|
+
|
|
831
|
+
opts = options.merge(monitor: false)
|
|
832
|
+
# If we aren't starting the monitoring threads, we also don't want to
|
|
833
|
+
# start the pool's populator thread.
|
|
834
|
+
opts.merge!(populator_io: false) unless options.fetch(:monitoring_io, true)
|
|
835
|
+
# Note that in a load-balanced topology, every server must be a
|
|
836
|
+
# load balancer (load_balancer: true is specified in the options)
|
|
837
|
+
# but this option isn't set here because we are required by the
|
|
838
|
+
# specifications to pretend the server started out as an unknown one
|
|
839
|
+
# and publish server description change event into the load balancer
|
|
840
|
+
# one. The actual correct description for this server will be set
|
|
841
|
+
# by the fabricate_lb_sdam_events_and_set_server_type method.
|
|
842
|
+
server = Server.new(address, self, @monitoring, event_listeners, opts)
|
|
843
|
+
@update_lock.synchronize do
|
|
844
|
+
# Need to recheck whether server is present in @servers, because
|
|
845
|
+
# the previous check was not under a lock.
|
|
846
|
+
# Since we are under the update lock here, we cannot call servers_list.
|
|
847
|
+
return if @servers.map(&:address).include?(address)
|
|
865
848
|
|
|
866
|
-
|
|
867
|
-
end
|
|
868
|
-
if add_options.nil? || add_options[:monitor] != false
|
|
869
|
-
server.start_monitoring
|
|
870
|
-
end
|
|
871
|
-
server
|
|
849
|
+
@servers.push(server)
|
|
872
850
|
end
|
|
851
|
+
server.start_monitoring if add_options.nil? || add_options[:monitor] != false
|
|
852
|
+
server
|
|
873
853
|
end
|
|
874
854
|
|
|
875
855
|
# Remove the server from the cluster for the provided address, if it
|
|
@@ -897,9 +877,7 @@ module Mongo
|
|
|
897
877
|
@update_lock.synchronize do
|
|
898
878
|
@servers.delete_if do |server|
|
|
899
879
|
(server.address == address).tap do |delete|
|
|
900
|
-
if delete
|
|
901
|
-
removed_servers << server
|
|
902
|
-
end
|
|
880
|
+
removed_servers << server if delete
|
|
903
881
|
end
|
|
904
882
|
end
|
|
905
883
|
end
|
|
@@ -908,10 +886,10 @@ module Mongo
|
|
|
908
886
|
disconnect_server_if_connected(server)
|
|
909
887
|
end
|
|
910
888
|
end
|
|
911
|
-
if disconnect
|
|
912
|
-
removed_servers.any?
|
|
913
|
-
else
|
|
889
|
+
if disconnect == false
|
|
914
890
|
removed_servers
|
|
891
|
+
else
|
|
892
|
+
removed_servers.any?
|
|
915
893
|
end
|
|
916
894
|
end
|
|
917
895
|
|
|
@@ -951,14 +929,14 @@ module Mongo
|
|
|
951
929
|
|
|
952
930
|
# @api private
|
|
953
931
|
def disconnect_server_if_connected(server)
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
)
|
|
961
|
-
|
|
932
|
+
return unless server.connected?
|
|
933
|
+
|
|
934
|
+
server.clear_description
|
|
935
|
+
server.disconnect!
|
|
936
|
+
publish_sdam_event(
|
|
937
|
+
Monitoring::SERVER_CLOSED,
|
|
938
|
+
Monitoring::Event::ServerClosed.new(server.address, topology)
|
|
939
|
+
)
|
|
962
940
|
end
|
|
963
941
|
|
|
964
942
|
# Raises Error::SessionsNotAvailable if the deployment that the driver
|
|
@@ -986,17 +964,11 @@ module Mongo
|
|
|
986
964
|
#
|
|
987
965
|
# @api private
|
|
988
966
|
def validate_session_support!(timeout: nil)
|
|
989
|
-
if topology.is_a?(Topology::LoadBalanced)
|
|
990
|
-
return
|
|
991
|
-
end
|
|
967
|
+
return if topology.is_a?(Topology::LoadBalanced)
|
|
992
968
|
|
|
993
969
|
@state_change_lock.synchronize do
|
|
994
970
|
@sdam_flow_lock.synchronize do
|
|
995
|
-
if topology.data_bearing_servers?
|
|
996
|
-
unless topology.logical_session_timeout
|
|
997
|
-
raise_sessions_not_supported
|
|
998
|
-
end
|
|
999
|
-
end
|
|
971
|
+
raise_sessions_not_supported if topology.data_bearing_servers? && !topology.logical_session_timeout
|
|
1000
972
|
end
|
|
1001
973
|
end
|
|
1002
974
|
|
|
@@ -1006,9 +978,7 @@ module Mongo
|
|
|
1006
978
|
ServerSelector.get(mode: :primary_preferred).select_server(self, timeout: timeout)
|
|
1007
979
|
@state_change_lock.synchronize do
|
|
1008
980
|
@sdam_flow_lock.synchronize do
|
|
1009
|
-
unless topology.logical_session_timeout
|
|
1010
|
-
raise_sessions_not_supported
|
|
1011
|
-
end
|
|
981
|
+
raise_sessions_not_supported unless topology.logical_session_timeout
|
|
1012
982
|
end
|
|
1013
983
|
end
|
|
1014
984
|
end
|
|
@@ -1026,7 +996,8 @@ module Mongo
|
|
|
1026
996
|
@srv_monitor_lock.synchronize do
|
|
1027
997
|
unless @srv_monitor
|
|
1028
998
|
monitor_options = Utils.shallow_symbolize_keys(options.merge(
|
|
1029
|
-
|
|
999
|
+
timeout: options[:connect_timeout] || Server::CONNECT_TIMEOUT
|
|
1000
|
+
))
|
|
1030
1001
|
@srv_monitor = _srv_monitor = Srv::Monitor.new(self, **monitor_options)
|
|
1031
1002
|
end
|
|
1032
1003
|
@srv_monitor.run!
|
|
@@ -1037,9 +1008,7 @@ module Mongo
|
|
|
1037
1008
|
# is discovered, since it's not a sharded cluster, the SRV monitor
|
|
1038
1009
|
# needs to be stopped.
|
|
1039
1010
|
@srv_monitor_lock.synchronize do
|
|
1040
|
-
if @srv_monitor
|
|
1041
|
-
@srv_monitor.stop!
|
|
1042
|
-
end
|
|
1011
|
+
@srv_monitor.stop! if @srv_monitor
|
|
1043
1012
|
end
|
|
1044
1013
|
end
|
|
1045
1014
|
end
|
|
@@ -1052,10 +1021,10 @@ module Mongo
|
|
|
1052
1021
|
server.description.data_bearing? && server.logical_session_timeout.nil?
|
|
1053
1022
|
end
|
|
1054
1023
|
reason = if offending_servers.empty?
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1024
|
+
"There are no known data bearing servers (current seeds: #{@servers.map(&:address).map(&:seed).join(', ')})"
|
|
1025
|
+
else
|
|
1026
|
+
"The following servers have null logical session timeout: #{offending_servers.map(&:address).map(&:seed).join(', ')}"
|
|
1027
|
+
end
|
|
1059
1028
|
msg = "The deployment that the driver is connected to does not support sessions: #{reason}"
|
|
1060
1029
|
raise Error::SessionsNotSupported, msg
|
|
1061
1030
|
end
|
|
@@ -1071,9 +1040,8 @@ module Mongo
|
|
|
1071
1040
|
# description.
|
|
1072
1041
|
server.update_description(
|
|
1073
1042
|
Server::Description.new(server.address, {},
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
)
|
|
1043
|
+
load_balancer: true,
|
|
1044
|
+
force_load_balancer: options[:connect] == :load_balanced)
|
|
1077
1045
|
)
|
|
1078
1046
|
publish_sdam_event(
|
|
1079
1047
|
Monitoring::SERVER_DESCRIPTION_CHANGED,
|
|
@@ -1097,13 +1065,13 @@ module Mongo
|
|
|
1097
1065
|
|
|
1098
1066
|
COSMOSDB_HOST_PATTERNS = %w[ .cosmos.azure.com ]
|
|
1099
1067
|
COSMOSDB_LOG_MESSAGE = 'You appear to be connected to a CosmosDB cluster. ' \
|
|
1100
|
-
|
|
1101
|
-
|
|
1068
|
+
'For more information regarding feature compatibility and support please visit ' \
|
|
1069
|
+
'https://www.mongodb.com/supportability/cosmosdb'
|
|
1102
1070
|
|
|
1103
1071
|
DOCUMENTDB_HOST_PATTERNS = %w[ .docdb.amazonaws.com .docdb-elastic.amazonaws.com ]
|
|
1104
1072
|
DOCUMENTDB_LOG_MESSAGE = 'You appear to be connected to a DocumentDB cluster. ' \
|
|
1105
|
-
|
|
1106
|
-
|
|
1073
|
+
'For more information regarding feature compatibility and support please visit ' \
|
|
1074
|
+
'https://www.mongodb.com/supportability/documentdb'
|
|
1107
1075
|
|
|
1108
1076
|
# Compares the server hosts with address suffixes of known services
|
|
1109
1077
|
# that provide limited MongoDB API compatibility, and warns about them.
|
|
@@ -1113,10 +1081,10 @@ module Mongo
|
|
|
1113
1081
|
return
|
|
1114
1082
|
end
|
|
1115
1083
|
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1084
|
+
return unless topology.server_hosts_match_any?(DOCUMENTDB_HOST_PATTERNS)
|
|
1085
|
+
|
|
1086
|
+
log_info DOCUMENTDB_LOG_MESSAGE
|
|
1087
|
+
nil
|
|
1120
1088
|
end
|
|
1121
1089
|
end
|
|
1122
1090
|
end
|