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
|
#
|
|
@@ -17,7 +16,6 @@
|
|
|
17
16
|
|
|
18
17
|
module Mongo
|
|
19
18
|
module Operation
|
|
20
|
-
|
|
21
19
|
# Shared behavior of instantiating a result class matching the
|
|
22
20
|
# operation class.
|
|
23
21
|
#
|
|
@@ -28,12 +26,12 @@ module Mongo
|
|
|
28
26
|
module PolymorphicResult
|
|
29
27
|
include PolymorphicLookup
|
|
30
28
|
|
|
31
|
-
private
|
|
32
|
-
|
|
33
29
|
def self.included(base)
|
|
34
30
|
base.extend ClassMethods
|
|
35
31
|
end
|
|
36
32
|
|
|
33
|
+
private
|
|
34
|
+
|
|
37
35
|
module ClassMethods
|
|
38
36
|
attr_accessor :result_class
|
|
39
37
|
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
|
#
|
|
@@ -17,7 +16,6 @@
|
|
|
17
16
|
|
|
18
17
|
module Mongo
|
|
19
18
|
module Operation
|
|
20
|
-
|
|
21
19
|
# Read preference handling for pre-OP_MSG operation implementations.
|
|
22
20
|
#
|
|
23
21
|
# This module is not used by OP_MSG operation classes (those deriving
|
|
@@ -27,7 +25,6 @@ module Mongo
|
|
|
27
25
|
# @since 2.5.2
|
|
28
26
|
# @api private
|
|
29
27
|
module ReadPreferenceSupported
|
|
30
|
-
|
|
31
28
|
private
|
|
32
29
|
|
|
33
30
|
# Get the options for executing the operation on a particular connection.
|
|
@@ -70,7 +67,7 @@ module Mongo
|
|
|
70
67
|
# In replica sets and sharded clusters, read preference is passed
|
|
71
68
|
# to the server if one is specified by the application, and there
|
|
72
69
|
# is no default.
|
|
73
|
-
read && read.secondary_ok? || false
|
|
70
|
+
(read && read.secondary_ok?) || false
|
|
74
71
|
end
|
|
75
72
|
end
|
|
76
73
|
|
|
@@ -96,18 +93,16 @@ module Mongo
|
|
|
96
93
|
#
|
|
97
94
|
# @return [ Hash ] New command document to send to the server.
|
|
98
95
|
def add_read_preference_legacy(sel, connection)
|
|
96
|
+
# If the read preference contains only mode and mode is secondary
|
|
97
|
+
# preferred and we are sending to a pre-OP_MSG server, this read
|
|
98
|
+
# preference is indicated by the :secondary_ok wire protocol flag
|
|
99
|
+
# and $readPreference command parameter isn't sent.
|
|
99
100
|
if read && (
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
# and $readPreference command parameter isn't sent.
|
|
106
|
-
if read_pref != {mode: 'secondaryPreferred'}
|
|
107
|
-
Mongo::Lint.validate_camel_case_read_preference(read_pref)
|
|
108
|
-
sel = sel[:$query] ? sel : {:$query => sel}
|
|
109
|
-
sel = sel.merge(:$readPreference => read_pref)
|
|
110
|
-
end
|
|
101
|
+
connection.description.mongos? || connection.description.load_balancer?
|
|
102
|
+
) && (read_pref = read.to_mongos) && (read_pref != { mode: 'secondaryPreferred' })
|
|
103
|
+
Mongo::Lint.validate_camel_case_read_preference(read_pref)
|
|
104
|
+
sel = { :$query => sel } unless sel[:$query]
|
|
105
|
+
sel = sel.merge(:$readPreference => read_pref)
|
|
111
106
|
end
|
|
112
107
|
sel
|
|
113
108
|
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,12 +16,10 @@
|
|
|
17
16
|
|
|
18
17
|
module Mongo
|
|
19
18
|
module Operation
|
|
20
|
-
|
|
21
19
|
# Shared behavior of response handling for operations.
|
|
22
20
|
#
|
|
23
21
|
# @api private
|
|
24
22
|
module ResponseHandling
|
|
25
|
-
|
|
26
23
|
private
|
|
27
24
|
|
|
28
25
|
# @param [ Mongo::Operation::Result ] result The operation result.
|
|
@@ -52,12 +49,8 @@ module Mongo
|
|
|
52
49
|
def add_error_labels(connection, context)
|
|
53
50
|
yield
|
|
54
51
|
rescue Mongo::Error::SocketError => e
|
|
55
|
-
if context.in_transaction? && !context.committing_transaction?
|
|
56
|
-
|
|
57
|
-
end
|
|
58
|
-
if context.committing_transaction?
|
|
59
|
-
e.add_label('UnknownTransactionCommitResult')
|
|
60
|
-
end
|
|
52
|
+
e.add_label('TransientTransactionError') if context.in_transaction? && !context.committing_transaction?
|
|
53
|
+
e.add_label('UnknownTransactionCommitResult') if context.committing_transaction?
|
|
61
54
|
|
|
62
55
|
maybe_add_retryable_write_error_label!(e, connection, context)
|
|
63
56
|
|
|
@@ -66,12 +59,10 @@ module Mongo
|
|
|
66
59
|
maybe_add_retryable_write_error_label!(e, connection, context)
|
|
67
60
|
raise e
|
|
68
61
|
rescue Mongo::Error::OperationFailure::Family => e
|
|
69
|
-
if context.committing_transaction?
|
|
70
|
-
if e.write_retryable? || e.wtimeout? || (e.write_concern_error? &&
|
|
62
|
+
if context.committing_transaction? && (e.write_retryable? || e.wtimeout? || (e.write_concern_error? &&
|
|
71
63
|
!Session::UNLABELED_WRITE_CONCERN_CODES.include?(e.write_concern_error_code)
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
end
|
|
64
|
+
) || e.max_time_ms_expired?)
|
|
65
|
+
e.add_label('UnknownTransactionCommitResult')
|
|
75
66
|
end
|
|
76
67
|
|
|
77
68
|
maybe_add_retryable_write_error_label!(e, connection, context)
|
|
@@ -91,9 +82,7 @@ module Mongo
|
|
|
91
82
|
def unpin_maybe(session, connection)
|
|
92
83
|
yield
|
|
93
84
|
rescue Mongo::Error => e
|
|
94
|
-
if session
|
|
95
|
-
session.unpin_maybe(e, connection)
|
|
96
|
-
end
|
|
85
|
+
session.unpin_maybe(e, connection) if session
|
|
97
86
|
raise
|
|
98
87
|
end
|
|
99
88
|
|
|
@@ -115,8 +104,6 @@ module Mongo
|
|
|
115
104
|
raise e
|
|
116
105
|
end
|
|
117
106
|
|
|
118
|
-
private
|
|
119
|
-
|
|
120
107
|
# A method that will add the RetryableWriteError label to an error if
|
|
121
108
|
# any of the following conditions are true:
|
|
122
109
|
#
|
|
@@ -126,8 +113,8 @@ module Mongo
|
|
|
126
113
|
# AND the server does not support adding the RetryableWriteError label OR
|
|
127
114
|
# the error is a network error (i.e. the driver must add the label)
|
|
128
115
|
#
|
|
129
|
-
# AND the error
|
|
130
|
-
# OR the error
|
|
116
|
+
# AND the error occurred during a commitTransaction or abortTransaction
|
|
117
|
+
# OR the error occurred during a write outside of a transaction on a
|
|
131
118
|
# client that has retry writes enabled.
|
|
132
119
|
#
|
|
133
120
|
# If these conditions are met, the original error will be mutated.
|
|
@@ -150,8 +137,8 @@ module Mongo
|
|
|
150
137
|
# Note: any write operation within a transaction (excepting commit and
|
|
151
138
|
# abort is NOT a retryable operation)
|
|
152
139
|
retryable_operation = context.committing_transaction? ||
|
|
153
|
-
|
|
154
|
-
|
|
140
|
+
context.aborting_transaction? ||
|
|
141
|
+
(!context.in_transaction? && context.any_retry_writes?)
|
|
155
142
|
|
|
156
143
|
# An operation should add the RetryableWriteError label if one of the
|
|
157
144
|
# following conditions is met:
|
|
@@ -163,9 +150,9 @@ module Mongo
|
|
|
163
150
|
error.is_a?(Mongo::Error::SocketError) ||
|
|
164
151
|
error.is_a?(Mongo::Error::SocketTimeoutError)
|
|
165
152
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
153
|
+
return unless retryable_operation && should_add_error_label && error.write_retryable?
|
|
154
|
+
|
|
155
|
+
error.add_label('RetryableWriteError')
|
|
169
156
|
end
|
|
170
157
|
end
|
|
171
158
|
end
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
# Copyright (C) 2014-2020 MongoDB Inc.
|
|
5
4
|
#
|
|
@@ -18,13 +17,11 @@
|
|
|
18
17
|
module Mongo
|
|
19
18
|
module Operation
|
|
20
19
|
class Result
|
|
21
|
-
|
|
22
20
|
# Defines custom behavior of bulk write results
|
|
23
21
|
#
|
|
24
22
|
# @since 2.0.0
|
|
25
23
|
# @api private
|
|
26
24
|
module Aggregatable
|
|
27
|
-
|
|
28
25
|
# Aggregate the write errors returned from this result.
|
|
29
26
|
#
|
|
30
27
|
# @example Aggregate the write errors.
|
|
@@ -37,13 +34,14 @@ module Mongo
|
|
|
37
34
|
# @since 2.0.0
|
|
38
35
|
def aggregate_write_errors(count)
|
|
39
36
|
return unless @replies
|
|
37
|
+
|
|
40
38
|
@replies.reduce(nil) do |errors, reply|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
(errors || []) << wes if wes
|
|
39
|
+
next unless write_errors = reply.documents.first['writeErrors']
|
|
40
|
+
|
|
41
|
+
wes = write_errors.collect do |we|
|
|
42
|
+
we.merge!('index' => count + we['index'])
|
|
46
43
|
end
|
|
44
|
+
(errors || []) << wes if wes
|
|
47
45
|
end
|
|
48
46
|
end
|
|
49
47
|
|
|
@@ -59,12 +57,13 @@ module Mongo
|
|
|
59
57
|
# @since 2.0.0
|
|
60
58
|
def aggregate_write_concern_errors(count)
|
|
61
59
|
return unless @replies
|
|
60
|
+
|
|
62
61
|
@replies.each_with_index.reduce(nil) do |errors, (reply, _)|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
62
|
+
next unless write_concern_errors = reply.documents.first['writeConcernErrors']
|
|
63
|
+
|
|
64
|
+
(errors || []) << write_concern_errors.reduce(nil) do |errs, wce|
|
|
65
|
+
wce.merge!('index' => count + wce['index'])
|
|
66
|
+
(errs || []) << write_concern_error
|
|
68
67
|
end
|
|
69
68
|
end
|
|
70
69
|
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
|
#
|
|
@@ -17,28 +16,26 @@
|
|
|
17
16
|
|
|
18
17
|
module Mongo
|
|
19
18
|
module Operation
|
|
20
|
-
|
|
21
19
|
# Shared behavior of operations that support a session.
|
|
22
20
|
#
|
|
23
21
|
# @since 2.5.2
|
|
24
22
|
# @api private
|
|
25
23
|
module SessionsSupported
|
|
26
|
-
|
|
27
24
|
private
|
|
28
25
|
|
|
29
26
|
ZERO_TIMESTAMP = BSON::Timestamp.new(0, 0)
|
|
30
27
|
|
|
31
|
-
READ_COMMANDS = [
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
28
|
+
READ_COMMANDS = %i[
|
|
29
|
+
aggregate
|
|
30
|
+
count
|
|
31
|
+
dbStats
|
|
32
|
+
distinct
|
|
33
|
+
find
|
|
34
|
+
geoNear
|
|
35
|
+
geoSearch
|
|
36
|
+
group
|
|
37
|
+
mapReduce
|
|
38
|
+
parallelCollectionScan
|
|
42
39
|
].freeze
|
|
43
40
|
|
|
44
41
|
# Adds causal consistency document to the selector, if one can be
|
|
@@ -62,31 +59,32 @@ module Mongo
|
|
|
62
59
|
# must have the current operation time. Also, topology must be
|
|
63
60
|
# replica set or sharded cluster.
|
|
64
61
|
def apply_causal_consistency_if_possible(selector, connection)
|
|
65
|
-
if
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
62
|
+
return if connection.description.standalone?
|
|
63
|
+
|
|
64
|
+
cc_doc = session.send(:causal_consistency_doc)
|
|
65
|
+
return unless cc_doc
|
|
66
|
+
|
|
67
|
+
rc_doc = (selector[:readConcern] || read_concern || {}).merge(cc_doc)
|
|
68
|
+
selector[:readConcern] = Options::Mapper.transform_values_to_strings(
|
|
69
|
+
rc_doc
|
|
70
|
+
)
|
|
73
71
|
end
|
|
74
72
|
|
|
75
73
|
def flags
|
|
76
|
-
acknowledged_write? ? [] : [:more_to_come]
|
|
74
|
+
acknowledged_write? ? [] : [ :more_to_come ]
|
|
77
75
|
end
|
|
78
76
|
|
|
79
77
|
def apply_cluster_time!(selector, connection)
|
|
80
|
-
if
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
78
|
+
return if connection.description.standalone?
|
|
79
|
+
|
|
80
|
+
cluster_time = [
|
|
81
|
+
connection.cluster_time,
|
|
82
|
+
session&.cluster_time,
|
|
83
|
+
].compact.max
|
|
84
|
+
|
|
85
|
+
return unless cluster_time
|
|
86
|
+
|
|
87
|
+
selector['$clusterTime'] = cluster_time
|
|
90
88
|
end
|
|
91
89
|
|
|
92
90
|
def read_command?(sel)
|
|
@@ -126,10 +124,8 @@ module Mongo
|
|
|
126
124
|
end
|
|
127
125
|
|
|
128
126
|
def command(connection)
|
|
129
|
-
if Lint.enabled?
|
|
130
|
-
|
|
131
|
-
raise Error::LintError, "Connection is not a Connection instance: #{connection}"
|
|
132
|
-
end
|
|
127
|
+
if Lint.enabled? && !connection.is_a?(Server::Connection)
|
|
128
|
+
raise Error::LintError, "Connection is not a Connection instance: #{connection}"
|
|
133
129
|
end
|
|
134
130
|
|
|
135
131
|
sel = BSON::Document.new(selector(connection))
|
|
@@ -138,11 +134,9 @@ module Mongo
|
|
|
138
134
|
|
|
139
135
|
add_read_preference(sel, connection)
|
|
140
136
|
|
|
141
|
-
if connection.
|
|
137
|
+
if connection.description.logical_session_timeout
|
|
142
138
|
apply_cluster_time!(sel, connection)
|
|
143
|
-
if session && (acknowledged_write? || session.in_transaction?)
|
|
144
|
-
apply_session_options(sel, connection)
|
|
145
|
-
end
|
|
139
|
+
apply_session_options(sel, connection) if session && (acknowledged_write? || session.in_transaction?)
|
|
146
140
|
elsif session && session.explicit?
|
|
147
141
|
apply_session_options(sel, connection)
|
|
148
142
|
end
|
|
@@ -169,47 +163,45 @@ module Mongo
|
|
|
169
163
|
|
|
170
164
|
# https://github.com/mongodb/specifications/blob/master/source/server-selection/server-selection.md#topology-type-single
|
|
171
165
|
read_doc = if connection.description.standalone?
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
sel['$readPreference'] = read_doc
|
|
212
|
-
end
|
|
166
|
+
# Read preference is never sent to standalones.
|
|
167
|
+
nil
|
|
168
|
+
elsif connection.server.load_balancer?
|
|
169
|
+
read&.to_mongos
|
|
170
|
+
elsif connection.description.mongos?
|
|
171
|
+
# When server is a mongos:
|
|
172
|
+
# - $readPreference is never sent when mode is 'primary'
|
|
173
|
+
# - Otherwise $readPreference is sent
|
|
174
|
+
# When mode is 'secondaryPreferred' $readPreference is currently
|
|
175
|
+
# required to only be sent when a non-mode field (i.e. tag_sets)
|
|
176
|
+
# is present, but this causes wrong behavior (DRIVERS-1642).
|
|
177
|
+
read&.to_mongos
|
|
178
|
+
elsif connection.server.cluster.single?
|
|
179
|
+
# In Single topology:
|
|
180
|
+
# - If no read preference is specified by the application, the driver
|
|
181
|
+
# adds mode: primaryPreferred.
|
|
182
|
+
# - If a read preference is specified by the application, the driver
|
|
183
|
+
# replaces the mode with primaryPreferred.
|
|
184
|
+
read_doc = if read
|
|
185
|
+
BSON::Document.new(read.to_doc)
|
|
186
|
+
else
|
|
187
|
+
BSON::Document.new
|
|
188
|
+
end
|
|
189
|
+
read_doc['mode'] = 'primaryPreferred' if [ nil, 'primary' ].include?(read_doc['mode'])
|
|
190
|
+
read_doc
|
|
191
|
+
else
|
|
192
|
+
# In replica sets, read preference is passed to the server if one
|
|
193
|
+
# is specified by the application, except for primary read preferences.
|
|
194
|
+
read_doc = BSON::Document.new(read&.to_doc || {})
|
|
195
|
+
if [ nil, 'primary' ].include?(read_doc['mode'])
|
|
196
|
+
nil
|
|
197
|
+
else
|
|
198
|
+
read_doc
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
return unless read_doc
|
|
203
|
+
|
|
204
|
+
sel['$readPreference'] = read_doc
|
|
213
205
|
end
|
|
214
206
|
|
|
215
207
|
def apply_session_options(sel, connection)
|
|
@@ -224,27 +216,24 @@ module Mongo
|
|
|
224
216
|
validate_read_preference!(sel)
|
|
225
217
|
apply_txn_num!(sel)
|
|
226
218
|
if session.recovery_token &&
|
|
227
|
-
|
|
228
|
-
then
|
|
219
|
+
(sel[:commitTransaction] || sel[:abortTransaction])
|
|
229
220
|
sel[:recoveryToken] = session.recovery_token
|
|
230
221
|
end
|
|
231
222
|
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
raise Error::SnapshotSessionInvalidServerVersion
|
|
235
|
-
end
|
|
223
|
+
return unless session.snapshot?
|
|
224
|
+
raise Error::SnapshotSessionInvalidServerVersion unless connection.description.server_version_gte?('5.0')
|
|
236
225
|
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
end
|
|
226
|
+
sel[:readConcern] = { level: 'snapshot' }
|
|
227
|
+
return unless session.snapshot_timestamp
|
|
228
|
+
|
|
229
|
+
sel[:readConcern][:atClusterTime] = session.snapshot_timestamp
|
|
242
230
|
end
|
|
243
231
|
|
|
244
232
|
def build_message(connection, context)
|
|
245
|
-
if
|
|
246
|
-
if
|
|
247
|
-
raise Error::InternalDriverError,
|
|
233
|
+
if session != context.session
|
|
234
|
+
if session
|
|
235
|
+
raise Error::InternalDriverError,
|
|
236
|
+
"Operation session #{session.inspect} does not match context session #{context.session.inspect}"
|
|
248
237
|
else
|
|
249
238
|
# Some operations are not constructed with sessions but are
|
|
250
239
|
# executed in a context where a session is available.
|
|
@@ -261,9 +250,8 @@ module Mongo
|
|
|
261
250
|
# later prior to being sent to the connection.
|
|
262
251
|
buf = BSON::ByteBuffer.new
|
|
263
252
|
message.serialize(buf)
|
|
264
|
-
if buf.length > connection.max_message_size
|
|
265
|
-
|
|
266
|
-
end
|
|
253
|
+
raise Error::MaxMessageSize.new(connection.max_message_size) if buf.length > connection.max_message_size
|
|
254
|
+
|
|
267
255
|
session.update_state!
|
|
268
256
|
end
|
|
269
257
|
end
|