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
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
# Copyright (C) 2018-2020 MongoDB Inc.
|
|
5
4
|
#
|
|
@@ -37,10 +36,10 @@ class Mongo::Cluster
|
|
|
37
36
|
@awaited = !!awaited
|
|
38
37
|
end
|
|
39
38
|
|
|
40
|
-
attr_reader :cluster
|
|
39
|
+
attr_reader :cluster, :previous_desc, :updated_desc, :original_desc
|
|
41
40
|
|
|
42
41
|
def_delegators :cluster, :servers_list, :seeds,
|
|
43
|
-
|
|
42
|
+
:publish_sdam_event, :log_warn
|
|
44
43
|
|
|
45
44
|
# The topology stored in this attribute can change multiple times throughout
|
|
46
45
|
# a single sdam flow (e.g. unknown -> RS no primary -> RS with primary).
|
|
@@ -51,10 +50,6 @@ class Mongo::Cluster
|
|
|
51
50
|
# @return Mongo::Cluster::Topology The current topology.
|
|
52
51
|
attr_reader :topology
|
|
53
52
|
|
|
54
|
-
attr_reader :previous_desc
|
|
55
|
-
attr_reader :updated_desc
|
|
56
|
-
attr_reader :original_desc
|
|
57
|
-
|
|
58
53
|
def awaited?
|
|
59
54
|
@awaited
|
|
60
55
|
end
|
|
@@ -65,34 +60,31 @@ class Mongo::Cluster
|
|
|
65
60
|
# updated_desc's address.
|
|
66
61
|
def update_server_descriptions
|
|
67
62
|
servers_list.each do |server|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
# in topology we will omit sending events.
|
|
87
|
-
return true
|
|
88
|
-
end
|
|
63
|
+
next unless server.address == updated_desc.address
|
|
64
|
+
# SDAM flow must be run when topology version in the new description
|
|
65
|
+
# is equal to the current topology version, per the example in
|
|
66
|
+
# https://github.com/mongodb/specifications/blob/master/source/server-discovery-and-monitoring/server-discovery-and-monitoring.md#what-is-the-purpose-of-topologyversion
|
|
67
|
+
return false unless updated_desc.topology_version_gte?(server.description)
|
|
68
|
+
|
|
69
|
+
@server_description_changed = server.description != updated_desc
|
|
70
|
+
|
|
71
|
+
# Always update server description, so that fields that do not
|
|
72
|
+
# affect description equality comparisons but are part of the
|
|
73
|
+
# description are updated.
|
|
74
|
+
server.update_description(updated_desc)
|
|
75
|
+
server.update_last_scan
|
|
76
|
+
|
|
77
|
+
# If there was no content difference between descriptions, we
|
|
78
|
+
# still need to run sdam flow, but if the flow produces no change
|
|
79
|
+
# in topology we will omit sending events.
|
|
80
|
+
return true
|
|
89
81
|
end
|
|
90
82
|
false
|
|
91
83
|
end
|
|
92
84
|
|
|
93
85
|
def server_description_changed
|
|
94
86
|
@previous_server_descriptions = servers_list.map do |server|
|
|
95
|
-
[server.address.to_s, server.description]
|
|
87
|
+
[ server.address.to_s, server.description ]
|
|
96
88
|
end
|
|
97
89
|
|
|
98
90
|
unless update_server_descriptions
|
|
@@ -107,23 +99,21 @@ class Mongo::Cluster
|
|
|
107
99
|
case topology
|
|
108
100
|
when Topology::LoadBalanced
|
|
109
101
|
@updated_desc = ::Mongo::Server::Description::LoadBalancer.new(
|
|
110
|
-
updated_desc.address
|
|
102
|
+
updated_desc.address
|
|
111
103
|
)
|
|
112
104
|
update_server_descriptions
|
|
113
105
|
when Topology::Single
|
|
114
|
-
if topology.replica_set_name
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
update_server_descriptions
|
|
126
|
-
end
|
|
106
|
+
if topology.replica_set_name && (updated_desc.replica_set_name != topology.replica_set_name)
|
|
107
|
+
log_warn(
|
|
108
|
+
"Server #{updated_desc.address} has an incorrect replica set name '#{updated_desc.replica_set_name}'; expected '#{topology.replica_set_name}'"
|
|
109
|
+
)
|
|
110
|
+
@updated_desc = ::Mongo::Server::Description.new(
|
|
111
|
+
updated_desc.address,
|
|
112
|
+
{},
|
|
113
|
+
average_round_trip_time: updated_desc.average_round_trip_time,
|
|
114
|
+
minimum_round_trip_time: updated_desc.minimum_round_trip_time
|
|
115
|
+
)
|
|
116
|
+
update_server_descriptions
|
|
127
117
|
end
|
|
128
118
|
when Topology::Unknown
|
|
129
119
|
if updated_desc.standalone?
|
|
@@ -133,25 +123,27 @@ class Mongo::Cluster
|
|
|
133
123
|
elsif updated_desc.primary?
|
|
134
124
|
@topology = Topology::ReplicaSetWithPrimary.new(
|
|
135
125
|
topology.options.merge(replica_set_name: updated_desc.replica_set_name),
|
|
136
|
-
topology.monitoring, self
|
|
126
|
+
topology.monitoring, self
|
|
127
|
+
)
|
|
137
128
|
update_rs_from_primary
|
|
138
129
|
elsif updated_desc.secondary? || updated_desc.arbiter? || updated_desc.other?
|
|
139
130
|
@topology = Topology::ReplicaSetNoPrimary.new(
|
|
140
131
|
topology.options.merge(replica_set_name: updated_desc.replica_set_name),
|
|
141
|
-
topology.monitoring, self
|
|
132
|
+
topology.monitoring, self
|
|
133
|
+
)
|
|
142
134
|
update_rs_without_primary
|
|
143
135
|
end
|
|
144
136
|
when Topology::Sharded
|
|
145
137
|
unless updated_desc.unknown? || updated_desc.mongos?
|
|
146
138
|
log_warn(
|
|
147
|
-
"Removing server #{updated_desc.address
|
|
139
|
+
"Removing server #{updated_desc.address} because it is of the wrong type (#{updated_desc.server_type.to_s.upcase}) - expected SHARDED"
|
|
148
140
|
)
|
|
149
141
|
remove
|
|
150
142
|
end
|
|
151
143
|
when Topology::ReplicaSetWithPrimary
|
|
152
144
|
if updated_desc.standalone? || updated_desc.mongos?
|
|
153
145
|
log_warn(
|
|
154
|
-
"Removing server #{updated_desc.address
|
|
146
|
+
"Removing server #{updated_desc.address} because it is of the wrong type (#{updated_desc.server_type.to_s.upcase}) - expected a replica set member"
|
|
155
147
|
)
|
|
156
148
|
remove
|
|
157
149
|
check_if_has_primary
|
|
@@ -165,7 +157,7 @@ class Mongo::Cluster
|
|
|
165
157
|
when Topology::ReplicaSetNoPrimary
|
|
166
158
|
if updated_desc.standalone? || updated_desc.mongos?
|
|
167
159
|
log_warn(
|
|
168
|
-
"Removing server #{updated_desc.address
|
|
160
|
+
"Removing server #{updated_desc.address} because it is of the wrong type (#{updated_desc.server_type.to_s.upcase}) - expected a replica set member"
|
|
169
161
|
)
|
|
170
162
|
remove
|
|
171
163
|
elsif updated_desc.primary?
|
|
@@ -175,13 +167,14 @@ class Mongo::Cluster
|
|
|
175
167
|
# is is imperative to NOT pass updated_desc's RS name to
|
|
176
168
|
# topology constructor here.
|
|
177
169
|
# During processing we may remove the server whose updated_desc
|
|
178
|
-
# we are
|
|
179
|
-
# in which case
|
|
170
|
+
# we are processing (e.g. the RS name mismatch case again),
|
|
171
|
+
# in which case topology type will go back to RS without primary
|
|
180
172
|
# in the check_if_has_primary step.
|
|
181
173
|
@topology = Topology::ReplicaSetWithPrimary.new(
|
|
182
174
|
# Do not pass updated_desc's RS name here
|
|
183
175
|
topology.options,
|
|
184
|
-
topology.monitoring, self
|
|
176
|
+
topology.monitoring, self
|
|
177
|
+
)
|
|
185
178
|
update_rs_from_primary
|
|
186
179
|
elsif updated_desc.secondary? || updated_desc.arbiter? || updated_desc.other?
|
|
187
180
|
update_rs_without_primary
|
|
@@ -200,10 +193,11 @@ class Mongo::Cluster
|
|
|
200
193
|
def update_unknown_with_standalone
|
|
201
194
|
if seeds.length == 1
|
|
202
195
|
@topology = Topology::Single.new(
|
|
203
|
-
topology.options, topology.monitoring, self
|
|
196
|
+
topology.options, topology.monitoring, self
|
|
197
|
+
)
|
|
204
198
|
else
|
|
205
199
|
log_warn(
|
|
206
|
-
"Removing server #{updated_desc.address
|
|
200
|
+
"Removing server #{updated_desc.address} because it is a standalone and we have multiple seeds (#{seeds.length})"
|
|
207
201
|
)
|
|
208
202
|
remove
|
|
209
203
|
end
|
|
@@ -222,12 +216,13 @@ class Mongo::Cluster
|
|
|
222
216
|
if topology.replica_set_name.nil?
|
|
223
217
|
@topology = Topology::ReplicaSetWithPrimary.new(
|
|
224
218
|
topology.options.merge(replica_set_name: updated_desc.replica_set_name),
|
|
225
|
-
topology.monitoring, self
|
|
219
|
+
topology.monitoring, self
|
|
220
|
+
)
|
|
226
221
|
end
|
|
227
222
|
|
|
228
223
|
if topology.replica_set_name != updated_desc.replica_set_name
|
|
229
224
|
log_warn(
|
|
230
|
-
"Removing server #{updated_desc.address
|
|
225
|
+
"Removing server #{updated_desc.address} because it has an " +
|
|
231
226
|
"incorrect replica set name '#{updated_desc.replica_set_name}'; " +
|
|
232
227
|
"expected '#{topology.replica_set_name}'"
|
|
233
228
|
)
|
|
@@ -253,19 +248,20 @@ class Mongo::Cluster
|
|
|
253
248
|
topology.options.merge(
|
|
254
249
|
max_election_id: updated_desc.election_id,
|
|
255
250
|
max_set_version: updated_desc.set_version
|
|
256
|
-
), topology.monitoring, self
|
|
251
|
+
), topology.monitoring, self
|
|
252
|
+
)
|
|
257
253
|
else
|
|
258
254
|
max_election_id = topology.new_max_election_id(updated_desc)
|
|
259
255
|
max_set_version = topology.new_max_set_version(updated_desc)
|
|
260
256
|
|
|
261
257
|
if max_election_id != topology.max_election_id ||
|
|
262
|
-
|
|
263
|
-
then
|
|
258
|
+
max_set_version != topology.max_set_version
|
|
264
259
|
@topology = Topology::ReplicaSetWithPrimary.new(
|
|
265
260
|
topology.options.merge(
|
|
266
261
|
max_election_id: max_election_id,
|
|
267
262
|
max_set_version: max_set_version
|
|
268
|
-
), topology.monitoring, self
|
|
263
|
+
), topology.monitoring, self
|
|
264
|
+
)
|
|
269
265
|
end
|
|
270
266
|
end
|
|
271
267
|
|
|
@@ -276,18 +272,18 @@ class Mongo::Cluster
|
|
|
276
272
|
publish_description_change_event
|
|
277
273
|
|
|
278
274
|
servers_list.each do |server|
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
275
|
+
next unless server.address != updated_desc.address
|
|
276
|
+
|
|
277
|
+
next unless server.primary?
|
|
278
|
+
|
|
279
|
+
server.update_description(
|
|
280
|
+
::Mongo::Server::Description.new(
|
|
281
|
+
server.address,
|
|
282
|
+
{},
|
|
283
|
+
average_round_trip_time: server.description.average_round_trip_time,
|
|
284
|
+
minimum_round_trip_time: updated_desc.minimum_round_trip_time
|
|
285
|
+
)
|
|
286
|
+
)
|
|
291
287
|
end
|
|
292
288
|
|
|
293
289
|
servers = add_servers_from_desc(updated_desc)
|
|
@@ -304,7 +300,7 @@ class Mongo::Cluster
|
|
|
304
300
|
def update_rs_with_primary_from_member
|
|
305
301
|
if topology.replica_set_name != updated_desc.replica_set_name
|
|
306
302
|
log_warn(
|
|
307
|
-
"Removing server #{updated_desc.address
|
|
303
|
+
"Removing server #{updated_desc.address} because it has an " +
|
|
308
304
|
"incorrect replica set name (#{updated_desc.replica_set_name}); " +
|
|
309
305
|
"current set name is #{topology.replica_set_name}"
|
|
310
306
|
)
|
|
@@ -315,7 +311,7 @@ class Mongo::Cluster
|
|
|
315
311
|
|
|
316
312
|
if updated_desc.me_mismatch?
|
|
317
313
|
log_warn(
|
|
318
|
-
"Removing server #{updated_desc.address
|
|
314
|
+
"Removing server #{updated_desc.address} because it " +
|
|
319
315
|
"reported itself as #{updated_desc.me}"
|
|
320
316
|
)
|
|
321
317
|
remove
|
|
@@ -331,10 +327,11 @@ class Mongo::Cluster
|
|
|
331
327
|
end
|
|
332
328
|
end
|
|
333
329
|
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
330
|
+
return if have_primary
|
|
331
|
+
|
|
332
|
+
@topology = Topology::ReplicaSetNoPrimary.new(
|
|
333
|
+
topology.options, topology.monitoring, self
|
|
334
|
+
)
|
|
338
335
|
end
|
|
339
336
|
|
|
340
337
|
# Updates a ReplicaSetNoPrimary topology from a non-primary member.
|
|
@@ -342,12 +339,13 @@ class Mongo::Cluster
|
|
|
342
339
|
if topology.replica_set_name.nil?
|
|
343
340
|
@topology = Topology::ReplicaSetNoPrimary.new(
|
|
344
341
|
topology.options.merge(replica_set_name: updated_desc.replica_set_name),
|
|
345
|
-
topology.monitoring, self
|
|
342
|
+
topology.monitoring, self
|
|
343
|
+
)
|
|
346
344
|
end
|
|
347
345
|
|
|
348
346
|
if topology.replica_set_name != updated_desc.replica_set_name
|
|
349
347
|
log_warn(
|
|
350
|
-
"Removing server #{updated_desc.address
|
|
348
|
+
"Removing server #{updated_desc.address} because it has an " +
|
|
351
349
|
"incorrect replica set name (#{updated_desc.replica_set_name}); " +
|
|
352
350
|
"current set name is #{topology.replica_set_name}"
|
|
353
351
|
)
|
|
@@ -365,14 +363,14 @@ class Mongo::Cluster
|
|
|
365
363
|
server.start_monitoring
|
|
366
364
|
end
|
|
367
365
|
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
366
|
+
return unless updated_desc.me_mismatch?
|
|
367
|
+
|
|
368
|
+
log_warn(
|
|
369
|
+
"Removing server #{updated_desc.address} because it " +
|
|
370
|
+
"reported itself as #{updated_desc.me}"
|
|
371
|
+
)
|
|
372
|
+
remove
|
|
373
|
+
nil
|
|
376
374
|
end
|
|
377
375
|
|
|
378
376
|
# Adds all servers referenced in the given description (which is
|
|
@@ -386,7 +384,7 @@ class Mongo::Cluster
|
|
|
386
384
|
# This is the set of servers on which monitoring should be started.
|
|
387
385
|
def add_servers_from_desc(updated_desc)
|
|
388
386
|
added_servers = []
|
|
389
|
-
%w
|
|
387
|
+
%w[hosts passives arbiters].each do |m|
|
|
390
388
|
updated_desc.send(m).each do |address_str|
|
|
391
389
|
if server = cluster.add(address_str, monitor: false)
|
|
392
390
|
added_servers << server
|
|
@@ -403,22 +401,20 @@ class Mongo::Cluster
|
|
|
403
401
|
# given server description (which is supposed to have come from a
|
|
404
402
|
# good primary).
|
|
405
403
|
def remove_servers_not_in_desc(updated_desc)
|
|
406
|
-
updated_desc_address_strs = %w
|
|
404
|
+
updated_desc_address_strs = %w[hosts passives arbiters].map do |m|
|
|
407
405
|
updated_desc.send(m)
|
|
408
406
|
end.flatten
|
|
409
407
|
servers_list.each do |server|
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
do_remove(address_str)
|
|
421
|
-
end
|
|
408
|
+
next if updated_desc_address_strs.include?(address_str = server.address.to_s)
|
|
409
|
+
|
|
410
|
+
updated_host = updated_desc.address.to_s
|
|
411
|
+
updated_host += " (self-identified as #{updated_desc.me})" if updated_desc.me && updated_desc.me != updated_host
|
|
412
|
+
log_warn(
|
|
413
|
+
"Removing server #{address_str} because it is not in hosts reported by primary " +
|
|
414
|
+
"#{updated_host}. Reported hosts are: " +
|
|
415
|
+
updated_desc.hosts.join(', ')
|
|
416
|
+
)
|
|
417
|
+
do_remove(address_str)
|
|
422
418
|
end
|
|
423
419
|
end
|
|
424
420
|
|
|
@@ -450,11 +446,11 @@ class Mongo::Cluster
|
|
|
450
446
|
)
|
|
451
447
|
end
|
|
452
448
|
@servers_to_disconnect += servers
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
449
|
+
return unless servers_list.empty?
|
|
450
|
+
|
|
451
|
+
log_warn(
|
|
452
|
+
'Topology now has no servers - this is likely a misconfiguration of the cluster and/or the application'
|
|
453
|
+
)
|
|
458
454
|
end
|
|
459
455
|
|
|
460
456
|
def publish_description_change_event
|
|
@@ -464,9 +460,7 @@ class Mongo::Cluster
|
|
|
464
460
|
# method is called at the end of SDAM flow as part of "commit changes"
|
|
465
461
|
# step, server description change is incorporated into the topology
|
|
466
462
|
# change.
|
|
467
|
-
unless @server_description_changed || topology_effectively_changed?
|
|
468
|
-
return
|
|
469
|
-
end
|
|
463
|
+
return unless @server_description_changed || topology_effectively_changed?
|
|
470
464
|
|
|
471
465
|
# updated_desc here may not be the description we received from
|
|
472
466
|
# the server - in case of a stale primary, the server reported itself
|
|
@@ -483,9 +477,7 @@ class Mongo::Cluster
|
|
|
483
477
|
# previous description. This allows this method to be called multiple
|
|
484
478
|
# times in the flow when the events should be published, without
|
|
485
479
|
# worrying about whether there are any unpublished changes.
|
|
486
|
-
if updated_desc.
|
|
487
|
-
return
|
|
488
|
-
end
|
|
480
|
+
return if updated_desc.equal?(previous_desc)
|
|
489
481
|
|
|
490
482
|
publish_sdam_event(
|
|
491
483
|
::Mongo::Monitoring::SERVER_DESCRIPTION_CHANGED,
|
|
@@ -494,7 +486,7 @@ class Mongo::Cluster
|
|
|
494
486
|
topology,
|
|
495
487
|
previous_desc,
|
|
496
488
|
updated_desc,
|
|
497
|
-
awaited: awaited
|
|
489
|
+
awaited: awaited?
|
|
498
490
|
)
|
|
499
491
|
)
|
|
500
492
|
@previous_desc = updated_desc
|
|
@@ -532,20 +524,12 @@ class Mongo::Cluster
|
|
|
532
524
|
# If a server description changed, topology description change event
|
|
533
525
|
# must be published with the previous and next topologies being of
|
|
534
526
|
# the same type, unless we already published topology change event
|
|
535
|
-
if topology_changed_event_published
|
|
536
|
-
return
|
|
537
|
-
end
|
|
527
|
+
return if topology_changed_event_published
|
|
538
528
|
|
|
539
|
-
if updated_desc.unknown? && previous_desc.unknown?
|
|
540
|
-
|
|
541
|
-
end
|
|
542
|
-
if updated_desc.object_id == previous_desc.object_id
|
|
543
|
-
return
|
|
544
|
-
end
|
|
529
|
+
return if updated_desc.unknown? && previous_desc.unknown?
|
|
530
|
+
return if updated_desc.equal?(previous_desc)
|
|
545
531
|
|
|
546
|
-
unless topology_effectively_changed?
|
|
547
|
-
return
|
|
548
|
-
end
|
|
532
|
+
return unless topology_effectively_changed?
|
|
549
533
|
|
|
550
534
|
# If we are here, there has been a change in the server descriptions
|
|
551
535
|
# in our topology, but topology class has not changed.
|
|
@@ -568,12 +552,10 @@ class Mongo::Cluster
|
|
|
568
552
|
# If the server being processed is identified as data bearing, creates the
|
|
569
553
|
# server's connection pool so it can start populating
|
|
570
554
|
def start_pool_if_data_bearing
|
|
571
|
-
return
|
|
555
|
+
return unless updated_desc.data_bearing?
|
|
572
556
|
|
|
573
557
|
servers_list.each do |server|
|
|
574
|
-
if server.address == @updated_desc.address
|
|
575
|
-
server.pool
|
|
576
|
-
end
|
|
558
|
+
server.pool if server.address == @updated_desc.address
|
|
577
559
|
end
|
|
578
560
|
end
|
|
579
561
|
|
|
@@ -582,44 +564,42 @@ class Mongo::Cluster
|
|
|
582
564
|
# invoking this method.
|
|
583
565
|
def check_if_has_primary
|
|
584
566
|
unless topology.replica_set?
|
|
585
|
-
raise ArgumentError,
|
|
567
|
+
raise ArgumentError,
|
|
568
|
+
"check_if_has_primary should only be called when topology is replica set, but it is #{topology.class.name.sub(/.*::/,
|
|
569
|
+
'')}"
|
|
586
570
|
end
|
|
587
571
|
|
|
588
572
|
primary = servers_list.detect do |server|
|
|
589
573
|
# A primary with the wrong set name is not a primary
|
|
590
574
|
server.primary? && server.description.replica_set_name == topology.replica_set_name
|
|
591
575
|
end
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
576
|
+
return if primary
|
|
577
|
+
|
|
578
|
+
@topology = Topology::ReplicaSetNoPrimary.new(
|
|
579
|
+
topology.options, topology.monitoring, self
|
|
580
|
+
)
|
|
596
581
|
end
|
|
597
582
|
|
|
598
583
|
# Whether updated_desc is for a stale primary.
|
|
599
584
|
def stale_primary?
|
|
600
585
|
if updated_desc.max_wire_version >= 17
|
|
601
|
-
if updated_desc.election_id.nil? && !topology.max_election_id.nil?
|
|
602
|
-
return true
|
|
603
|
-
end
|
|
586
|
+
return true if updated_desc.election_id.nil? && !topology.max_election_id.nil?
|
|
604
587
|
if updated_desc.election_id && topology.max_election_id && updated_desc.election_id < topology.max_election_id
|
|
605
588
|
return true
|
|
606
589
|
end
|
|
590
|
+
|
|
607
591
|
if updated_desc.election_id == topology.max_election_id
|
|
608
|
-
if updated_desc.set_version.nil? && !topology.max_set_version.nil?
|
|
609
|
-
return true
|
|
610
|
-
end
|
|
592
|
+
return true if updated_desc.set_version.nil? && !topology.max_set_version.nil?
|
|
611
593
|
if updated_desc.set_version && topology.max_set_version && updated_desc.set_version < topology.max_set_version
|
|
612
594
|
return true
|
|
613
595
|
end
|
|
614
596
|
end
|
|
615
|
-
|
|
616
|
-
if
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
return true
|
|
622
|
-
end
|
|
597
|
+
elsif updated_desc.election_id && updated_desc.set_version
|
|
598
|
+
if topology.max_set_version && topology.max_election_id &&
|
|
599
|
+
(updated_desc.set_version < topology.max_set_version ||
|
|
600
|
+
(updated_desc.set_version == topology.max_set_version &&
|
|
601
|
+
updated_desc.election_id < topology.max_election_id))
|
|
602
|
+
return true
|
|
623
603
|
end
|
|
624
604
|
end
|
|
625
605
|
false
|
|
@@ -642,25 +622,22 @@ class Mongo::Cluster
|
|
|
642
622
|
# descriptions at the beginning of SDAM flow and compare them to the
|
|
643
623
|
# current ones.
|
|
644
624
|
def topology_effectively_changed?
|
|
645
|
-
unless topology.equal?(cluster.topology)
|
|
646
|
-
return true
|
|
647
|
-
end
|
|
625
|
+
return true unless topology.equal?(cluster.topology)
|
|
648
626
|
|
|
649
627
|
server_descriptions = servers_list.map do |server|
|
|
650
|
-
[server.address.to_s, server.description]
|
|
628
|
+
[ server.address.to_s, server.description ]
|
|
651
629
|
end
|
|
652
630
|
|
|
653
631
|
@previous_server_descriptions != server_descriptions
|
|
654
632
|
end
|
|
655
633
|
|
|
656
634
|
def verify_invariants
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
end
|
|
635
|
+
return unless Mongo::Lint.enabled?
|
|
636
|
+
return unless cluster.topology.single?
|
|
637
|
+
return unless cluster.servers_list.length > 1
|
|
638
|
+
|
|
639
|
+
raise Mongo::Error::LintError,
|
|
640
|
+
"Trying to create a single topology with multiple servers: #{cluster.servers_list}"
|
|
664
641
|
end
|
|
665
642
|
end
|
|
666
643
|
end
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
# Copyright (C) 2018-2020 MongoDB Inc.
|
|
5
4
|
#
|
|
@@ -18,7 +17,6 @@
|
|
|
18
17
|
module Mongo
|
|
19
18
|
class Cluster
|
|
20
19
|
module Topology
|
|
21
|
-
|
|
22
20
|
# Defines behavior common to all topologies.
|
|
23
21
|
#
|
|
24
22
|
# @since 2.7.0
|
|
@@ -63,7 +61,7 @@ module Mongo
|
|
|
63
61
|
# topology creation. If server description change later, a
|
|
64
62
|
# new topology instance should be created.
|
|
65
63
|
@server_descriptions = {}
|
|
66
|
-
|
|
64
|
+
cluster.servers_list.each do |server|
|
|
67
65
|
@server_descriptions[server.address.to_s] = server.description
|
|
68
66
|
end
|
|
69
67
|
|
|
@@ -71,10 +69,8 @@ module Mongo
|
|
|
71
69
|
@compatible = true
|
|
72
70
|
else
|
|
73
71
|
begin
|
|
74
|
-
server_descriptions.each do |
|
|
75
|
-
unless desc.unknown?
|
|
76
|
-
desc.features.check_driver_support!
|
|
77
|
-
end
|
|
72
|
+
server_descriptions.each do |_address_str, desc|
|
|
73
|
+
desc.features.check_driver_support! unless desc.unknown?
|
|
78
74
|
end
|
|
79
75
|
rescue Error::UnsupportedFeatures => e
|
|
80
76
|
@compatible = false
|
|
@@ -85,20 +81,21 @@ module Mongo
|
|
|
85
81
|
end
|
|
86
82
|
|
|
87
83
|
@have_data_bearing_servers = false
|
|
88
|
-
@logical_session_timeout = server_descriptions.inject(nil) do |min, (
|
|
84
|
+
@logical_session_timeout = server_descriptions.inject(nil) do |min, (_address_str, desc)|
|
|
89
85
|
# LST is only read from data-bearing servers
|
|
90
86
|
if desc.data_bearing?
|
|
91
87
|
@have_data_bearing_servers = true
|
|
92
88
|
break unless timeout = desc.logical_session_timeout
|
|
93
|
-
|
|
89
|
+
|
|
90
|
+
[ timeout, min || timeout ].min
|
|
94
91
|
else
|
|
95
92
|
min
|
|
96
93
|
end
|
|
97
94
|
end
|
|
98
95
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
96
|
+
return unless Mongo::Lint.enabled?
|
|
97
|
+
|
|
98
|
+
freeze
|
|
102
99
|
end
|
|
103
100
|
|
|
104
101
|
# @return [ Hash ] options The options.
|
|
@@ -192,8 +189,8 @@ module Mongo
|
|
|
192
189
|
# @api private
|
|
193
190
|
def new_max_election_id(description)
|
|
194
191
|
if description.election_id &&
|
|
195
|
-
|
|
196
|
-
|
|
192
|
+
(max_election_id.nil? ||
|
|
193
|
+
description.election_id > max_election_id)
|
|
197
194
|
description.election_id
|
|
198
195
|
else
|
|
199
196
|
max_election_id
|
|
@@ -203,8 +200,8 @@ module Mongo
|
|
|
203
200
|
# @api private
|
|
204
201
|
def new_max_set_version(description)
|
|
205
202
|
if description.set_version &&
|
|
206
|
-
|
|
207
|
-
|
|
203
|
+
(max_set_version.nil? ||
|
|
204
|
+
description.set_version > max_set_version)
|
|
208
205
|
description.set_version
|
|
209
206
|
else
|
|
210
207
|
max_set_version
|
|
@@ -222,7 +219,7 @@ module Mongo
|
|
|
222
219
|
# @api private
|
|
223
220
|
def server_hosts_match_any?(patterns)
|
|
224
221
|
server_descriptions.any? do |addr_spec, _desc|
|
|
225
|
-
addr, _port = addr_spec.split(
|
|
222
|
+
addr, _port = addr_spec.split(':')
|
|
226
223
|
patterns.any? { |pattern| addr.end_with?(pattern) }
|
|
227
224
|
end
|
|
228
225
|
end
|
|
@@ -232,7 +229,7 @@ module Mongo
|
|
|
232
229
|
# Validates and/or transforms options as necessary for the topology.
|
|
233
230
|
#
|
|
234
231
|
# @return [ Hash ] New options
|
|
235
|
-
def validate_options(options,
|
|
232
|
+
def validate_options(options, _cluster)
|
|
236
233
|
options
|
|
237
234
|
end
|
|
238
235
|
end
|