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) 2014-2020 MongoDB Inc.
|
|
5
4
|
#
|
|
@@ -17,7 +16,6 @@
|
|
|
17
16
|
|
|
18
17
|
module Mongo
|
|
19
18
|
class Server
|
|
20
|
-
|
|
21
19
|
# This class models the socket connections for servers and their behavior.
|
|
22
20
|
#
|
|
23
21
|
# @since 2.0.0
|
|
@@ -32,37 +30,23 @@ module Mongo
|
|
|
32
30
|
# @since 2.1.0
|
|
33
31
|
#
|
|
34
32
|
# @deprecated No longer necessary with Server Selection specification.
|
|
35
|
-
PING = { :
|
|
33
|
+
PING = { ping: 1 }.freeze
|
|
36
34
|
|
|
37
|
-
# The ping command for an OP_MSG
|
|
35
|
+
# The ping command for an OP_MSG
|
|
38
36
|
#
|
|
39
37
|
# @since 2.5.0
|
|
40
38
|
#
|
|
41
39
|
# @deprecated No longer necessary with Server Selection specification.
|
|
42
40
|
PING_OP_MSG = { :ping => 1, '$db' => Database::ADMIN }.freeze
|
|
43
41
|
|
|
44
|
-
# Ping message
|
|
45
|
-
#
|
|
46
|
-
# @since 2.1.0
|
|
47
|
-
#
|
|
48
|
-
# @deprecated No longer necessary with Server Selection specification.
|
|
49
|
-
PING_MESSAGE = Protocol::Query.new(Database::ADMIN, Database::COMMAND, PING, :limit => -1)
|
|
50
|
-
|
|
51
|
-
# Ping message as an OP_MSG (server versions >= 3.6).
|
|
42
|
+
# Ping message as an OP_MSG
|
|
52
43
|
#
|
|
53
44
|
# @since 2.5.0
|
|
54
45
|
#
|
|
55
46
|
# @deprecated No longer necessary with Server Selection specification.
|
|
56
47
|
PING_OP_MSG_MESSAGE = Protocol::Msg.new([], {}, PING_OP_MSG)
|
|
57
48
|
|
|
58
|
-
# The ping message as raw bytes
|
|
59
|
-
#
|
|
60
|
-
# @since 2.1.0
|
|
61
|
-
#
|
|
62
|
-
# @deprecated No longer necessary with Server Selection specification.
|
|
63
|
-
PING_BYTES = PING_MESSAGE.serialize.to_s.freeze
|
|
64
|
-
|
|
65
|
-
# The ping OP_MSG message as raw bytes (server versions >= 3.6).
|
|
49
|
+
# The ping OP_MSG message as raw bytes
|
|
66
50
|
#
|
|
67
51
|
# @since 2.5.0
|
|
68
52
|
#
|
|
@@ -105,7 +89,7 @@ module Mongo
|
|
|
105
89
|
# @since 2.0.0
|
|
106
90
|
def initialize(server, options = {})
|
|
107
91
|
if server.load_balancer? && options[:generation]
|
|
108
|
-
raise ArgumentError,
|
|
92
|
+
raise ArgumentError, 'Generation cannot be set when server is a load balancer'
|
|
109
93
|
end
|
|
110
94
|
|
|
111
95
|
@id = server.next_connection_id
|
|
@@ -117,7 +101,7 @@ module Mongo
|
|
|
117
101
|
@last_checkin = nil
|
|
118
102
|
@auth_mechanism = nil
|
|
119
103
|
@pid = Process.pid
|
|
120
|
-
@
|
|
104
|
+
@pin_reasons = Set.new
|
|
121
105
|
|
|
122
106
|
publish_cmap_event(
|
|
123
107
|
Monitoring::Event::Cmap::ConnectionCreated.new(address, id)
|
|
@@ -139,6 +123,8 @@ module Mongo
|
|
|
139
123
|
# across all connections.
|
|
140
124
|
attr_reader :global_id
|
|
141
125
|
|
|
126
|
+
def_delegators :server, :tracer
|
|
127
|
+
|
|
142
128
|
# The connection pool from which this connection was created.
|
|
143
129
|
# May be nil.
|
|
144
130
|
#
|
|
@@ -196,21 +182,34 @@ module Mongo
|
|
|
196
182
|
#
|
|
197
183
|
# @api private
|
|
198
184
|
def pinned?
|
|
199
|
-
|
|
185
|
+
!@pin_reasons.empty?
|
|
200
186
|
end
|
|
201
187
|
|
|
202
|
-
# Mark the connection as pinned.
|
|
188
|
+
# Mark the connection as pinned for the given reason.
|
|
189
|
+
#
|
|
190
|
+
# @param [ Symbol ] reason The reason for pinning (:cursor or
|
|
191
|
+
# :transaction). Defaults to :cursor for backward compatibility.
|
|
203
192
|
#
|
|
204
193
|
# @api private
|
|
205
|
-
def pin
|
|
206
|
-
@
|
|
194
|
+
def pin(reason = :cursor)
|
|
195
|
+
@pin_reasons << reason
|
|
207
196
|
end
|
|
208
197
|
|
|
209
|
-
#
|
|
198
|
+
# Remove a pin from the connection for the given reason.
|
|
199
|
+
#
|
|
200
|
+
# @param [ Symbol ] reason The reason to unpin (:cursor or
|
|
201
|
+
# :transaction). Defaults to :cursor for backward compatibility.
|
|
210
202
|
#
|
|
211
203
|
# @api private
|
|
212
|
-
def unpin
|
|
213
|
-
@
|
|
204
|
+
def unpin(reason = :cursor)
|
|
205
|
+
@pin_reasons.delete(reason)
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
# Remove all pins from the connection.
|
|
209
|
+
#
|
|
210
|
+
# @api private
|
|
211
|
+
def unpin_all
|
|
212
|
+
@pin_reasons.clear
|
|
214
213
|
end
|
|
215
214
|
|
|
216
215
|
# Establishes a network connection to the target address.
|
|
@@ -234,10 +233,9 @@ module Mongo
|
|
|
234
233
|
@description, @compressor = do_connect
|
|
235
234
|
|
|
236
235
|
if server.load_balancer?
|
|
237
|
-
if Lint.enabled?
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
end
|
|
236
|
+
if Lint.enabled? && !service_id
|
|
237
|
+
raise Error::InternalDriverError,
|
|
238
|
+
'The connection is to a load balancer and it must have service_id set here, but does not'
|
|
241
239
|
end
|
|
242
240
|
@generation = connection_pool.generation_manager.generation(service_id: service_id)
|
|
243
241
|
end
|
|
@@ -278,7 +276,8 @@ module Mongo
|
|
|
278
276
|
raise_if_closed!
|
|
279
277
|
begin
|
|
280
278
|
pending_connection = PendingConnection.new(
|
|
281
|
-
socket, @server, monitoring, options.merge(id: id)
|
|
279
|
+
socket, @server, monitoring, options.merge(id: id)
|
|
280
|
+
)
|
|
282
281
|
pending_connection.handshake_and_authenticate!
|
|
283
282
|
rescue Exception
|
|
284
283
|
socket&.close
|
|
@@ -286,7 +285,7 @@ module Mongo
|
|
|
286
285
|
raise
|
|
287
286
|
end
|
|
288
287
|
|
|
289
|
-
[pending_connection.description, pending_connection.compressor]
|
|
288
|
+
[ pending_connection.description, pending_connection.compressor ]
|
|
290
289
|
end
|
|
291
290
|
|
|
292
291
|
# Disconnect the connection.
|
|
@@ -309,12 +308,16 @@ module Mongo
|
|
|
309
308
|
#
|
|
310
309
|
# @since 2.0.0
|
|
311
310
|
def disconnect!(options = nil)
|
|
312
|
-
#
|
|
311
|
+
# NOTE: @closed may be true here but we also may have a socket.
|
|
313
312
|
# Check the socket and not @closed flag.
|
|
314
313
|
@auth_mechanism = nil
|
|
315
314
|
@last_checkin = nil
|
|
316
315
|
if socket
|
|
317
|
-
|
|
316
|
+
begin
|
|
317
|
+
socket.close
|
|
318
|
+
rescue StandardError
|
|
319
|
+
nil
|
|
320
|
+
end
|
|
318
321
|
@socket = nil
|
|
319
322
|
end
|
|
320
323
|
@closed = true
|
|
@@ -331,8 +334,8 @@ module Mongo
|
|
|
331
334
|
Monitoring::Event::Cmap::ConnectionClosed.new(
|
|
332
335
|
address,
|
|
333
336
|
id,
|
|
334
|
-
reason
|
|
335
|
-
)
|
|
337
|
+
reason
|
|
338
|
+
)
|
|
336
339
|
)
|
|
337
340
|
@close_event_published = true
|
|
338
341
|
end
|
|
@@ -354,10 +357,9 @@ module Mongo
|
|
|
354
357
|
#
|
|
355
358
|
# @deprecated No longer necessary with Server Selection specification.
|
|
356
359
|
def ping
|
|
357
|
-
bytes = features.op_msg_enabled? ? PING_OP_MSG_BYTES : PING_BYTES
|
|
358
360
|
ensure_connected do |socket|
|
|
359
361
|
reply = add_server_diagnostics do
|
|
360
|
-
socket.write(
|
|
362
|
+
socket.write(PING_OP_MSG_BYTES)
|
|
361
363
|
Protocol::Message.deserialize(socket, max_message_size)
|
|
362
364
|
end
|
|
363
365
|
reply.documents[0][Operation::Result::OK] == 1
|
|
@@ -373,7 +375,7 @@ module Mongo
|
|
|
373
375
|
@timeout ||= options[:socket_timeout]
|
|
374
376
|
end
|
|
375
377
|
# @deprecated Please use :socket_timeout instead. Will be removed in 3.0.0
|
|
376
|
-
alias
|
|
378
|
+
alias timeout socket_timeout
|
|
377
379
|
|
|
378
380
|
# Record the last checkin time.
|
|
379
381
|
#
|
|
@@ -388,6 +390,22 @@ module Mongo
|
|
|
388
390
|
self
|
|
389
391
|
end
|
|
390
392
|
|
|
393
|
+
# Get the transport type for this connection.
|
|
394
|
+
#
|
|
395
|
+
# @return [ Symbol | nil ] The transport type, :tcp or :unix, or nil
|
|
396
|
+
# if no socket.
|
|
397
|
+
# @api private
|
|
398
|
+
def transport
|
|
399
|
+
return nil if @socket.nil?
|
|
400
|
+
|
|
401
|
+
case @socket
|
|
402
|
+
when Mongo::Socket::Unix
|
|
403
|
+
:unix
|
|
404
|
+
else
|
|
405
|
+
:tcp
|
|
406
|
+
end
|
|
407
|
+
end
|
|
408
|
+
|
|
391
409
|
private
|
|
392
410
|
|
|
393
411
|
def deliver(message, client, options = {})
|
|
@@ -397,31 +415,31 @@ module Mongo
|
|
|
397
415
|
end
|
|
398
416
|
|
|
399
417
|
def handle_errors
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
raise
|
|
414
|
-
end
|
|
418
|
+
yield
|
|
419
|
+
rescue Error::SocketError => e
|
|
420
|
+
@error = e
|
|
421
|
+
@server.unknown!(
|
|
422
|
+
generation: e.generation,
|
|
423
|
+
# or description.service_id?
|
|
424
|
+
service_id: e.service_id,
|
|
425
|
+
stop_push_monitor: true
|
|
426
|
+
)
|
|
427
|
+
raise
|
|
428
|
+
rescue Error::SocketTimeoutError => e
|
|
429
|
+
@error = e
|
|
430
|
+
raise
|
|
415
431
|
end
|
|
416
432
|
|
|
417
433
|
def raise_if_closed!
|
|
418
434
|
if error?
|
|
419
|
-
raise Error::ConnectionPerished,
|
|
435
|
+
raise Error::ConnectionPerished,
|
|
436
|
+
"Connection #{generation}:#{id} for #{address.seed} is perished. Reconnecting closed or errored connections is no longer supported"
|
|
420
437
|
end
|
|
421
438
|
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
439
|
+
return unless closed?
|
|
440
|
+
|
|
441
|
+
raise Error::ConnectionPerished,
|
|
442
|
+
"Connection #{generation}:#{id} for #{address.seed} is closed. Reconnecting closed or errored connections is no longer supported"
|
|
425
443
|
end
|
|
426
444
|
end
|
|
427
445
|
end
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
# Copyright (C) 2019-2020 MongoDB Inc.
|
|
5
4
|
#
|
|
@@ -17,7 +16,6 @@
|
|
|
17
16
|
|
|
18
17
|
module Mongo
|
|
19
18
|
class Server
|
|
20
|
-
|
|
21
19
|
# This class encapsulates common connection functionality.
|
|
22
20
|
#
|
|
23
21
|
# @note Although methods of this module are part of the public API,
|
|
@@ -37,17 +35,17 @@ module Mongo
|
|
|
37
35
|
# MAX_BSON_COMMAND_OVERHEAD.
|
|
38
36
|
#
|
|
39
37
|
# @api private
|
|
40
|
-
DEFAULT_MAX_BSON_OBJECT_SIZE =
|
|
38
|
+
DEFAULT_MAX_BSON_OBJECT_SIZE = 16_777_216
|
|
41
39
|
|
|
42
40
|
# The additional overhead allowed for command data (i.e. fields added
|
|
43
41
|
# to the command document by the driver, as opposed to documents
|
|
44
42
|
# provided by the user) when serializing a complete command to BSON.
|
|
45
43
|
#
|
|
46
44
|
# @api private
|
|
47
|
-
MAX_BSON_COMMAND_OVERHEAD =
|
|
45
|
+
MAX_BSON_COMMAND_OVERHEAD = 16_384
|
|
48
46
|
|
|
49
47
|
# @api private
|
|
50
|
-
REDUCED_MAX_BSON_SIZE =
|
|
48
|
+
REDUCED_MAX_BSON_SIZE = 2_097_152
|
|
51
49
|
|
|
52
50
|
# @return [ Hash ] options The passed in options.
|
|
53
51
|
attr_reader :options
|
|
@@ -83,10 +81,10 @@ module Mongo
|
|
|
83
81
|
|
|
84
82
|
# @deprecated
|
|
85
83
|
def_delegators :description,
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
84
|
+
:features,
|
|
85
|
+
:max_bson_object_size,
|
|
86
|
+
:max_message_size,
|
|
87
|
+
:mongos?
|
|
90
88
|
|
|
91
89
|
# @return [ nil | Object ] The service id, if any.
|
|
92
90
|
def service_id
|
|
@@ -151,12 +149,13 @@ module Mongo
|
|
|
151
149
|
# The monitoring code does not correctly handle multiple messages,
|
|
152
150
|
# and the driver internally does not send more than one message at
|
|
153
151
|
# a time ever. Thus prohibit multiple message use for now.
|
|
154
|
-
if messages.length != 1
|
|
155
|
-
|
|
156
|
-
end
|
|
152
|
+
raise ArgumentError, 'Can only dispatch one message at a time' if messages.length != 1
|
|
153
|
+
|
|
157
154
|
if description.unknown?
|
|
158
|
-
raise Error::InternalDriverError,
|
|
155
|
+
raise Error::InternalDriverError,
|
|
156
|
+
"Cannot dispatch a message on a connection with unknown description: #{description.inspect}"
|
|
159
157
|
end
|
|
158
|
+
|
|
160
159
|
message = messages.first
|
|
161
160
|
deliver(message, context, options)
|
|
162
161
|
end
|
|
@@ -168,16 +167,16 @@ module Mongo
|
|
|
168
167
|
if Lint.enabled? && !@socket
|
|
169
168
|
raise Error::LintError, "Trying to deliver a message over a disconnected connection (to #{address})"
|
|
170
169
|
end
|
|
170
|
+
|
|
171
171
|
buffer = serialize(message, context)
|
|
172
172
|
check_timeout!(context)
|
|
173
173
|
ensure_connected do |socket|
|
|
174
174
|
operation_id = Monitoring.next_operation_id
|
|
175
175
|
started_event = command_started(address, operation_id, message.payload,
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
)
|
|
176
|
+
socket_object_id: socket.object_id, connection_id: id,
|
|
177
|
+
connection_generation: generation,
|
|
178
|
+
server_connection_id: description.server_connection_id,
|
|
179
|
+
service_id: description.service_id)
|
|
181
180
|
start = Utils.monotonic_time
|
|
182
181
|
result = nil
|
|
183
182
|
begin
|
|
@@ -185,32 +184,27 @@ module Mongo
|
|
|
185
184
|
socket.write(buffer.to_s, timeout: context.remaining_timeout_sec)
|
|
186
185
|
if message.replyable?
|
|
187
186
|
check_timeout!(context)
|
|
188
|
-
Protocol::Message.deserialize(socket, max_message_size, message.request_id,
|
|
189
|
-
|
|
190
|
-
nil
|
|
187
|
+
Protocol::Message.deserialize(socket, max_message_size, message.request_id,
|
|
188
|
+
options.merge(timeout: context.remaining_timeout_sec))
|
|
191
189
|
end
|
|
192
190
|
end
|
|
193
191
|
rescue Exception => e
|
|
194
192
|
total_duration = Utils.monotonic_time - start
|
|
195
193
|
command_failed(nil, address, operation_id, message.payload,
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
)
|
|
194
|
+
e.message, total_duration,
|
|
195
|
+
started_event: started_event,
|
|
196
|
+
server_connection_id: description.server_connection_id,
|
|
197
|
+
service_id: description.service_id)
|
|
201
198
|
raise
|
|
202
199
|
else
|
|
203
200
|
total_duration = Utils.monotonic_time - start
|
|
204
201
|
command_completed(result, address, operation_id, message.payload,
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
)
|
|
210
|
-
end
|
|
211
|
-
if result && context.decrypt?
|
|
212
|
-
result = result.maybe_decrypt(context)
|
|
202
|
+
total_duration,
|
|
203
|
+
started_event: started_event,
|
|
204
|
+
server_connection_id: description.server_connection_id,
|
|
205
|
+
service_id: description.service_id)
|
|
213
206
|
end
|
|
207
|
+
result = result.maybe_decrypt(context) if result && context.decrypt?
|
|
214
208
|
result
|
|
215
209
|
end
|
|
216
210
|
end
|
|
@@ -224,18 +218,16 @@ module Mongo
|
|
|
224
218
|
# only as the default if the server's hello did not contain
|
|
225
219
|
# maxBsonObjectSize.
|
|
226
220
|
max_bson_size = max_bson_object_size || DEFAULT_MAX_BSON_OBJECT_SIZE
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
max_bson_size = REDUCED_MAX_BSON_SIZE
|
|
238
|
-
end
|
|
221
|
+
# The client-side encryption specification requires bulk writes to
|
|
222
|
+
# be split at a reduced maxBsonObjectSize. If this message is a bulk
|
|
223
|
+
# write and its size exceeds the reduced size limit, the serializer
|
|
224
|
+
# will raise an exception, which is caught by BulkWrite. BulkWrite
|
|
225
|
+
# will split the operation into individual writes, which will
|
|
226
|
+
# not be subject to the reduced maxBsonObjectSize.
|
|
227
|
+
if context.encrypt? && message.bulk_write?
|
|
228
|
+
# Make the new maximum size equal to the specified reduced size
|
|
229
|
+
# limit plus the 16KiB overhead allowance.
|
|
230
|
+
max_bson_size = REDUCED_MAX_BSON_SIZE
|
|
239
231
|
end
|
|
240
232
|
|
|
241
233
|
# RUBY-2234: It is necessary to check that the message size does not
|
|
@@ -261,9 +253,7 @@ module Mongo
|
|
|
261
253
|
temp_buffer.put_bytes(buffer.get_bytes(buffer.length))
|
|
262
254
|
|
|
263
255
|
message.serialize(temp_buffer, max_bson_size, MAX_BSON_COMMAND_OVERHEAD)
|
|
264
|
-
if temp_buffer.length > max_message_size
|
|
265
|
-
raise Error::MaxMessageSize.new(max_message_size)
|
|
266
|
-
end
|
|
256
|
+
raise Error::MaxMessageSize.new(max_message_size) if temp_buffer.length > max_message_size
|
|
267
257
|
end
|
|
268
258
|
|
|
269
259
|
# RUBY-2335: When the un-compressed message is smaller than the maximum
|
|
@@ -286,12 +276,12 @@ module Mongo
|
|
|
286
276
|
# @raise [ Mongo::Error::TimeoutError ] if timeout expired or there is
|
|
287
277
|
# not enough time to send the message to the server.
|
|
288
278
|
def check_timeout!(context)
|
|
289
|
-
return if [nil, 0].include?(context.deadline)
|
|
279
|
+
return if [ nil, 0 ].include?(context.deadline)
|
|
290
280
|
|
|
291
281
|
time_to_execute = context.remaining_timeout_sec - server.minimum_round_trip_time
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
282
|
+
return unless time_to_execute <= 0
|
|
283
|
+
|
|
284
|
+
raise Mongo::Error::TimeoutError
|
|
295
285
|
end
|
|
296
286
|
end
|
|
297
287
|
end
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
# Copyright (C) 2020 MongoDB Inc.
|
|
5
4
|
#
|
|
@@ -17,7 +16,6 @@
|
|
|
17
16
|
|
|
18
17
|
module Mongo
|
|
19
18
|
class Server
|
|
20
|
-
|
|
21
19
|
# Common methods used by both monitoring and non-monitoring connections.
|
|
22
20
|
#
|
|
23
21
|
# @note Although methods of this module are part of the public API,
|
|
@@ -26,7 +24,6 @@ module Mongo
|
|
|
26
24
|
#
|
|
27
25
|
# @api semipublic
|
|
28
26
|
class ConnectionCommon
|
|
29
|
-
|
|
30
27
|
# The compressor negotiated during the handshake for this connection,
|
|
31
28
|
# if any.
|
|
32
29
|
#
|
|
@@ -73,12 +70,8 @@ module Mongo
|
|
|
73
70
|
LEGACY_HELLO_DOC
|
|
74
71
|
end
|
|
75
72
|
document.merge(app_metadata.validated_document).tap do |doc|
|
|
76
|
-
if speculative_auth_doc
|
|
77
|
-
|
|
78
|
-
end
|
|
79
|
-
if load_balancer
|
|
80
|
-
doc.update(loadBalanced: true)
|
|
81
|
-
end
|
|
73
|
+
doc.update(speculativeAuthenticate: speculative_auth_doc) if speculative_auth_doc
|
|
74
|
+
doc.update(loadBalanced: true) if load_balancer
|
|
82
75
|
end
|
|
83
76
|
end
|
|
84
77
|
|
|
@@ -94,19 +87,18 @@ module Mongo
|
|
|
94
87
|
def handshake_command(handshake_document)
|
|
95
88
|
if handshake_document['apiVersion'] || handshake_document['loadBalanced']
|
|
96
89
|
Protocol::Msg.new(
|
|
97
|
-
[], {}, handshake_document.merge({'$db' => Database::ADMIN})
|
|
90
|
+
[], {}, handshake_document.merge({ '$db' => Database::ADMIN })
|
|
98
91
|
)
|
|
99
92
|
else
|
|
100
93
|
Protocol::Query.new(
|
|
101
94
|
Database::ADMIN,
|
|
102
95
|
Database::COMMAND,
|
|
103
96
|
handshake_document,
|
|
104
|
-
:
|
|
97
|
+
limit: -1
|
|
105
98
|
)
|
|
106
99
|
end
|
|
107
100
|
end
|
|
108
101
|
|
|
109
|
-
|
|
110
102
|
private
|
|
111
103
|
|
|
112
104
|
HELLO_DOC = BSON::Document.new({ hello: 1 }).freeze
|
|
@@ -118,22 +110,22 @@ module Mongo
|
|
|
118
110
|
def set_compressor!(reply)
|
|
119
111
|
server_compressors = reply['compression']
|
|
120
112
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
113
|
+
return unless options[:compressors]
|
|
114
|
+
|
|
115
|
+
if intersection = (server_compressors & options[:compressors])
|
|
116
|
+
@compressor = intersection.first
|
|
117
|
+
else
|
|
118
|
+
msg = if server_compressors
|
|
119
|
+
"The server at #{address} has no compression algorithms in common with those requested. " +
|
|
120
|
+
"Server algorithms: #{server_compressors.join(', ')}; " +
|
|
121
|
+
"Requested algorithms: #{options[:compressors].join(', ')}. " +
|
|
122
|
+
'Compression will not be used'
|
|
123
|
+
else
|
|
124
|
+
"The server at #{address} did not advertise compression support. " +
|
|
125
|
+
"Requested algorithms: #{options[:compressors].join(', ')}. " +
|
|
126
|
+
'Compression will not be used'
|
|
127
|
+
end
|
|
128
|
+
log_warn(msg)
|
|
137
129
|
end
|
|
138
130
|
end
|
|
139
131
|
|
|
@@ -151,57 +143,42 @@ module Mongo
|
|
|
151
143
|
# knows its address. Server::Connection delegates the address to its
|
|
152
144
|
# server.
|
|
153
145
|
note = +"on #{address.seed}"
|
|
154
|
-
if respond_to?(:id)
|
|
155
|
-
note << ", connection #{generation}:#{id}"
|
|
156
|
-
end
|
|
146
|
+
note << ", connection #{generation}:#{id}" if respond_to?(:id)
|
|
157
147
|
# Non-monitoring connections have service id.
|
|
158
148
|
# Monitoring connections do not.
|
|
159
|
-
if respond_to?(:service_id) && service_id
|
|
160
|
-
note << ", service id #{service_id}"
|
|
161
|
-
end
|
|
149
|
+
note << ", service id #{service_id}" if respond_to?(:service_id) && service_id
|
|
162
150
|
e.add_note(note)
|
|
163
151
|
if respond_to?(:generation)
|
|
164
152
|
# Non-monitoring connections
|
|
165
153
|
e.generation = generation
|
|
166
|
-
if respond_to?(:global_id)
|
|
167
|
-
|
|
168
|
-
end
|
|
169
|
-
if respond_to?(:description)
|
|
170
|
-
e.service_id = service_id
|
|
171
|
-
end
|
|
154
|
+
e.connection_global_id = global_id if respond_to?(:global_id)
|
|
155
|
+
e.service_id = service_id if respond_to?(:description)
|
|
172
156
|
end
|
|
173
157
|
raise e
|
|
174
158
|
end
|
|
175
159
|
|
|
176
160
|
def ssl_options
|
|
177
161
|
@ssl_options ||= if options[:ssl]
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
162
|
+
options.select { |k, _v| k.to_s.start_with?('ssl') }
|
|
163
|
+
else
|
|
164
|
+
# Due to the way options are propagated from the client, if we
|
|
165
|
+
# decide that we don't want to use TLS we need to have the :ssl
|
|
166
|
+
# option explicitly set to false or the value provided to the
|
|
167
|
+
# connection might be overwritten by the default inherited from
|
|
168
|
+
# the client.
|
|
169
|
+
{ ssl: false }
|
|
170
|
+
end.freeze
|
|
187
171
|
end
|
|
188
172
|
|
|
189
173
|
def ensure_connected
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
success = true
|
|
199
|
-
result
|
|
200
|
-
ensure
|
|
201
|
-
unless success
|
|
202
|
-
@error = true
|
|
203
|
-
end
|
|
204
|
-
end
|
|
174
|
+
raise ArgumentError, "Connection #{generation}:#{id} for #{address.seed} is not connected" unless socket
|
|
175
|
+
raise Error::ConnectionPerished, "Connection #{generation}:#{id} for #{address.seed} is perished" if @error
|
|
176
|
+
|
|
177
|
+
result = yield socket
|
|
178
|
+
success = true
|
|
179
|
+
result
|
|
180
|
+
ensure
|
|
181
|
+
@error = true unless success
|
|
205
182
|
end
|
|
206
183
|
end
|
|
207
184
|
end
|