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) 2015-2020 MongoDB Inc.
|
|
5
4
|
#
|
|
@@ -17,48 +16,46 @@
|
|
|
17
16
|
|
|
18
17
|
module Mongo
|
|
19
18
|
class BulkWrite
|
|
20
|
-
|
|
21
19
|
# Defines behavior around transformations.
|
|
22
20
|
#
|
|
23
21
|
# @api private
|
|
24
22
|
#
|
|
25
23
|
# @since 2.1.0
|
|
26
24
|
module Transformable
|
|
27
|
-
|
|
28
25
|
# The delete many model constant.
|
|
29
26
|
#
|
|
30
27
|
# @since 2.1.0
|
|
31
|
-
DELETE_MANY = :delete_many
|
|
28
|
+
DELETE_MANY = :delete_many
|
|
32
29
|
|
|
33
30
|
# The delete one model constant.
|
|
34
31
|
#
|
|
35
32
|
# @since 2.1.0
|
|
36
|
-
DELETE_ONE = :delete_one
|
|
33
|
+
DELETE_ONE = :delete_one
|
|
37
34
|
|
|
38
35
|
# The insert one model constant.
|
|
39
36
|
#
|
|
40
37
|
# @since 2.1.0
|
|
41
|
-
INSERT_ONE = :insert_one
|
|
38
|
+
INSERT_ONE = :insert_one
|
|
42
39
|
|
|
43
40
|
# The replace one model constant.
|
|
44
41
|
#
|
|
45
42
|
# @since 2.1.0
|
|
46
|
-
REPLACE_ONE = :replace_one
|
|
43
|
+
REPLACE_ONE = :replace_one
|
|
47
44
|
|
|
48
45
|
# The update many model constant.
|
|
49
46
|
#
|
|
50
47
|
# @since 2.1.0
|
|
51
|
-
UPDATE_MANY = :update_many
|
|
48
|
+
UPDATE_MANY = :update_many
|
|
52
49
|
|
|
53
50
|
# The update one model constant.
|
|
54
51
|
#
|
|
55
52
|
# @since 2.1.0
|
|
56
|
-
UPDATE_ONE = :update_one
|
|
53
|
+
UPDATE_ONE = :update_one
|
|
57
54
|
|
|
58
55
|
# Proc to transform delete many ops.
|
|
59
56
|
#
|
|
60
57
|
# @since 2.1.0
|
|
61
|
-
DELETE_MANY_TRANSFORM =
|
|
58
|
+
DELETE_MANY_TRANSFORM = lambda { |doc|
|
|
62
59
|
{
|
|
63
60
|
Operation::Q => doc[:filter],
|
|
64
61
|
Operation::LIMIT => 0,
|
|
@@ -71,7 +68,7 @@ module Mongo
|
|
|
71
68
|
# Proc to transform delete one ops.
|
|
72
69
|
#
|
|
73
70
|
# @since 2.1.0
|
|
74
|
-
DELETE_ONE_TRANSFORM =
|
|
71
|
+
DELETE_ONE_TRANSFORM = lambda { |doc|
|
|
75
72
|
{
|
|
76
73
|
Operation::Q => doc[:filter],
|
|
77
74
|
Operation::LIMIT => 1,
|
|
@@ -84,14 +81,14 @@ module Mongo
|
|
|
84
81
|
# Proc to transform insert one ops.
|
|
85
82
|
#
|
|
86
83
|
# @since 2.1.0
|
|
87
|
-
INSERT_ONE_TRANSFORM =
|
|
84
|
+
INSERT_ONE_TRANSFORM = lambda { |doc|
|
|
88
85
|
doc
|
|
89
86
|
}
|
|
90
87
|
|
|
91
|
-
# Proc to
|
|
88
|
+
# Proc to transform replace one ops.
|
|
92
89
|
#
|
|
93
90
|
# @since 2.1.0
|
|
94
|
-
REPLACE_ONE_TRANSFORM =
|
|
91
|
+
REPLACE_ONE_TRANSFORM = lambda { |doc|
|
|
95
92
|
{
|
|
96
93
|
Operation::Q => doc[:filter],
|
|
97
94
|
Operation::U => doc[:replacement],
|
|
@@ -106,7 +103,7 @@ module Mongo
|
|
|
106
103
|
# Proc to transform update many ops.
|
|
107
104
|
#
|
|
108
105
|
# @since 2.1.0
|
|
109
|
-
UPDATE_MANY_TRANSFORM =
|
|
106
|
+
UPDATE_MANY_TRANSFORM = lambda { |doc|
|
|
110
107
|
{
|
|
111
108
|
Operation::Q => doc[:filter],
|
|
112
109
|
Operation::U => doc[:update],
|
|
@@ -122,7 +119,7 @@ module Mongo
|
|
|
122
119
|
# Proc to transform update one ops.
|
|
123
120
|
#
|
|
124
121
|
# @since 2.1.0
|
|
125
|
-
UPDATE_ONE_TRANSFORM =
|
|
122
|
+
UPDATE_ONE_TRANSFORM = lambda { |doc|
|
|
126
123
|
{
|
|
127
124
|
Operation::Q => doc[:filter],
|
|
128
125
|
Operation::U => doc[:update],
|
|
@@ -140,11 +137,11 @@ module Mongo
|
|
|
140
137
|
# @since 2.1.0
|
|
141
138
|
MAPPERS = {
|
|
142
139
|
DELETE_MANY => DELETE_MANY_TRANSFORM,
|
|
143
|
-
DELETE_ONE
|
|
144
|
-
INSERT_ONE
|
|
140
|
+
DELETE_ONE => DELETE_ONE_TRANSFORM,
|
|
141
|
+
INSERT_ONE => INSERT_ONE_TRANSFORM,
|
|
145
142
|
REPLACE_ONE => REPLACE_ONE_TRANSFORM,
|
|
146
143
|
UPDATE_MANY => UPDATE_MANY_TRANSFORM,
|
|
147
|
-
UPDATE_ONE
|
|
144
|
+
UPDATE_ONE => UPDATE_ONE_TRANSFORM
|
|
148
145
|
}.freeze
|
|
149
146
|
|
|
150
147
|
private
|
|
@@ -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,15 +16,14 @@
|
|
|
17
16
|
|
|
18
17
|
module Mongo
|
|
19
18
|
class BulkWrite
|
|
20
|
-
|
|
21
19
|
# Combines groups of bulk write operations in no order.
|
|
22
20
|
#
|
|
23
21
|
# @api private
|
|
24
22
|
#
|
|
25
23
|
# @since 2.1.0
|
|
26
24
|
class UnorderedCombiner
|
|
27
|
-
include Transformable
|
|
28
25
|
include Validatable
|
|
26
|
+
include Transformable
|
|
29
27
|
include Combineable
|
|
30
28
|
|
|
31
29
|
# Combine the requests in order.
|
|
@@ -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,14 +16,12 @@
|
|
|
17
16
|
|
|
18
17
|
module Mongo
|
|
19
18
|
class BulkWrite
|
|
20
|
-
|
|
21
19
|
# Defines behavior around validations.
|
|
22
20
|
#
|
|
23
21
|
# @api private
|
|
24
22
|
#
|
|
25
23
|
# @since 2.1.0
|
|
26
24
|
module Validatable
|
|
27
|
-
|
|
28
25
|
# Validate the document.
|
|
29
26
|
#
|
|
30
27
|
# @api private
|
|
@@ -43,33 +40,29 @@ module Mongo
|
|
|
43
40
|
def validate(name, document)
|
|
44
41
|
validate_operation(name)
|
|
45
42
|
validate_document(name, document)
|
|
46
|
-
if document.respond_to?(:keys) && (document[:collation] || document[Operation::COLLATION])
|
|
47
|
-
@has_collation = true
|
|
48
|
-
end
|
|
43
|
+
@has_collation = true if document.respond_to?(:keys) && (document[:collation] || document[Operation::COLLATION])
|
|
49
44
|
|
|
50
|
-
if document.respond_to?(:keys) && document[:array_filters]
|
|
51
|
-
@has_array_filters = true
|
|
52
|
-
end
|
|
45
|
+
@has_array_filters = true if document.respond_to?(:keys) && document[:array_filters]
|
|
53
46
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
47
|
+
return unless document.respond_to?(:keys) && document[:hint]
|
|
48
|
+
|
|
49
|
+
@has_hint = true
|
|
57
50
|
end
|
|
58
51
|
|
|
59
52
|
private
|
|
60
53
|
|
|
61
54
|
def validate_document(name, document)
|
|
62
|
-
|
|
63
|
-
document
|
|
64
|
-
else
|
|
55
|
+
unless document.respond_to?(:keys) || document.respond_to?(:data)
|
|
65
56
|
raise Error::InvalidBulkOperation.new(name, document)
|
|
66
57
|
end
|
|
58
|
+
|
|
59
|
+
document
|
|
67
60
|
end
|
|
68
61
|
|
|
69
62
|
def validate_operation(name)
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
63
|
+
return if Transformable::MAPPERS.key?(name)
|
|
64
|
+
|
|
65
|
+
raise Error::InvalidBulkOperationType.new(name)
|
|
73
66
|
end
|
|
74
67
|
end
|
|
75
68
|
end
|
data/lib/mongo/bulk_write.rb
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# rubocop:todo all
|
|
3
2
|
|
|
4
3
|
# Copyright (C) 2014-2020 MongoDB Inc.
|
|
5
4
|
#
|
|
@@ -67,7 +66,7 @@ module Mongo
|
|
|
67
66
|
context = Operation::Context.new(
|
|
68
67
|
client: client,
|
|
69
68
|
session: session,
|
|
70
|
-
operation_timeouts:
|
|
69
|
+
operation_timeouts: operation_timeouts(deadline)
|
|
71
70
|
)
|
|
72
71
|
if single_statement?(operation)
|
|
73
72
|
write_concern = write_concern(session)
|
|
@@ -80,10 +79,11 @@ module Mongo
|
|
|
80
79
|
operation_id,
|
|
81
80
|
result_combiner,
|
|
82
81
|
session,
|
|
83
|
-
txn_num
|
|
82
|
+
txn_num
|
|
83
|
+
)
|
|
84
84
|
end
|
|
85
85
|
else
|
|
86
|
-
nro_write_with_retry(write_concern, context: context) do |connection,
|
|
86
|
+
nro_write_with_retry(write_concern, context: context) do |connection, _txn_num, context|
|
|
87
87
|
execute_operation(
|
|
88
88
|
operation.keys.first,
|
|
89
89
|
operation.values.flatten,
|
|
@@ -91,7 +91,8 @@ module Mongo
|
|
|
91
91
|
context,
|
|
92
92
|
operation_id,
|
|
93
93
|
result_combiner,
|
|
94
|
-
session
|
|
94
|
+
session
|
|
95
|
+
)
|
|
95
96
|
end
|
|
96
97
|
end
|
|
97
98
|
end
|
|
@@ -129,9 +130,9 @@ module Mongo
|
|
|
129
130
|
@collection = collection
|
|
130
131
|
@requests = requests
|
|
131
132
|
@options = options || {}
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
133
|
+
return unless @options[:timeout_ms] && @options[:timeout_ms] < 0
|
|
134
|
+
|
|
135
|
+
raise ArgumentError, 'timeout_ms options must be non-negative integer'
|
|
135
136
|
end
|
|
136
137
|
|
|
137
138
|
# Is the bulk write ordered?
|
|
@@ -159,16 +160,18 @@ module Mongo
|
|
|
159
160
|
#
|
|
160
161
|
# @since 2.1.0
|
|
161
162
|
def write_concern(session = nil)
|
|
162
|
-
@write_concern ||= options[:write_concern]
|
|
163
|
-
|
|
164
|
-
|
|
163
|
+
@write_concern ||= if options[:write_concern]
|
|
164
|
+
WriteConcern.get(options[:write_concern])
|
|
165
|
+
else
|
|
166
|
+
collection.write_concern_with_session(session)
|
|
167
|
+
end
|
|
165
168
|
end
|
|
166
169
|
|
|
167
170
|
private
|
|
168
171
|
|
|
169
|
-
SINGLE_STATEMENT_OPS = [
|
|
170
|
-
|
|
171
|
-
|
|
172
|
+
SINGLE_STATEMENT_OPS = %i[delete_one
|
|
173
|
+
update_one
|
|
174
|
+
insert_one].freeze
|
|
172
175
|
|
|
173
176
|
# @return [ Float | nil ] Deadline for the batch of operations, if set.
|
|
174
177
|
def calculate_deadline
|
|
@@ -182,6 +185,22 @@ module Mongo
|
|
|
182
185
|
end
|
|
183
186
|
end
|
|
184
187
|
|
|
188
|
+
# Returns the operation_timeouts hash for creating an Operation::Context.
|
|
189
|
+
# Uses operation_timeout_ms when the timeout was explicitly set on the
|
|
190
|
+
# bulk write, or inherited_timeout_ms when it comes from the collection
|
|
191
|
+
# or client. This distinction is important inside transactions where
|
|
192
|
+
# operation_timeout_ms is not allowed (RUBY-3685).
|
|
193
|
+
def operation_timeouts(deadline)
|
|
194
|
+
timeout = op_timeout_ms(deadline)
|
|
195
|
+
return {} if timeout.nil?
|
|
196
|
+
|
|
197
|
+
if @options[:timeout_ms]
|
|
198
|
+
{ operation_timeout_ms: timeout }
|
|
199
|
+
else
|
|
200
|
+
{ inherited_timeout_ms: timeout }
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
|
|
185
204
|
# @param [ Float | nil ] deadline Deadline for the batch of operations.
|
|
186
205
|
#
|
|
187
206
|
# @return [ Integer | nil ] Timeout in milliseconds for the next operation.
|
|
@@ -201,24 +220,22 @@ module Mongo
|
|
|
201
220
|
|
|
202
221
|
def base_spec(operation_id, session)
|
|
203
222
|
{
|
|
204
|
-
:
|
|
205
|
-
:
|
|
206
|
-
:
|
|
207
|
-
:
|
|
208
|
-
:
|
|
209
|
-
:
|
|
210
|
-
:
|
|
211
|
-
:
|
|
212
|
-
:
|
|
213
|
-
:
|
|
214
|
-
:
|
|
215
|
-
:
|
|
223
|
+
db_name: database.name,
|
|
224
|
+
coll_name: collection.name,
|
|
225
|
+
write_concern: write_concern(session),
|
|
226
|
+
ordered: ordered?,
|
|
227
|
+
operation_id: operation_id,
|
|
228
|
+
bypass_document_validation: !!options[:bypass_document_validation],
|
|
229
|
+
max_time_ms: options[:max_time_ms],
|
|
230
|
+
options: options,
|
|
231
|
+
id_generator: client.options[:id_generator],
|
|
232
|
+
session: session,
|
|
233
|
+
comment: options[:comment],
|
|
234
|
+
let: options[:let],
|
|
216
235
|
}
|
|
217
236
|
end
|
|
218
237
|
|
|
219
238
|
def execute_operation(name, values, connection, context, operation_id, result_combiner, session, txn_num = nil)
|
|
220
|
-
validate_collation!(connection)
|
|
221
|
-
validate_array_filters!(connection)
|
|
222
239
|
validate_hint!(connection)
|
|
223
240
|
|
|
224
241
|
unpin_maybe(session, connection) do
|
|
@@ -234,15 +251,12 @@ module Mongo
|
|
|
234
251
|
end
|
|
235
252
|
end
|
|
236
253
|
end
|
|
237
|
-
#
|
|
254
|
+
# The size of each section in the message
|
|
238
255
|
# is independently capped at 16m and each bulk operation becomes
|
|
239
256
|
# its own section. The size of the entire bulk write is limited to 48m.
|
|
240
|
-
# With OP_QUERY (pre-3.6 servers), the entire bulk write is sent as a
|
|
241
|
-
# single document and is thus subject to the 16m document size limit.
|
|
242
|
-
# This means the splits differ between pre-3.6 and 3.6+ servers, with
|
|
243
|
-
# 3.6+ servers being able to split less.
|
|
244
257
|
rescue Error::MaxBSONSize, Error::MaxMessageSize => e
|
|
245
258
|
raise e if values.size <= 1
|
|
259
|
+
|
|
246
260
|
unpin_maybe(session, connection) do
|
|
247
261
|
split_execute(name, values, connection, context, operation_id, result_combiner, session, txn_num)
|
|
248
262
|
end
|
|
@@ -253,7 +267,8 @@ module Mongo
|
|
|
253
267
|
end
|
|
254
268
|
|
|
255
269
|
def split_execute(name, values, connection, context, operation_id, result_combiner, session, txn_num)
|
|
256
|
-
execute_operation(name, values.shift(values.size / 2), connection, context, operation_id, result_combiner,
|
|
270
|
+
execute_operation(name, values.shift(values.size / 2), connection, context, operation_id, result_combiner,
|
|
271
|
+
session, txn_num)
|
|
257
272
|
|
|
258
273
|
txn_num = session.next_txn_num if txn_num && !session.in_transaction?
|
|
259
274
|
execute_operation(name, values, connection, context, operation_id, result_combiner, session, txn_num)
|
|
@@ -262,68 +277,51 @@ module Mongo
|
|
|
262
277
|
def delete_one(documents, connection, context, operation_id, session, txn_num)
|
|
263
278
|
QueryCache.clear_namespace(collection.namespace)
|
|
264
279
|
|
|
265
|
-
spec = base_spec(operation_id, session).merge(:
|
|
280
|
+
spec = base_spec(operation_id, session).merge(deletes: documents, txn_num: txn_num)
|
|
266
281
|
Operation::Delete.new(spec).bulk_execute(connection, context: context)
|
|
267
282
|
end
|
|
268
283
|
|
|
269
|
-
def delete_many(documents, connection, context, operation_id, session,
|
|
284
|
+
def delete_many(documents, connection, context, operation_id, session, _txn_num)
|
|
270
285
|
QueryCache.clear_namespace(collection.namespace)
|
|
271
286
|
|
|
272
|
-
spec = base_spec(operation_id, session).merge(:
|
|
287
|
+
spec = base_spec(operation_id, session).merge(deletes: documents)
|
|
273
288
|
Operation::Delete.new(spec).bulk_execute(connection, context: context)
|
|
274
289
|
end
|
|
275
290
|
|
|
276
291
|
def insert_one(documents, connection, context, operation_id, session, txn_num)
|
|
277
292
|
QueryCache.clear_namespace(collection.namespace)
|
|
278
293
|
|
|
279
|
-
spec = base_spec(operation_id, session).merge(:
|
|
294
|
+
spec = base_spec(operation_id, session).merge(documents: documents, txn_num: txn_num)
|
|
280
295
|
Operation::Insert.new(spec).bulk_execute(connection, context: context)
|
|
281
296
|
end
|
|
282
297
|
|
|
283
298
|
def update_one(documents, connection, context, operation_id, session, txn_num)
|
|
284
299
|
QueryCache.clear_namespace(collection.namespace)
|
|
285
300
|
|
|
286
|
-
spec = base_spec(operation_id, session).merge(:
|
|
301
|
+
spec = base_spec(operation_id, session).merge(updates: documents, txn_num: txn_num)
|
|
287
302
|
Operation::Update.new(spec).bulk_execute(connection, context: context)
|
|
288
303
|
end
|
|
289
|
-
alias
|
|
304
|
+
alias replace_one update_one
|
|
290
305
|
|
|
291
|
-
def update_many(documents, connection, context, operation_id, session,
|
|
306
|
+
def update_many(documents, connection, context, operation_id, session, _txn_num)
|
|
292
307
|
QueryCache.clear_namespace(collection.namespace)
|
|
293
308
|
|
|
294
|
-
spec = base_spec(operation_id, session).merge(:
|
|
309
|
+
spec = base_spec(operation_id, session).merge(updates: documents)
|
|
295
310
|
Operation::Update.new(spec).bulk_execute(connection, context: context)
|
|
296
311
|
end
|
|
297
312
|
|
|
298
|
-
private
|
|
299
|
-
|
|
300
|
-
def validate_collation!(connection)
|
|
301
|
-
if op_combiner.has_collation? && !connection.features.collation_enabled?
|
|
302
|
-
raise Error::UnsupportedCollation.new
|
|
303
|
-
end
|
|
304
|
-
end
|
|
305
|
-
|
|
306
|
-
def validate_array_filters!(connection)
|
|
307
|
-
if op_combiner.has_array_filters? && !connection.features.array_filters_enabled?
|
|
308
|
-
raise Error::UnsupportedArrayFilters.new
|
|
309
|
-
end
|
|
310
|
-
end
|
|
311
|
-
|
|
312
313
|
def validate_hint!(connection)
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
raise Error::UnsupportedOption.hint_error
|
|
318
|
-
end
|
|
319
|
-
end
|
|
314
|
+
return unless op_combiner.has_hint?
|
|
315
|
+
return unless !can_hint?(connection) && write_concern && !write_concern.acknowledged?
|
|
316
|
+
|
|
317
|
+
raise Error::UnsupportedOption.hint_error(unacknowledged_write: true)
|
|
320
318
|
end
|
|
321
319
|
|
|
322
320
|
# Loop through the requests and check if each operation is allowed to send
|
|
323
321
|
# a hint for each operation on the given server version.
|
|
324
322
|
#
|
|
325
|
-
# For the following operations, the client can send a hint for
|
|
326
|
-
# and for the rest, the client can only send it for 4.4+:
|
|
323
|
+
# For the following operations, the client can send a hint for all supported
|
|
324
|
+
# server versions, and for the rest, the client can only send it for 4.4+:
|
|
327
325
|
# - updateOne
|
|
328
326
|
# - updateMany
|
|
329
327
|
# - replaceOne
|
|
@@ -333,16 +331,11 @@ module Mongo
|
|
|
333
331
|
# @return [ true | false ] Whether the request is able to send hints for
|
|
334
332
|
# the current server version.
|
|
335
333
|
def can_hint?(connection)
|
|
336
|
-
gte_4_2 = connection.server.description.server_version_gte?('4.2')
|
|
337
334
|
gte_4_4 = connection.server.description.server_version_gte?('4.4')
|
|
338
335
|
op_combiner.requests.all? do |req|
|
|
339
336
|
op = req.keys.first
|
|
340
337
|
if req[op].keys.include?(:hint)
|
|
341
|
-
|
|
342
|
-
gte_4_2
|
|
343
|
-
else
|
|
344
|
-
gte_4_4
|
|
345
|
-
end
|
|
338
|
+
%i[update_one update_many replace_one].include?(op) || gte_4_4
|
|
346
339
|
else
|
|
347
340
|
true
|
|
348
341
|
end
|
|
@@ -368,32 +361,24 @@ module Mongo
|
|
|
368
361
|
@requests.each do |req|
|
|
369
362
|
requests_empty = false
|
|
370
363
|
if op = req.keys.first
|
|
371
|
-
if [
|
|
372
|
-
if doc = maybe_first(req.dig(op, :update))
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
else
|
|
378
|
-
Error::InvalidUpdateDocument.warn(Logger.logger, key)
|
|
379
|
-
end
|
|
380
|
-
end
|
|
381
|
-
end
|
|
364
|
+
if %i[update_one update_many].include?(op)
|
|
365
|
+
if (doc = maybe_first(req.dig(op, :update))) && (key = doc.keys&.first) && !key.to_s.start_with?('$')
|
|
366
|
+
raise Error::InvalidUpdateDocument.new(key: key) if Mongo.validate_update_replace
|
|
367
|
+
|
|
368
|
+
Error::InvalidUpdateDocument.warn(Logger.logger, key)
|
|
369
|
+
|
|
382
370
|
end
|
|
383
371
|
elsif op == :replace_one
|
|
384
|
-
if key = req.dig(op, :replacement)&.keys&.first
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
Error::InvalidReplacementDocument.warn(Logger.logger, key)
|
|
390
|
-
end
|
|
391
|
-
end
|
|
372
|
+
if (key = req.dig(op, :replacement)&.keys&.first) && key.to_s.start_with?('$')
|
|
373
|
+
raise Error::InvalidReplacementDocument.new(key: key) if Mongo.validate_update_replace
|
|
374
|
+
|
|
375
|
+
Error::InvalidReplacementDocument.warn(Logger.logger, key)
|
|
376
|
+
|
|
392
377
|
end
|
|
393
378
|
end
|
|
394
379
|
end
|
|
395
380
|
end.tap do
|
|
396
|
-
raise ArgumentError,
|
|
381
|
+
raise ArgumentError, 'Bulk write requests cannot be empty' if requests_empty
|
|
397
382
|
end
|
|
398
383
|
end
|
|
399
384
|
|
data/lib/mongo/caching_cursor.rb
CHANGED
|
@@ -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
|
#
|
|
@@ -16,13 +15,11 @@
|
|
|
16
15
|
# limitations under the License.
|
|
17
16
|
|
|
18
17
|
module Mongo
|
|
19
|
-
|
|
20
18
|
# A Cursor that attempts to load documents from memory first before hitting
|
|
21
19
|
# the database if the same query has already been executed.
|
|
22
20
|
#
|
|
23
21
|
# @api semiprivate
|
|
24
22
|
class CachingCursor < Cursor
|
|
25
|
-
|
|
26
23
|
# @return [ Array <BSON::Document> ] The cursor's cached documents.
|
|
27
24
|
# @api private
|
|
28
25
|
attr_reader :cached_docs
|
|
@@ -34,11 +31,9 @@ module Mongo
|
|
|
34
31
|
# cursor.each do |doc|
|
|
35
32
|
# # ...
|
|
36
33
|
# end
|
|
37
|
-
def each
|
|
34
|
+
def each(&block)
|
|
38
35
|
if @cached_docs
|
|
39
|
-
@cached_docs.each
|
|
40
|
-
yield doc
|
|
41
|
-
end
|
|
36
|
+
@cached_docs.each(&block)
|
|
42
37
|
|
|
43
38
|
unless closed?
|
|
44
39
|
# StopIteration raised by try_next ends this loop.
|