mongo 2.23.0 → 2.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/mongo_console +0 -1
- data/lib/mongo/active_support.rb +1 -2
- data/lib/mongo/address/ipv4.rb +3 -6
- data/lib/mongo/address/ipv6.rb +6 -10
- data/lib/mongo/address/unix.rb +1 -4
- data/lib/mongo/address/validator.rb +16 -28
- data/lib/mongo/address.rb +30 -40
- data/lib/mongo/auth/aws/conversation.rb +6 -10
- data/lib/mongo/auth/aws/credentials.rb +0 -1
- data/lib/mongo/auth/aws/credentials_cache.rb +0 -1
- data/lib/mongo/auth/aws/credentials_retriever.rb +45 -59
- data/lib/mongo/auth/aws/request.rb +20 -35
- data/lib/mongo/auth/aws.rb +1 -2
- data/lib/mongo/auth/base.rb +20 -29
- data/lib/mongo/auth/conversation_base.rb +14 -18
- data/lib/mongo/auth/cr/conversation.rb +0 -3
- data/lib/mongo/auth/cr.rb +1 -4
- data/lib/mongo/auth/credential_cache.rb +0 -2
- data/lib/mongo/auth/gssapi/conversation.rb +3 -8
- data/lib/mongo/auth/gssapi.rb +1 -4
- data/lib/mongo/auth/ldap/conversation.rb +0 -3
- data/lib/mongo/auth/ldap.rb +1 -4
- data/lib/mongo/auth/roles.rb +16 -19
- data/lib/mongo/auth/sasl_conversation_base.rb +7 -11
- data/lib/mongo/auth/scram/conversation.rb +2 -5
- data/lib/mongo/auth/scram.rb +5 -10
- data/lib/mongo/auth/scram256/conversation.rb +2 -5
- data/lib/mongo/auth/scram256.rb +1 -3
- data/lib/mongo/auth/scram_conversation_base.rb +18 -24
- data/lib/mongo/auth/stringprep/profiles/sasl.rb +17 -18
- data/lib/mongo/auth/stringprep/tables.rb +2209 -2210
- data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +36 -38
- data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +1142 -1150
- data/lib/mongo/auth/stringprep.rb +9 -12
- data/lib/mongo/auth/user/view.rb +3 -5
- data/lib/mongo/auth/user.rb +14 -24
- data/lib/mongo/auth/x509/conversation.rb +0 -3
- data/lib/mongo/auth/x509.rb +7 -9
- data/lib/mongo/auth.rb +18 -30
- data/lib/mongo/background_thread.rb +9 -17
- data/lib/mongo/bson.rb +0 -2
- data/lib/mongo/bulk_write/combineable.rb +0 -3
- data/lib/mongo/bulk_write/ordered_combiner.rb +1 -3
- data/lib/mongo/bulk_write/result.rb +11 -16
- data/lib/mongo/bulk_write/result_combiner.rb +9 -12
- data/lib/mongo/bulk_write/transformable.rb +16 -19
- data/lib/mongo/bulk_write/unordered_combiner.rb +1 -3
- data/lib/mongo/bulk_write/validatable.rb +11 -18
- data/lib/mongo/bulk_write.rb +76 -91
- data/lib/mongo/caching_cursor.rb +2 -7
- data/lib/mongo/client.rb +230 -275
- data/lib/mongo/client_encryption.rb +4 -5
- data/lib/mongo/cluster/periodic_executor.rb +2 -5
- data/lib/mongo/cluster/reapers/cursor_reaper.rb +21 -29
- data/lib/mongo/cluster/reapers/socket_reaper.rb +1 -6
- data/lib/mongo/cluster/sdam_flow.rb +136 -159
- data/lib/mongo/cluster/topology/base.rb +15 -18
- data/lib/mongo/cluster/topology/load_balanced.rb +24 -14
- data/lib/mongo/cluster/topology/no_replica_set_options.rb +3 -6
- data/lib/mongo/cluster/topology/replica_set_no_primary.rb +20 -23
- data/lib/mongo/cluster/topology/replica_set_with_primary.rb +0 -2
- data/lib/mongo/cluster/topology/sharded.rb +19 -9
- data/lib/mongo/cluster/topology/single.rb +24 -14
- data/lib/mongo/cluster/topology/unknown.rb +20 -10
- data/lib/mongo/cluster/topology.rb +29 -25
- data/lib/mongo/cluster.rb +148 -183
- data/lib/mongo/cluster_time.rb +14 -31
- data/lib/mongo/collection/helpers.rb +5 -8
- data/lib/mongo/collection/view/aggregation.rb +5 -10
- data/lib/mongo/collection/view/builder/aggregation.rb +6 -9
- data/lib/mongo/collection/view/builder/map_reduce.rb +18 -17
- data/lib/mongo/collection/view/builder.rb +0 -1
- data/lib/mongo/collection/view/change_stream/retryable.rb +3 -8
- data/lib/mongo/collection/view/change_stream.rb +59 -58
- data/lib/mongo/collection/view/explainable.rb +11 -20
- data/lib/mongo/collection/view/immutable.rb +1 -3
- data/lib/mongo/collection/view/iterable.rb +35 -28
- data/lib/mongo/collection/view/map_reduce.rb +20 -25
- data/lib/mongo/collection/view/readable.rb +50 -57
- data/lib/mongo/collection/view/writable.rb +56 -72
- data/lib/mongo/collection/view.rb +9 -8
- data/lib/mongo/collection.rb +63 -76
- data/lib/mongo/condition_variable.rb +4 -4
- data/lib/mongo/config/options.rb +0 -3
- data/lib/mongo/config/validators/option.rb +3 -5
- data/lib/mongo/config.rb +2 -4
- data/lib/mongo/crypt/auto_decryption_context.rb +0 -3
- data/lib/mongo/crypt/auto_encrypter.rb +34 -43
- data/lib/mongo/crypt/auto_encryption_context.rb +0 -3
- data/lib/mongo/crypt/binary.rb +5 -9
- data/lib/mongo/crypt/binding.rb +149 -155
- data/lib/mongo/crypt/context.rb +10 -17
- data/lib/mongo/crypt/data_key_context.rb +2 -7
- data/lib/mongo/crypt/encryption_io.rb +29 -39
- data/lib/mongo/crypt/explicit_decryption_context.rb +0 -3
- data/lib/mongo/crypt/explicit_encrypter.rb +1 -1
- data/lib/mongo/crypt/explicit_encryption_context.rb +19 -30
- data/lib/mongo/crypt/explicit_encryption_expression_context.rb +0 -2
- data/lib/mongo/crypt/handle.rb +42 -48
- data/lib/mongo/crypt/hooks.rb +12 -15
- data/lib/mongo/crypt/kms/aws/credentials.rb +12 -16
- data/lib/mongo/crypt/kms/aws/master_document.rb +6 -9
- data/lib/mongo/crypt/kms/aws.rb +0 -2
- data/lib/mongo/crypt/kms/azure/credentials_retriever.rb +2 -7
- data/lib/mongo/crypt/kms/azure/master_document.rb +15 -19
- data/lib/mongo/crypt/kms/azure.rb +0 -1
- data/lib/mongo/crypt/kms/credentials.rb +13 -27
- data/lib/mongo/crypt/kms/gcp/credentials.rb +12 -14
- data/lib/mongo/crypt/kms/gcp/credentials_retriever.rb +7 -9
- data/lib/mongo/crypt/kms/gcp/master_document.rb +12 -16
- data/lib/mongo/crypt/kms/gcp.rb +0 -2
- data/lib/mongo/crypt/kms/kmip/credentials.rb +7 -8
- data/lib/mongo/crypt/kms/kmip/master_document.rb +3 -5
- data/lib/mongo/crypt/kms/kmip.rb +0 -1
- data/lib/mongo/crypt/kms/local/credentials.rb +7 -8
- data/lib/mongo/crypt/kms/local/master_document.rb +2 -6
- data/lib/mongo/crypt/kms/local.rb +0 -1
- data/lib/mongo/crypt/kms/master_key_document.rb +11 -15
- data/lib/mongo/crypt/kms.rb +14 -16
- data/lib/mongo/crypt/kms_context.rb +0 -2
- data/lib/mongo/crypt/rewrap_many_data_key_context.rb +2 -7
- data/lib/mongo/crypt/rewrap_many_data_key_result.rb +2 -4
- data/lib/mongo/crypt/status.rb +12 -14
- data/lib/mongo/crypt.rb +0 -1
- data/lib/mongo/csot_timeout_holder.rb +3 -2
- data/lib/mongo/cursor/kill_spec.rb +7 -10
- data/lib/mongo/cursor.rb +74 -64
- data/lib/mongo/cursor_host.rb +8 -10
- data/lib/mongo/database/view.rb +16 -37
- data/lib/mongo/database.rb +52 -56
- data/lib/mongo/dbref.rb +0 -1
- data/lib/mongo/distinguishing_semaphore.rb +0 -1
- data/lib/mongo/error/auth_error.rb +0 -2
- data/lib/mongo/error/bad_load_balancer_target.rb +0 -2
- data/lib/mongo/error/bulk_write_error.rb +7 -10
- data/lib/mongo/error/change_stream_resumable.rb +0 -2
- data/lib/mongo/error/client_closed.rb +0 -2
- data/lib/mongo/error/closed_stream.rb +1 -4
- data/lib/mongo/error/connection_check_out_timeout.rb +3 -6
- data/lib/mongo/error/connection_perished.rb +0 -2
- data/lib/mongo/error/connection_unavailable.rb +0 -2
- data/lib/mongo/error/credential_check_error.rb +0 -2
- data/lib/mongo/error/crypt_error.rb +0 -2
- data/lib/mongo/error/extra_file_chunk.rb +1 -4
- data/lib/mongo/error/failed_string_prep_validation.rb +5 -6
- data/lib/mongo/error/file_not_found.rb +0 -3
- data/lib/mongo/error/handshake_error.rb +0 -2
- data/lib/mongo/error/insufficient_iteration_count.rb +1 -4
- data/lib/mongo/error/internal_driver_error.rb +0 -2
- data/lib/mongo/error/invalid_address.rb +0 -2
- data/lib/mongo/error/invalid_application_name.rb +0 -3
- data/lib/mongo/error/invalid_bulk_operation.rb +1 -4
- data/lib/mongo/error/invalid_bulk_operation_type.rb +1 -4
- data/lib/mongo/error/invalid_collection_name.rb +1 -4
- data/lib/mongo/error/invalid_config_option.rb +0 -3
- data/lib/mongo/error/invalid_cursor_operation.rb +0 -2
- data/lib/mongo/error/invalid_database_name.rb +1 -4
- data/lib/mongo/error/invalid_document.rb +1 -4
- data/lib/mongo/error/invalid_file.rb +0 -3
- data/lib/mongo/error/invalid_file_revision.rb +0 -3
- data/lib/mongo/error/invalid_min_pool_size.rb +0 -3
- data/lib/mongo/error/invalid_nonce.rb +0 -3
- data/lib/mongo/error/invalid_read_concern.rb +2 -4
- data/lib/mongo/error/invalid_read_option.rb +0 -3
- data/lib/mongo/error/invalid_replacement_document.rb +2 -5
- data/lib/mongo/error/invalid_server_auth_host.rb +0 -2
- data/lib/mongo/error/invalid_server_auth_response.rb +0 -2
- data/lib/mongo/error/invalid_server_preference.rb +7 -16
- data/lib/mongo/error/invalid_session.rb +1 -4
- data/lib/mongo/error/invalid_signature.rb +0 -3
- data/lib/mongo/error/invalid_transaction_operation.rb +5 -8
- data/lib/mongo/error/invalid_txt_record.rb +0 -2
- data/lib/mongo/error/invalid_update_document.rb +2 -5
- data/lib/mongo/error/invalid_uri.rb +1 -4
- data/lib/mongo/error/invalid_write_concern.rb +2 -5
- data/lib/mongo/error/kms_error.rb +0 -2
- data/lib/mongo/error/labelable.rb +0 -3
- data/lib/mongo/error/lint_error.rb +0 -2
- data/lib/mongo/error/max_bson_size.rb +8 -11
- data/lib/mongo/error/max_message_size.rb +2 -5
- data/lib/mongo/error/mismatched_domain.rb +0 -2
- data/lib/mongo/error/missing_connection.rb +0 -2
- data/lib/mongo/error/missing_file_chunk.rb +0 -3
- data/lib/mongo/error/missing_password.rb +0 -2
- data/lib/mongo/error/missing_resume_token.rb +1 -4
- data/lib/mongo/error/missing_scram_server_signature.rb +2 -4
- data/lib/mongo/error/missing_service_id.rb +0 -2
- data/lib/mongo/error/mongocryptd_spawn_error.rb +0 -2
- data/lib/mongo/error/multi_index_drop.rb +0 -3
- data/lib/mongo/error/need_primary_server.rb +0 -2
- data/lib/mongo/error/no_server_available.rb +3 -8
- data/lib/mongo/error/no_service_connection_available.rb +1 -3
- data/lib/mongo/error/no_srv_records.rb +0 -2
- data/lib/mongo/error/notable.rb +8 -16
- data/lib/mongo/error/operation_failure.rb +22 -35
- data/lib/mongo/error/parser.rb +33 -75
- data/lib/mongo/error/pool_cleared_error.rb +1 -3
- data/lib/mongo/error/pool_closed_error.rb +0 -3
- data/lib/mongo/error/pool_error.rb +0 -3
- data/lib/mongo/error/pool_paused_error.rb +0 -2
- data/lib/mongo/error/raise_original_error.rb +1 -3
- data/lib/mongo/error/read_write_retryable.rb +14 -17
- data/lib/mongo/error/sdam_error_detection.rb +3 -5
- data/lib/mongo/error/server_api_conflict.rb +0 -2
- data/lib/mongo/error/server_certificate_revoked.rb +0 -2
- data/lib/mongo/error/server_not_usable.rb +0 -2
- data/lib/mongo/error/session_ended.rb +1 -3
- data/lib/mongo/error/session_not_materialized.rb +1 -3
- data/lib/mongo/error/sessions_not_supported.rb +1 -4
- data/lib/mongo/error/snapshot_session_invalid_server_version.rb +1 -4
- data/lib/mongo/error/snapshot_session_transaction_prohibited.rb +1 -4
- data/lib/mongo/error/socket_error.rb +0 -2
- data/lib/mongo/error/socket_timeout_error.rb +0 -2
- data/lib/mongo/error/transactions_not_supported.rb +3 -6
- data/lib/mongo/error/unchangeable_collection_option.rb +1 -4
- data/lib/mongo/error/unexpected_chunk_length.rb +0 -3
- data/lib/mongo/error/unexpected_response.rb +1 -4
- data/lib/mongo/error/unknown_payload_type.rb +0 -3
- data/lib/mongo/error/unmet_dependency.rb +0 -2
- data/lib/mongo/error/unsupported_array_filters.rb +3 -24
- data/lib/mongo/error/unsupported_collation.rb +3 -24
- data/lib/mongo/error/unsupported_features.rb +0 -2
- data/lib/mongo/error/unsupported_message_type.rb +0 -2
- data/lib/mongo/error/unsupported_option.rb +19 -21
- data/lib/mongo/error/write_retryable.rb +0 -2
- data/lib/mongo/error.rb +10 -24
- data/lib/mongo/event/base.rb +0 -2
- data/lib/mongo/event/listeners.rb +0 -3
- data/lib/mongo/event/publisher.rb +0 -3
- data/lib/mongo/event/subscriber.rb +0 -4
- data/lib/mongo/event.rb +4 -6
- data/lib/mongo/grid/file/chunk.rb +7 -10
- data/lib/mongo/grid/file/info.rb +20 -24
- data/lib/mongo/grid/file.rb +7 -8
- data/lib/mongo/grid/fs_bucket.rb +40 -48
- data/lib/mongo/grid/stream/read.rb +25 -35
- data/lib/mongo/grid/stream/write.rb +17 -22
- data/lib/mongo/grid/stream.rb +2 -4
- data/lib/mongo/grid.rb +0 -1
- data/lib/mongo/id.rb +0 -1
- data/lib/mongo/index/view.rb +49 -48
- data/lib/mongo/index.rb +7 -10
- data/lib/mongo/lint.rb +31 -37
- data/lib/mongo/loggable.rb +5 -8
- data/lib/mongo/logger.rb +1 -7
- data/lib/mongo/monitoring/cmap_log_subscriber.rb +0 -2
- data/lib/mongo/monitoring/command_log_subscriber.rb +25 -33
- data/lib/mongo/monitoring/event/cmap/base.rb +0 -2
- data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +1 -4
- data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +0 -3
- data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +1 -4
- data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +2 -5
- data/lib/mongo/monitoring/event/cmap/connection_closed.rb +1 -4
- data/lib/mongo/monitoring/event/cmap/connection_created.rb +1 -4
- data/lib/mongo/monitoring/event/cmap/connection_ready.rb +1 -4
- data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +0 -3
- data/lib/mongo/monitoring/event/cmap/pool_closed.rb +1 -4
- data/lib/mongo/monitoring/event/cmap/pool_created.rb +1 -4
- data/lib/mongo/monitoring/event/cmap/pool_ready.rb +1 -4
- data/lib/mongo/monitoring/event/cmap.rb +0 -1
- data/lib/mongo/monitoring/event/command_failed.rb +5 -9
- data/lib/mongo/monitoring/event/command_started.rb +8 -12
- data/lib/mongo/monitoring/event/command_succeeded.rb +7 -15
- data/lib/mongo/monitoring/event/secure.rb +15 -20
- data/lib/mongo/monitoring/event/server_closed.rb +1 -4
- data/lib/mongo/monitoring/event/server_description_changed.rb +4 -8
- data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +5 -10
- data/lib/mongo/monitoring/event/server_heartbeat_started.rb +1 -4
- data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +3 -8
- data/lib/mongo/monitoring/event/server_opening.rb +1 -4
- data/lib/mongo/monitoring/event/topology_changed.rb +2 -5
- data/lib/mongo/monitoring/event/topology_closed.rb +1 -4
- data/lib/mongo/monitoring/event/topology_opening.rb +1 -4
- data/lib/mongo/monitoring/event.rb +0 -1
- data/lib/mongo/monitoring/publishable.rb +20 -30
- data/lib/mongo/monitoring/sdam_log_subscriber.rb +0 -2
- data/lib/mongo/monitoring/server_closed_log_subscriber.rb +0 -3
- data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +0 -3
- data/lib/mongo/monitoring/server_opening_log_subscriber.rb +0 -3
- data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +5 -8
- data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +0 -3
- data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +0 -3
- data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +1 -3
- data/lib/mongo/monitoring.rb +38 -39
- data/lib/mongo/operation/aggregate/op_msg.rb +0 -2
- data/lib/mongo/operation/aggregate/result.rb +3 -6
- data/lib/mongo/operation/aggregate.rb +0 -2
- data/lib/mongo/operation/collections_info/result.rb +0 -3
- data/lib/mongo/operation/collections_info.rb +0 -2
- data/lib/mongo/operation/command/op_msg.rb +1 -4
- data/lib/mongo/operation/command.rb +0 -2
- data/lib/mongo/operation/context.rb +13 -16
- data/lib/mongo/operation/count/op_msg.rb +2 -4
- data/lib/mongo/operation/count.rb +0 -2
- data/lib/mongo/operation/create/op_msg.rb +2 -5
- data/lib/mongo/operation/create.rb +0 -2
- data/lib/mongo/operation/create_index/op_msg.rb +3 -7
- data/lib/mongo/operation/create_index.rb +0 -2
- data/lib/mongo/operation/create_user/op_msg.rb +2 -4
- data/lib/mongo/operation/create_user.rb +0 -2
- data/lib/mongo/operation/delete/bulk_result.rb +2 -3
- data/lib/mongo/operation/delete/op_msg.rb +3 -10
- data/lib/mongo/operation/delete/result.rb +0 -3
- data/lib/mongo/operation/delete.rb +1 -5
- data/lib/mongo/operation/distinct/op_msg.rb +2 -5
- data/lib/mongo/operation/distinct.rb +0 -2
- data/lib/mongo/operation/drop/op_msg.rb +0 -2
- data/lib/mongo/operation/drop.rb +0 -2
- data/lib/mongo/operation/drop_database/op_msg.rb +0 -2
- data/lib/mongo/operation/drop_database.rb +0 -2
- data/lib/mongo/operation/drop_index/op_msg.rb +4 -6
- data/lib/mongo/operation/drop_index.rb +0 -2
- data/lib/mongo/operation/explain/op_msg.rb +0 -2
- data/lib/mongo/operation/explain/result.rb +0 -3
- data/lib/mongo/operation/explain.rb +0 -2
- data/lib/mongo/operation/find/builder/command.rb +4 -12
- data/lib/mongo/operation/find/builder/flags.rb +9 -15
- data/lib/mongo/operation/find/builder/modifiers.rb +1 -4
- data/lib/mongo/operation/find/builder.rb +0 -1
- data/lib/mongo/operation/find/op_msg.rb +4 -12
- data/lib/mongo/operation/find/result.rb +0 -3
- data/lib/mongo/operation/find.rb +0 -2
- data/lib/mongo/operation/get_more/command_builder.rb +1 -6
- data/lib/mongo/operation/get_more/op_msg.rb +10 -4
- data/lib/mongo/operation/get_more/result.rb +0 -3
- data/lib/mongo/operation/get_more.rb +0 -2
- data/lib/mongo/operation/indexes/op_msg.rb +0 -2
- data/lib/mongo/operation/indexes/result.rb +1 -5
- data/lib/mongo/operation/indexes.rb +0 -2
- data/lib/mongo/operation/insert/bulk_result.rb +2 -6
- data/lib/mongo/operation/insert/op_msg.rb +2 -4
- data/lib/mongo/operation/insert/result.rb +0 -3
- data/lib/mongo/operation/insert.rb +2 -5
- data/lib/mongo/operation/kill_cursors/command_builder.rb +0 -3
- data/lib/mongo/operation/kill_cursors/op_msg.rb +1 -3
- data/lib/mongo/operation/kill_cursors.rb +0 -2
- data/lib/mongo/operation/list_collections/op_msg.rb +4 -6
- data/lib/mongo/operation/list_collections/result.rb +1 -4
- data/lib/mongo/operation/list_collections.rb +0 -2
- data/lib/mongo/operation/map_reduce/op_msg.rb +0 -2
- data/lib/mongo/operation/map_reduce/result.rb +3 -6
- data/lib/mongo/operation/map_reduce.rb +0 -2
- data/lib/mongo/operation/op_msg_base.rb +0 -1
- data/lib/mongo/operation/parallel_scan/op_msg.rb +4 -5
- data/lib/mongo/operation/parallel_scan/result.rb +2 -5
- data/lib/mongo/operation/parallel_scan.rb +0 -2
- data/lib/mongo/operation/remove_user/op_msg.rb +2 -4
- data/lib/mongo/operation/remove_user.rb +0 -2
- data/lib/mongo/operation/result.rb +38 -48
- data/lib/mongo/operation/shared/bypass_document_validation.rb +3 -7
- data/lib/mongo/operation/shared/causal_consistency_supported.rb +0 -3
- data/lib/mongo/operation/shared/executable.rb +19 -28
- data/lib/mongo/operation/shared/executable_no_validate.rb +0 -3
- data/lib/mongo/operation/shared/executable_transaction_label.rb +0 -2
- data/lib/mongo/operation/shared/idable.rb +3 -6
- data/lib/mongo/operation/shared/limited.rb +0 -3
- data/lib/mongo/operation/shared/object_id_generator.rb +0 -3
- data/lib/mongo/operation/shared/op_msg_executable.rb +0 -2
- data/lib/mongo/operation/shared/polymorphic_lookup.rb +0 -2
- data/lib/mongo/operation/shared/polymorphic_result.rb +2 -4
- data/lib/mongo/operation/shared/read_preference_supported.rb +10 -15
- data/lib/mongo/operation/shared/response_handling.rb +13 -26
- data/lib/mongo/operation/shared/result/aggregatable.rb +12 -13
- data/lib/mongo/operation/shared/sessions_supported.rb +87 -99
- data/lib/mongo/operation/shared/specifiable.rb +32 -58
- data/lib/mongo/operation/shared/write.rb +12 -17
- data/lib/mongo/operation/shared/write_concern_supported.rb +4 -7
- data/lib/mongo/operation/update/bulk_result.rb +13 -17
- data/lib/mongo/operation/update/op_msg.rb +2 -5
- data/lib/mongo/operation/update/result.rb +5 -5
- data/lib/mongo/operation/update.rb +1 -5
- data/lib/mongo/operation/update_user/op_msg.rb +2 -4
- data/lib/mongo/operation/update_user.rb +0 -2
- data/lib/mongo/operation/users_info/op_msg.rb +2 -4
- data/lib/mongo/operation/users_info/result.rb +1 -4
- data/lib/mongo/operation/users_info.rb +0 -2
- data/lib/mongo/operation/write_command/op_msg.rb +2 -10
- data/lib/mongo/operation/write_command.rb +0 -2
- data/lib/mongo/operation.rb +9 -14
- data/lib/mongo/options/mapper.rb +8 -15
- data/lib/mongo/options/redacted.rb +7 -9
- data/lib/mongo/options.rb +0 -1
- data/lib/mongo/protocol/bit_vector.rb +3 -5
- data/lib/mongo/protocol/caching_hash.rb +2 -7
- data/lib/mongo/protocol/compressed.rb +5 -10
- data/lib/mongo/protocol/get_more.rb +2 -8
- data/lib/mongo/protocol/kill_cursors.rb +2 -8
- data/lib/mongo/protocol/message.rb +103 -105
- data/lib/mongo/protocol/msg.rb +48 -63
- data/lib/mongo/protocol/query.rb +32 -41
- data/lib/mongo/protocol/registry.rb +2 -5
- data/lib/mongo/protocol/reply.rb +10 -16
- data/lib/mongo/protocol/serializers.rb +41 -59
- data/lib/mongo/protocol.rb +0 -1
- data/lib/mongo/query_cache.rb +7 -15
- data/lib/mongo/retryable/backpressure.rb +31 -0
- data/lib/mongo/retryable/base_worker.rb +39 -13
- data/lib/mongo/retryable/read_worker.rb +77 -21
- data/lib/mongo/retryable/retry_policy.rb +59 -0
- data/lib/mongo/retryable/write_worker.rb +155 -56
- data/lib/mongo/retryable.rb +70 -9
- data/lib/mongo/search_index/view.rb +1 -1
- data/lib/mongo/semaphore.rb +0 -1
- data/lib/mongo/server/app_metadata/environment.rb +3 -3
- data/lib/mongo/server/app_metadata.rb +4 -5
- data/lib/mongo/server/connection.rb +61 -61
- data/lib/mongo/server/connection_base.rb +43 -53
- data/lib/mongo/server/connection_common.rb +41 -64
- data/lib/mongo/server/connection_pool/generation_manager.rb +6 -11
- data/lib/mongo/server/connection_pool/populator.rb +1 -4
- data/lib/mongo/server/connection_pool.rb +195 -167
- data/lib/mongo/server/description/features.rb +23 -60
- data/lib/mongo/server/description/load_balancer.rb +0 -2
- data/lib/mongo/server/description.rb +117 -138
- data/lib/mongo/server/monitor/app_metadata.rb +3 -4
- data/lib/mongo/server/monitor/connection.rb +28 -35
- data/lib/mongo/server/monitor.rb +65 -60
- data/lib/mongo/server/pending_connection.rb +70 -71
- data/lib/mongo/server/push_monitor/connection.rb +0 -3
- data/lib/mongo/server/push_monitor.rb +21 -29
- data/lib/mongo/server/round_trip_time_calculator.rb +11 -17
- data/lib/mongo/server.rb +60 -93
- data/lib/mongo/server_selector/base.rb +133 -157
- data/lib/mongo/server_selector/nearest.rb +2 -5
- data/lib/mongo/server_selector/primary.rb +1 -5
- data/lib/mongo/server_selector/primary_preferred.rb +2 -6
- data/lib/mongo/server_selector/secondary.rb +2 -6
- data/lib/mongo/server_selector/secondary_preferred.rb +1 -5
- data/lib/mongo/server_selector.rb +3 -4
- data/lib/mongo/session/server_session.rb +6 -7
- data/lib/mongo/session/session_pool.rb +20 -34
- data/lib/mongo/session.rb +287 -188
- data/lib/mongo/socket/ocsp_cache.rb +8 -13
- data/lib/mongo/socket/ocsp_verifier.rb +69 -70
- data/lib/mongo/socket/ssl.rb +44 -43
- data/lib/mongo/socket/tcp.rb +5 -8
- data/lib/mongo/socket/unix.rb +0 -4
- data/lib/mongo/socket.rb +80 -102
- data/lib/mongo/srv/monitor.rb +6 -11
- data/lib/mongo/srv/resolver.rb +15 -24
- data/lib/mongo/srv/result.rb +18 -24
- data/lib/mongo/srv.rb +0 -1
- data/lib/mongo/timeout.rb +4 -11
- data/lib/mongo/topology_version.rb +8 -13
- data/lib/mongo/tracing/open_telemetry/command_tracer.rb +1 -1
- data/lib/mongo/tracing/open_telemetry/operation_tracer.rb +1 -1
- data/lib/mongo/tracing/open_telemetry/tracer.rb +1 -1
- data/lib/mongo/uri/options_mapper.rb +135 -126
- data/lib/mongo/uri/srv_protocol.rb +25 -38
- data/lib/mongo/uri.rb +95 -139
- data/lib/mongo/utils.rb +5 -12
- data/lib/mongo/version.rb +1 -1
- data/lib/mongo/write_concern/acknowledged.rb +0 -2
- data/lib/mongo/write_concern/base.rb +6 -6
- data/lib/mongo/write_concern/unacknowledged.rb +0 -2
- data/lib/mongo/write_concern.rb +14 -15
- data/lib/mongo.rb +1 -3
- data/mongo.gemspec +17 -17
- metadata +5 -5
- data/lib/mongo/error/server_api_not_supported.rb +0 -27
- data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +0 -32
- data/lib/mongo/operation/shared/validatable.rb +0 -87
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
# Copyright (C) 2014-2020 MongoDB Inc.
|
|
5
4
|
#
|
|
@@ -17,7 +16,6 @@
|
|
|
17
16
|
|
|
18
17
|
module Mongo
|
|
19
18
|
class Server
|
|
20
|
-
|
|
21
19
|
# Represents a description of the server, populated by the result of the
|
|
22
20
|
# hello command.
|
|
23
21
|
#
|
|
@@ -30,163 +28,162 @@ module Mongo
|
|
|
30
28
|
#
|
|
31
29
|
# @since 2.0.0
|
|
32
30
|
class Description
|
|
33
|
-
|
|
34
31
|
# Constant for reading arbiter info from config.
|
|
35
32
|
#
|
|
36
33
|
# @since 2.0.0
|
|
37
34
|
# @deprecated
|
|
38
|
-
ARBITER = 'arbiterOnly'
|
|
35
|
+
ARBITER = 'arbiterOnly'
|
|
39
36
|
|
|
40
37
|
# Constant for reading arbiters info from config.
|
|
41
38
|
#
|
|
42
39
|
# @since 2.0.0
|
|
43
|
-
ARBITERS = 'arbiters'
|
|
40
|
+
ARBITERS = 'arbiters'
|
|
44
41
|
|
|
45
42
|
# Constant for reading hidden info from config.
|
|
46
43
|
#
|
|
47
44
|
# @since 2.0.0
|
|
48
|
-
HIDDEN = 'hidden'
|
|
45
|
+
HIDDEN = 'hidden'
|
|
49
46
|
|
|
50
47
|
# Constant for reading hosts info from config.
|
|
51
48
|
#
|
|
52
49
|
# @since 2.0.0
|
|
53
|
-
HOSTS = 'hosts'
|
|
50
|
+
HOSTS = 'hosts'
|
|
54
51
|
|
|
55
52
|
# Constant for the key for the message value.
|
|
56
53
|
#
|
|
57
54
|
# @since 2.0.0
|
|
58
55
|
# @deprecated
|
|
59
|
-
MESSAGE = 'msg'
|
|
56
|
+
MESSAGE = 'msg'
|
|
60
57
|
|
|
61
58
|
# Constant for the message that indicates a sharded cluster.
|
|
62
59
|
#
|
|
63
60
|
# @since 2.0.0
|
|
64
61
|
# @deprecated
|
|
65
|
-
MONGOS_MESSAGE = 'isdbgrid'
|
|
62
|
+
MONGOS_MESSAGE = 'isdbgrid'
|
|
66
63
|
|
|
67
64
|
# Constant for determining ghost servers.
|
|
68
65
|
#
|
|
69
66
|
# @since 2.0.0
|
|
70
67
|
# @deprecated
|
|
71
|
-
REPLICA_SET = 'isreplicaset'
|
|
68
|
+
REPLICA_SET = 'isreplicaset'
|
|
72
69
|
|
|
73
70
|
# Constant for reading max bson size info from config.
|
|
74
71
|
#
|
|
75
72
|
# @since 2.0.0
|
|
76
|
-
MAX_BSON_OBJECT_SIZE = 'maxBsonObjectSize'
|
|
73
|
+
MAX_BSON_OBJECT_SIZE = 'maxBsonObjectSize'
|
|
77
74
|
|
|
78
75
|
# Constant for reading max message size info from config.
|
|
79
76
|
#
|
|
80
77
|
# @since 2.0.0
|
|
81
|
-
MAX_MESSAGE_BYTES = 'maxMessageSizeBytes'
|
|
78
|
+
MAX_MESSAGE_BYTES = 'maxMessageSizeBytes'
|
|
82
79
|
|
|
83
80
|
# Constant for the max wire version.
|
|
84
81
|
#
|
|
85
82
|
# @since 2.0.0
|
|
86
|
-
MAX_WIRE_VERSION = 'maxWireVersion'
|
|
83
|
+
MAX_WIRE_VERSION = 'maxWireVersion'
|
|
87
84
|
|
|
88
85
|
# Constant for min wire version.
|
|
89
86
|
#
|
|
90
87
|
# @since 2.0.0
|
|
91
|
-
MIN_WIRE_VERSION = 'minWireVersion'
|
|
88
|
+
MIN_WIRE_VERSION = 'minWireVersion'
|
|
92
89
|
|
|
93
90
|
# Constant for reading max write batch size.
|
|
94
91
|
#
|
|
95
92
|
# @since 2.0.0
|
|
96
|
-
MAX_WRITE_BATCH_SIZE = 'maxWriteBatchSize'
|
|
93
|
+
MAX_WRITE_BATCH_SIZE = 'maxWriteBatchSize'
|
|
97
94
|
|
|
98
95
|
# Constant for the lastWrite subdocument.
|
|
99
96
|
#
|
|
100
97
|
# @since 2.4.0
|
|
101
|
-
LAST_WRITE = 'lastWrite'
|
|
98
|
+
LAST_WRITE = 'lastWrite'
|
|
102
99
|
|
|
103
100
|
# Constant for the lastWriteDate field in the lastWrite subdocument.
|
|
104
101
|
#
|
|
105
102
|
# @since 2.4.0
|
|
106
|
-
LAST_WRITE_DATE = 'lastWriteDate'
|
|
103
|
+
LAST_WRITE_DATE = 'lastWriteDate'
|
|
107
104
|
|
|
108
105
|
# Constant for reading the me field.
|
|
109
106
|
#
|
|
110
107
|
# @since 2.1.0
|
|
111
|
-
ME = 'me'
|
|
108
|
+
ME = 'me'
|
|
112
109
|
|
|
113
110
|
# Default max write batch size.
|
|
114
111
|
#
|
|
115
112
|
# @since 2.0.0
|
|
116
|
-
DEFAULT_MAX_WRITE_BATCH_SIZE = 1000
|
|
113
|
+
DEFAULT_MAX_WRITE_BATCH_SIZE = 1000
|
|
117
114
|
|
|
118
115
|
# The legacy wire protocol version.
|
|
119
116
|
#
|
|
120
117
|
# @since 2.0.0
|
|
121
118
|
# @deprecated Will be removed in 3.0.
|
|
122
|
-
LEGACY_WIRE_VERSION = 0
|
|
119
|
+
LEGACY_WIRE_VERSION = 0
|
|
123
120
|
|
|
124
121
|
# Constant for reading passive info from config.
|
|
125
122
|
#
|
|
126
123
|
# @since 2.0.0
|
|
127
|
-
PASSIVE = 'passive'
|
|
124
|
+
PASSIVE = 'passive'
|
|
128
125
|
|
|
129
126
|
# Constant for reading the passive server list.
|
|
130
127
|
#
|
|
131
128
|
# @since 2.0.0
|
|
132
|
-
PASSIVES = 'passives'
|
|
129
|
+
PASSIVES = 'passives'
|
|
133
130
|
|
|
134
131
|
# Constant for reading primary info from config.
|
|
135
132
|
#
|
|
136
133
|
# @since 2.0.0
|
|
137
134
|
# @deprecated
|
|
138
|
-
PRIMARY = 'ismaster'
|
|
135
|
+
PRIMARY = 'ismaster'
|
|
139
136
|
|
|
140
137
|
# Constant for reading primary host field from config.
|
|
141
138
|
#
|
|
142
139
|
# @since 2.5.0
|
|
143
|
-
PRIMARY_HOST = 'primary'
|
|
140
|
+
PRIMARY_HOST = 'primary'
|
|
144
141
|
|
|
145
142
|
# Constant for reading secondary info from config.
|
|
146
143
|
#
|
|
147
144
|
# @since 2.0.0
|
|
148
145
|
# @deprecated
|
|
149
|
-
SECONDARY = 'secondary'
|
|
146
|
+
SECONDARY = 'secondary'
|
|
150
147
|
|
|
151
148
|
# Constant for reading replica set name info from config.
|
|
152
149
|
#
|
|
153
150
|
# @since 2.0.0
|
|
154
|
-
SET_NAME = 'setName'
|
|
151
|
+
SET_NAME = 'setName'
|
|
155
152
|
|
|
156
153
|
# Constant for reading tags info from config.
|
|
157
154
|
#
|
|
158
155
|
# @since 2.0.0
|
|
159
|
-
TAGS = 'tags'
|
|
156
|
+
TAGS = 'tags'
|
|
160
157
|
|
|
161
158
|
# Constant for reading electionId info from config.
|
|
162
159
|
#
|
|
163
160
|
# @since 2.1.0
|
|
164
|
-
ELECTION_ID = 'electionId'
|
|
161
|
+
ELECTION_ID = 'electionId'
|
|
165
162
|
|
|
166
163
|
# Constant for reading setVersion info from config.
|
|
167
164
|
#
|
|
168
165
|
# @since 2.2.2
|
|
169
|
-
SET_VERSION = 'setVersion'
|
|
166
|
+
SET_VERSION = 'setVersion'
|
|
170
167
|
|
|
171
168
|
# Constant for reading localTime info from config.
|
|
172
169
|
#
|
|
173
170
|
# @since 2.1.0
|
|
174
|
-
LOCAL_TIME = 'localTime'
|
|
171
|
+
LOCAL_TIME = 'localTime'
|
|
175
172
|
|
|
176
173
|
# Constant for reading operationTime info from config.
|
|
177
174
|
#
|
|
178
175
|
# @since 2.5.0
|
|
179
|
-
OPERATION_TIME = 'operationTime'
|
|
176
|
+
OPERATION_TIME = 'operationTime'
|
|
180
177
|
|
|
181
178
|
# Constant for reading logicalSessionTimeoutMinutes info from config.
|
|
182
179
|
#
|
|
183
180
|
# @since 2.5.0
|
|
184
|
-
LOGICAL_SESSION_TIMEOUT_MINUTES = 'logicalSessionTimeoutMinutes'
|
|
181
|
+
LOGICAL_SESSION_TIMEOUT_MINUTES = 'logicalSessionTimeoutMinutes'
|
|
185
182
|
|
|
186
183
|
# Constant for reading connectionId info from config.
|
|
187
184
|
#
|
|
188
185
|
# @api private
|
|
189
|
-
CONNECTION_ID = 'connectionId'
|
|
186
|
+
CONNECTION_ID = 'connectionId'
|
|
190
187
|
|
|
191
188
|
# Fields to exclude when comparing two descriptions.
|
|
192
189
|
#
|
|
@@ -195,8 +192,7 @@ module Mongo
|
|
|
195
192
|
LAST_WRITE,
|
|
196
193
|
OPERATION_TIME,
|
|
197
194
|
Operation::CLUSTER_TIME,
|
|
198
|
-
CONNECTION_ID,
|
|
199
|
-
].freeze
|
|
195
|
+
CONNECTION_ID, ].freeze
|
|
200
196
|
|
|
201
197
|
# Instantiate the new server description from the result of the hello
|
|
202
198
|
# command or fabricate a placeholder description for Unknown and
|
|
@@ -218,9 +214,8 @@ module Mongo
|
|
|
218
214
|
#
|
|
219
215
|
# @api private
|
|
220
216
|
def initialize(address, config = {}, average_round_trip_time: nil,
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
)
|
|
217
|
+
minimum_round_trip_time: 0, load_balancer: false,
|
|
218
|
+
force_load_balancer: false)
|
|
224
219
|
@address = address
|
|
225
220
|
@config = config
|
|
226
221
|
@load_balancer = !!load_balancer
|
|
@@ -231,56 +226,55 @@ module Mongo
|
|
|
231
226
|
@last_update_time = Time.now.freeze
|
|
232
227
|
@last_update_monotime = Utils.monotonic_time
|
|
233
228
|
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
end
|
|
265
|
-
|
|
266
|
-
fake_service_id = if process_id = topology_version && topology_version['processId']
|
|
267
|
-
"process:#{process_id}"
|
|
268
|
-
else
|
|
269
|
-
"fake:#{rand(2**32-1)+1}"
|
|
270
|
-
end
|
|
271
|
-
@config = @config.merge('serviceId' => fake_service_id)
|
|
229
|
+
# When loadBalanced=true URI option is set, the driver will refuse
|
|
230
|
+
# to work if the server it communicates with does not set serviceId
|
|
231
|
+
# in ismaster/hello response.
|
|
232
|
+
#
|
|
233
|
+
# At the moment we cannot run a proper load balancer setup on evergreen
|
|
234
|
+
#
|
|
235
|
+
# Therefore, when connect=:load_balanced Ruby option is used instead
|
|
236
|
+
# of the loadBalanced=true URI option, if serviceId is not set in
|
|
237
|
+
# ismaster/hello response, the driver fabricates a serviceId and
|
|
238
|
+
# proceeds to treat a server that does not report itself as being
|
|
239
|
+
# behind a load balancer as a server that is behind a load balancer.
|
|
240
|
+
#
|
|
241
|
+
# 5.0+ servers should provide topologyVersion.processId which
|
|
242
|
+
# is specific to the particular process instance. We can use that
|
|
243
|
+
# field as a proxy for serviceId.
|
|
244
|
+
#
|
|
245
|
+
# If the topologyVersion isn't provided for whatever reason, we
|
|
246
|
+
# fabricate a serviceId locally.
|
|
247
|
+
#
|
|
248
|
+
# In either case, a serviceId provided by an actual server behind
|
|
249
|
+
# a load balancer is supposed to be a BSON::ObjectId. The fabricated
|
|
250
|
+
# service ids are strings, to distinguish them from the real ones.
|
|
251
|
+
# In particular processId is also a BSON::ObjectId, but will be
|
|
252
|
+
# mapped to a string for clarity that this is a fake service id.
|
|
253
|
+
#
|
|
254
|
+
# TODO: Remove this when https://jira.mongodb.org/browse/RUBY-2881 is done.
|
|
255
|
+
if load_balancer && ok? && !service_id
|
|
256
|
+
unless force_load_balancer
|
|
257
|
+
raise Error::MissingServiceId,
|
|
258
|
+
"The server at #{address.seed} did not provide a service id in handshake response"
|
|
272
259
|
end
|
|
260
|
+
|
|
261
|
+
fake_service_id = if process_id = topology_version && topology_version['processId']
|
|
262
|
+
"process:#{process_id}"
|
|
263
|
+
else
|
|
264
|
+
"fake:#{rand((2**32) - 1) + 1}"
|
|
265
|
+
end
|
|
266
|
+
@config = @config.merge('serviceId' => fake_service_id)
|
|
273
267
|
end
|
|
274
268
|
|
|
275
|
-
|
|
276
|
-
# prepopulate cache instance variables
|
|
277
|
-
hosts
|
|
278
|
-
arbiters
|
|
279
|
-
passives
|
|
280
|
-
topology_version
|
|
269
|
+
return unless Mongo::Lint.enabled?
|
|
281
270
|
|
|
282
|
-
|
|
283
|
-
|
|
271
|
+
# prepopulate cache instance variables
|
|
272
|
+
hosts
|
|
273
|
+
arbiters
|
|
274
|
+
passives
|
|
275
|
+
topology_version
|
|
276
|
+
|
|
277
|
+
freeze
|
|
284
278
|
end
|
|
285
279
|
|
|
286
280
|
# @return [ Address ] address The server's address.
|
|
@@ -297,14 +291,12 @@ module Mongo
|
|
|
297
291
|
end
|
|
298
292
|
|
|
299
293
|
# @return [ Features ] features The features for the server.
|
|
300
|
-
|
|
301
|
-
@features
|
|
302
|
-
end
|
|
294
|
+
attr_reader :features
|
|
303
295
|
|
|
304
296
|
# @return [ Float ] The moving average time the hello call took to complete.
|
|
305
297
|
attr_reader :average_round_trip_time
|
|
306
298
|
|
|
307
|
-
# @return [ Float ] The minimum time
|
|
299
|
+
# @return [ Float ] The minimum time that the ten last hello calls took
|
|
308
300
|
# to complete.
|
|
309
301
|
attr_reader :minimum_round_trip_time
|
|
310
302
|
|
|
@@ -318,8 +310,8 @@ module Mongo
|
|
|
318
310
|
# @since 2.0.0
|
|
319
311
|
def arbiter?
|
|
320
312
|
ok? &&
|
|
321
|
-
|
|
322
|
-
|
|
313
|
+
config['arbiterOnly'] == true &&
|
|
314
|
+
!!config['setName']
|
|
323
315
|
end
|
|
324
316
|
|
|
325
317
|
# Get a list of all arbiters in the replica set.
|
|
@@ -344,7 +336,7 @@ module Mongo
|
|
|
344
336
|
# @since 2.0.0
|
|
345
337
|
def ghost?
|
|
346
338
|
ok? &&
|
|
347
|
-
|
|
339
|
+
config['isreplicaset'] == true
|
|
348
340
|
end
|
|
349
341
|
|
|
350
342
|
# Will return true if the server is hidden.
|
|
@@ -498,7 +490,7 @@ module Mongo
|
|
|
498
490
|
def topology_version
|
|
499
491
|
unless defined?(@topology_version)
|
|
500
492
|
@topology_version = config['topologyVersion'] &&
|
|
501
|
-
|
|
493
|
+
TopologyVersion.new(config['topologyVersion'])
|
|
502
494
|
end
|
|
503
495
|
@topology_version
|
|
504
496
|
end
|
|
@@ -584,9 +576,9 @@ module Mongo
|
|
|
584
576
|
# but it's referred to it as "RSOther" which means a non-RS member
|
|
585
577
|
# cannot be "other".
|
|
586
578
|
ok? &&
|
|
587
|
-
|
|
579
|
+
!!config['setName'] && (
|
|
588
580
|
config['hidden'] == true ||
|
|
589
|
-
!primary? && !secondary? && !arbiter?
|
|
581
|
+
(!primary? && !secondary? && !arbiter?)
|
|
590
582
|
)
|
|
591
583
|
end
|
|
592
584
|
|
|
@@ -636,8 +628,8 @@ module Mongo
|
|
|
636
628
|
# @since 2.0.0
|
|
637
629
|
def primary?
|
|
638
630
|
ok? &&
|
|
639
|
-
(config['ismaster'] == true || config['isWritablePrimary'] == true
|
|
640
|
-
|
|
631
|
+
(config['ismaster'] == true || config['isWritablePrimary'] == true) &&
|
|
632
|
+
!!config['setName']
|
|
641
633
|
end
|
|
642
634
|
|
|
643
635
|
# Get the name of the replica set the server belongs to, returns nil if
|
|
@@ -675,8 +667,8 @@ module Mongo
|
|
|
675
667
|
# @since 2.0.0
|
|
676
668
|
def secondary?
|
|
677
669
|
ok? &&
|
|
678
|
-
|
|
679
|
-
|
|
670
|
+
config['secondary'] == true &&
|
|
671
|
+
!!config['setName']
|
|
680
672
|
end
|
|
681
673
|
|
|
682
674
|
# Returns the server type as a symbol.
|
|
@@ -696,6 +688,7 @@ module Mongo
|
|
|
696
688
|
return :secondary if secondary?
|
|
697
689
|
return :standalone if standalone?
|
|
698
690
|
return :other if other?
|
|
691
|
+
|
|
699
692
|
:unknown
|
|
700
693
|
end
|
|
701
694
|
|
|
@@ -709,9 +702,9 @@ module Mongo
|
|
|
709
702
|
# @since 2.0.0
|
|
710
703
|
def standalone?
|
|
711
704
|
ok? &&
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
705
|
+
config['msg'] != 'isdbgrid' &&
|
|
706
|
+
config['setName'].nil? &&
|
|
707
|
+
config['isreplicaset'] != true
|
|
715
708
|
end
|
|
716
709
|
|
|
717
710
|
# Returns whether this server is an unknown, per the SDAM spec.
|
|
@@ -724,7 +717,8 @@ module Mongo
|
|
|
724
717
|
# @since 2.0.0
|
|
725
718
|
def unknown?
|
|
726
719
|
return false if load_balancer?
|
|
727
|
-
|
|
720
|
+
|
|
721
|
+
config.empty? || config.keys == %w[topologyVersion] || !ok?
|
|
728
722
|
end
|
|
729
723
|
|
|
730
724
|
# @api private
|
|
@@ -821,9 +815,9 @@ module Mongo
|
|
|
821
815
|
#
|
|
822
816
|
# @since 2.7.0
|
|
823
817
|
def op_time
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
818
|
+
return unless config['lastWrite'] && config['lastWrite']['opTime']
|
|
819
|
+
|
|
820
|
+
config['lastWrite']['opTime']['ts']
|
|
827
821
|
end
|
|
828
822
|
|
|
829
823
|
# Time when this server description was created.
|
|
@@ -877,41 +871,23 @@ module Mongo
|
|
|
877
871
|
config[k] == other.config[k] || EXCLUDE_FOR_COMPARISON.include?(k)
|
|
878
872
|
end
|
|
879
873
|
end
|
|
880
|
-
|
|
874
|
+
alias eql? ==
|
|
881
875
|
|
|
882
876
|
# @api private
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
12
|
|
895
|
-
when '4.4'
|
|
896
|
-
9
|
|
897
|
-
when '4.2'
|
|
898
|
-
8
|
|
899
|
-
when '4.0'
|
|
900
|
-
7
|
|
901
|
-
when '3.6'
|
|
902
|
-
6
|
|
903
|
-
when '3.4'
|
|
904
|
-
5
|
|
905
|
-
when '3.2'
|
|
906
|
-
4
|
|
907
|
-
when '3.0'
|
|
908
|
-
3
|
|
909
|
-
when '2.6'
|
|
910
|
-
2
|
|
911
|
-
else
|
|
912
|
-
raise ArgumentError, "Bogus required version #{version}"
|
|
913
|
-
end
|
|
877
|
+
SERVER_VERSION_WIRE_VERSION_MAP = {
|
|
878
|
+
'8.2' => 27,
|
|
879
|
+
'8.0' => 25,
|
|
880
|
+
'7.0' => 21,
|
|
881
|
+
'6.0' => 17,
|
|
882
|
+
'5.2' => 15,
|
|
883
|
+
'5.1' => 14,
|
|
884
|
+
'5.0' => 12,
|
|
885
|
+
'4.4' => 9,
|
|
886
|
+
'4.2' => 8,
|
|
887
|
+
}.freeze
|
|
914
888
|
|
|
889
|
+
# @api private
|
|
890
|
+
def server_version_gte?(version)
|
|
915
891
|
if load_balancer?
|
|
916
892
|
# If we are talking to a load balancer, there is no monitoring
|
|
917
893
|
# and we don't know what server is behind the load balancer.
|
|
@@ -920,7 +896,10 @@ module Mongo
|
|
|
920
896
|
return true
|
|
921
897
|
end
|
|
922
898
|
|
|
923
|
-
required_wv
|
|
899
|
+
required_wv = SERVER_VERSION_WIRE_VERSION_MAP[version]
|
|
900
|
+
raise NotImplementedError, "Unexpected server version #{version.inspect}" unless required_wv
|
|
901
|
+
|
|
902
|
+
required_wv <= max_wire_version
|
|
924
903
|
end
|
|
925
904
|
end
|
|
926
905
|
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
|
|
|
@@ -27,9 +26,9 @@ module Mongo
|
|
|
27
26
|
class AppMetadata < Server::AppMetadata
|
|
28
27
|
def initialize(options = {})
|
|
29
28
|
super
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
29
|
+
return unless instance_variable_defined?(:@request_auth_mech)
|
|
30
|
+
|
|
31
|
+
remove_instance_variable(:@request_auth_mech)
|
|
33
32
|
end
|
|
34
33
|
end
|
|
35
34
|
end
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
# Copyright (C) 2015-2020 MongoDB Inc.
|
|
5
4
|
#
|
|
@@ -18,7 +17,6 @@
|
|
|
18
17
|
module Mongo
|
|
19
18
|
class Server
|
|
20
19
|
class Monitor
|
|
21
|
-
|
|
22
20
|
# This class models the monitor connections and their behavior.
|
|
23
21
|
#
|
|
24
22
|
# @since 2.0.0
|
|
@@ -58,9 +56,8 @@ module Mongo
|
|
|
58
56
|
def initialize(address, options = {})
|
|
59
57
|
@address = address
|
|
60
58
|
@options = options.dup.freeze
|
|
61
|
-
unless @app_metadata = options[:app_metadata]
|
|
62
|
-
|
|
63
|
-
end
|
|
59
|
+
raise ArgumentError, 'App metadata is required' unless @app_metadata = options[:app_metadata]
|
|
60
|
+
|
|
64
61
|
@socket = nil
|
|
65
62
|
@pid = Process.pid
|
|
66
63
|
@compressor = nil
|
|
@@ -109,14 +106,12 @@ module Mongo
|
|
|
109
106
|
def dispatch_bytes(bytes, **opts)
|
|
110
107
|
write_bytes(bytes)
|
|
111
108
|
read_response(
|
|
112
|
-
socket_timeout: opts[:read_socket_timeout]
|
|
109
|
+
socket_timeout: opts[:read_socket_timeout]
|
|
113
110
|
)
|
|
114
111
|
end
|
|
115
112
|
|
|
116
113
|
def write_bytes(bytes)
|
|
117
|
-
unless connected?
|
|
118
|
-
raise ArgumentError, "Trying to dispatch on an unconnected connection #{self}"
|
|
119
|
-
end
|
|
114
|
+
raise ArgumentError, "Trying to dispatch on an unconnected connection #{self}" unless connected?
|
|
120
115
|
|
|
121
116
|
add_server_connection_id do
|
|
122
117
|
add_server_diagnostics do
|
|
@@ -128,16 +123,14 @@ module Mongo
|
|
|
128
123
|
# @option opts [ Numeric ] :socket_timeout The timeout to use for
|
|
129
124
|
# each read operation.
|
|
130
125
|
def read_response(**opts)
|
|
131
|
-
unless connected?
|
|
132
|
-
raise ArgumentError, "Trying to read on an unconnected connection #{self}"
|
|
133
|
-
end
|
|
126
|
+
raise ArgumentError, "Trying to read on an unconnected connection #{self}" unless connected?
|
|
134
127
|
|
|
135
128
|
add_server_connection_id do
|
|
136
129
|
add_server_diagnostics do
|
|
137
130
|
Protocol::Message.deserialize(socket,
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
131
|
+
Protocol::Message::MAX_MESSAGE_SIZE,
|
|
132
|
+
nil,
|
|
133
|
+
**opts)
|
|
141
134
|
end
|
|
142
135
|
end
|
|
143
136
|
end
|
|
@@ -156,13 +149,12 @@ module Mongo
|
|
|
156
149
|
#
|
|
157
150
|
# @since 2.0.0
|
|
158
151
|
def connect!
|
|
159
|
-
if @socket
|
|
160
|
-
raise ArgumentError, 'Monitoring connection already connected'
|
|
161
|
-
end
|
|
152
|
+
raise ArgumentError, 'Monitoring connection already connected' if @socket
|
|
162
153
|
|
|
163
154
|
@socket = add_server_diagnostics do
|
|
164
155
|
address.socket(socket_timeout, ssl_options.merge(
|
|
165
|
-
|
|
156
|
+
connection_address: address, monitor: true
|
|
157
|
+
))
|
|
166
158
|
end
|
|
167
159
|
true
|
|
168
160
|
end
|
|
@@ -181,9 +173,13 @@ module Mongo
|
|
|
181
173
|
# @return [ true ] If the disconnect succeeded.
|
|
182
174
|
#
|
|
183
175
|
# @since 2.0.0
|
|
184
|
-
def disconnect!(
|
|
176
|
+
def disconnect!(_options = nil)
|
|
185
177
|
if socket
|
|
186
|
-
|
|
178
|
+
begin
|
|
179
|
+
socket.close
|
|
180
|
+
rescue StandardError
|
|
181
|
+
nil
|
|
182
|
+
end
|
|
187
183
|
@socket = nil
|
|
188
184
|
end
|
|
189
185
|
true
|
|
@@ -210,13 +206,12 @@ module Mongo
|
|
|
210
206
|
set_hello_ok!(reply)
|
|
211
207
|
@server_connection_id = reply['connectionId']
|
|
212
208
|
reply
|
|
213
|
-
rescue =>
|
|
209
|
+
rescue StandardError => e
|
|
214
210
|
msg = "Failed to handshake with #{address}"
|
|
215
|
-
Utils.warn_bg_exception(msg,
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
)
|
|
211
|
+
Utils.warn_bg_exception(msg, e,
|
|
212
|
+
logger: options[:logger],
|
|
213
|
+
log_prefix: options[:log_prefix],
|
|
214
|
+
bg_error_backtrace: options[:bg_error_backtrace])
|
|
220
215
|
raise
|
|
221
216
|
end
|
|
222
217
|
|
|
@@ -229,14 +224,12 @@ module Mongo
|
|
|
229
224
|
def check_document
|
|
230
225
|
server_api = @app_metadata.server_api || options[:server_api]
|
|
231
226
|
doc = if hello_ok? || server_api
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
LEGACY_HELLO_DOC
|
|
239
|
-
end
|
|
227
|
+
_doc = HELLO_DOC
|
|
228
|
+
_doc = _doc.merge(Utils.transform_server_api(server_api)) if server_api
|
|
229
|
+
_doc
|
|
230
|
+
else
|
|
231
|
+
LEGACY_HELLO_DOC
|
|
232
|
+
end
|
|
240
233
|
# compressors must be set to maintain correct compression status
|
|
241
234
|
# in the server description. See RUBY-2427
|
|
242
235
|
if compressors = options[:compressors]
|