mongo 2.6.2 → 2.16.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
- checksums.yaml.gz.sig +0 -0
- data/CONTRIBUTING.md +12 -54
- data/LICENSE +1 -1
- data/README.md +70 -43
- data/Rakefile +107 -22
- data/lib/mongo/active_support.rb +20 -0
- data/lib/mongo/address/ipv4.rb +39 -6
- data/lib/mongo/address/ipv6.rb +39 -8
- data/lib/mongo/address/unix.rb +10 -4
- data/lib/mongo/address/validator.rb +102 -0
- data/lib/mongo/address.rb +153 -73
- data/lib/mongo/auth/aws/conversation.rb +128 -0
- data/lib/mongo/auth/aws/credentials_retriever.rb +222 -0
- data/lib/mongo/auth/aws/request.rb +286 -0
- data/lib/mongo/auth/aws.rb +40 -0
- data/lib/mongo/auth/base.rb +138 -0
- data/lib/mongo/auth/conversation_base.rb +87 -0
- data/lib/mongo/auth/cr/conversation.rb +26 -89
- data/lib/mongo/auth/cr.rb +14 -37
- data/lib/mongo/auth/credential_cache.rb +54 -0
- data/lib/mongo/auth/gssapi/conversation.rb +100 -0
- data/lib/mongo/auth/gssapi.rb +41 -0
- data/lib/mongo/auth/ldap/conversation.rb +14 -63
- data/lib/mongo/auth/ldap.rb +14 -35
- data/lib/mongo/auth/roles.rb +4 -1
- data/lib/mongo/auth/sasl_conversation_base.rb +102 -0
- data/lib/mongo/auth/scram/conversation.rb +18 -487
- data/lib/mongo/auth/scram.rb +44 -56
- data/lib/mongo/auth/scram256/conversation.rb +66 -0
- data/lib/mongo/auth/scram256.rb +34 -0
- data/lib/mongo/auth/scram_conversation_base.rb +378 -0
- data/lib/mongo/auth/stringprep/profiles/sasl.rb +5 -1
- data/lib/mongo/auth/stringprep/tables.rb +5 -1
- data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +3 -2
- data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +2 -1
- data/lib/mongo/auth/stringprep.rb +9 -5
- data/lib/mongo/auth/user/view.rb +31 -15
- data/lib/mongo/auth/user.rb +69 -19
- data/lib/mongo/auth/x509/conversation.rb +28 -62
- data/lib/mongo/auth/x509.rb +29 -33
- data/lib/mongo/auth.rb +96 -24
- data/lib/mongo/background_thread.rb +173 -0
- data/lib/mongo/bson.rb +4 -1
- data/lib/mongo/bulk_write/combineable.rb +24 -9
- data/lib/mongo/bulk_write/ordered_combiner.rb +4 -1
- data/lib/mongo/bulk_write/result.rb +5 -2
- data/lib/mongo/bulk_write/result_combiner.rb +18 -5
- data/lib/mongo/bulk_write/transformable.rb +21 -11
- data/lib/mongo/bulk_write/unordered_combiner.rb +4 -1
- data/lib/mongo/bulk_write/validatable.rb +9 -2
- data/lib/mongo/bulk_write.rb +99 -34
- data/lib/mongo/caching_cursor.rb +77 -0
- data/lib/mongo/client.rb +958 -122
- data/lib/mongo/client_encryption.rb +106 -0
- data/lib/mongo/cluster/periodic_executor.rb +39 -40
- data/lib/mongo/cluster/reapers/cursor_reaper.rb +96 -46
- data/lib/mongo/cluster/reapers/socket_reaper.rb +16 -10
- data/lib/mongo/cluster/sdam_flow.rb +626 -0
- data/lib/mongo/cluster/topology/base.rb +225 -0
- data/lib/mongo/cluster/topology/load_balanced.rb +102 -0
- data/lib/mongo/cluster/topology/no_replica_set_options.rb +37 -0
- data/lib/mongo/cluster/topology/replica_set_no_primary.rb +172 -0
- data/lib/mongo/cluster/topology/replica_set_with_primary.rb +30 -0
- data/lib/mongo/cluster/topology/sharded.rb +16 -116
- data/lib/mongo/cluster/topology/single.rb +22 -113
- data/lib/mongo/cluster/topology/unknown.rb +14 -152
- data/lib/mongo/cluster/topology.rb +78 -17
- data/lib/mongo/cluster.rb +833 -317
- data/lib/mongo/cluster_time.rb +142 -0
- data/lib/mongo/collection/view/aggregation.rb +39 -12
- data/lib/mongo/collection/view/builder/aggregation.rb +40 -11
- data/lib/mongo/collection/view/builder/map_reduce.rb +21 -52
- data/lib/mongo/collection/view/builder.rb +4 -5
- data/lib/mongo/collection/view/change_stream/retryable.rb +4 -1
- data/lib/mongo/collection/view/change_stream.rb +102 -79
- data/lib/mongo/collection/view/explainable.rb +32 -10
- data/lib/mongo/collection/view/immutable.rb +5 -2
- data/lib/mongo/collection/view/iterable.rb +144 -25
- data/lib/mongo/collection/view/map_reduce.rb +65 -30
- data/lib/mongo/collection/view/readable.rb +186 -91
- data/lib/mongo/collection/view/writable.rb +271 -123
- data/lib/mongo/collection/view.rb +54 -45
- data/lib/mongo/collection.rb +217 -70
- data/lib/mongo/crypt/auto_decryption_context.rb +43 -0
- data/lib/mongo/crypt/auto_encrypter.rb +182 -0
- data/lib/mongo/crypt/auto_encryption_context.rb +47 -0
- data/lib/mongo/crypt/binary.rb +158 -0
- data/lib/mongo/crypt/binding.rb +1232 -0
- data/lib/mongo/crypt/context.rb +138 -0
- data/lib/mongo/crypt/data_key_context.rb +165 -0
- data/lib/mongo/crypt/encryption_io.rb +309 -0
- data/lib/mongo/crypt/explicit_decryption_context.rb +43 -0
- data/lib/mongo/crypt/explicit_encrypter.rb +120 -0
- data/lib/mongo/crypt/explicit_encryption_context.rb +92 -0
- data/lib/mongo/crypt/handle.rb +318 -0
- data/lib/mongo/crypt/hooks.rb +93 -0
- data/lib/mongo/crypt/kms_context.rb +70 -0
- data/lib/mongo/crypt/status.rb +134 -0
- data/lib/mongo/crypt.rb +36 -0
- data/lib/mongo/cursor/kill_spec.rb +38 -0
- data/lib/mongo/cursor.rb +245 -82
- data/lib/mongo/database/view.rb +97 -20
- data/lib/mongo/database.rb +177 -29
- data/lib/mongo/dbref.rb +13 -3
- data/lib/mongo/distinguishing_semaphore.rb +58 -0
- data/lib/mongo/error/auth_error.rb +32 -0
- data/lib/mongo/error/bad_load_balancer_target.rb +26 -0
- data/lib/mongo/error/bulk_write_error.rb +37 -2
- data/lib/mongo/error/change_stream_resumable.rb +4 -1
- data/lib/mongo/error/closed_stream.rb +4 -1
- data/lib/mongo/error/connection_check_out_timeout.rb +51 -0
- data/lib/mongo/error/connection_perished.rb +26 -0
- data/lib/mongo/error/credential_check_error.rb +29 -0
- data/lib/mongo/error/crypt_error.rb +34 -0
- data/lib/mongo/error/extra_file_chunk.rb +4 -1
- data/lib/mongo/error/failed_string_prep_validation.rb +41 -0
- data/lib/mongo/error/file_not_found.rb +4 -1
- data/lib/mongo/error/handshake_error.rb +27 -0
- data/lib/mongo/error/insufficient_iteration_count.rb +4 -1
- data/lib/mongo/error/internal_driver_error.rb +25 -0
- data/lib/mongo/error/invalid_address.rb +27 -0
- data/lib/mongo/error/invalid_application_name.rb +4 -1
- data/lib/mongo/error/invalid_bulk_operation.rb +4 -1
- data/lib/mongo/error/invalid_bulk_operation_type.rb +4 -1
- data/lib/mongo/error/invalid_collection_name.rb +4 -1
- data/lib/mongo/error/invalid_cursor_operation.rb +30 -0
- data/lib/mongo/error/invalid_database_name.rb +4 -1
- data/lib/mongo/error/invalid_document.rb +4 -1
- data/lib/mongo/error/invalid_file.rb +4 -1
- data/lib/mongo/error/invalid_file_revision.rb +4 -1
- data/lib/mongo/error/invalid_min_pool_size.rb +4 -1
- data/lib/mongo/error/invalid_nonce.rb +5 -2
- data/lib/mongo/error/invalid_read_concern.rb +31 -0
- data/lib/mongo/error/invalid_read_option.rb +4 -1
- data/lib/mongo/error/invalid_replacement_document.rb +4 -1
- data/lib/mongo/error/invalid_server_auth_host.rb +25 -0
- data/lib/mongo/error/invalid_server_auth_response.rb +26 -0
- data/lib/mongo/error/invalid_server_preference.rb +10 -1
- data/lib/mongo/error/invalid_session.rb +6 -2
- data/lib/mongo/error/invalid_signature.rb +4 -1
- data/lib/mongo/error/invalid_transaction_operation.rb +5 -2
- data/lib/mongo/error/invalid_txt_record.rb +4 -1
- data/lib/mongo/error/invalid_update_document.rb +4 -1
- data/lib/mongo/error/invalid_uri.rb +4 -1
- data/lib/mongo/error/invalid_write_concern.rb +6 -3
- data/lib/mongo/error/kms_error.rb +25 -0
- data/lib/mongo/error/lint_error.rb +4 -1
- data/lib/mongo/error/max_bson_size.rb +18 -4
- data/lib/mongo/error/max_message_size.rb +4 -1
- data/lib/mongo/error/mismatched_domain.rb +4 -1
- data/lib/mongo/error/missing_file_chunk.rb +4 -1
- data/lib/mongo/error/missing_password.rb +32 -0
- data/lib/mongo/error/missing_resume_token.rb +4 -1
- data/lib/mongo/error/missing_scram_server_signature.rb +30 -0
- data/lib/mongo/error/missing_service_id.rb +26 -0
- data/lib/mongo/error/mongocryptd_spawn_error.rb +25 -0
- data/lib/mongo/error/multi_index_drop.rb +4 -1
- data/lib/mongo/error/need_primary_server.rb +4 -1
- data/lib/mongo/error/no_server_available.rb +17 -5
- data/lib/mongo/error/no_service_connection_available.rb +49 -0
- data/lib/mongo/error/no_srv_records.rb +4 -1
- data/lib/mongo/error/notable.rb +90 -0
- data/lib/mongo/error/operation_failure.rb +168 -45
- data/lib/mongo/error/parser.rb +174 -19
- data/lib/mongo/error/pool_closed_error.rb +53 -0
- data/lib/mongo/error/raise_original_error.rb +32 -0
- data/lib/mongo/error/sdam_error_detection.rb +83 -0
- data/lib/mongo/error/server_api_conflict.rb +26 -0
- data/lib/mongo/error/server_api_not_supported.rb +27 -0
- data/lib/mongo/error/server_certificate_revoked.rb +25 -0
- data/lib/mongo/error/session_ended.rb +30 -0
- data/lib/mongo/error/sessions_not_supported.rb +38 -0
- data/lib/mongo/error/socket_error.rb +4 -1
- data/lib/mongo/error/socket_timeout_error.rb +4 -1
- data/lib/mongo/error/unchangeable_collection_option.rb +4 -1
- data/lib/mongo/error/unexpected_chunk_length.rb +4 -1
- data/lib/mongo/error/unexpected_response.rb +4 -1
- data/lib/mongo/error/unknown_payload_type.rb +4 -1
- data/lib/mongo/error/unmet_dependency.rb +24 -0
- data/lib/mongo/error/unsupported_array_filters.rb +10 -2
- data/lib/mongo/error/unsupported_collation.rb +10 -2
- data/lib/mongo/error/unsupported_features.rb +4 -1
- data/lib/mongo/error/unsupported_message_type.rb +4 -1
- data/lib/mongo/error/unsupported_option.rb +104 -0
- data/lib/mongo/error/write_retryable.rb +4 -1
- data/lib/mongo/error.rb +82 -7
- data/lib/mongo/event/base.rb +15 -3
- data/lib/mongo/event/listeners.rb +4 -1
- data/lib/mongo/event/publisher.rb +4 -1
- data/lib/mongo/event/subscriber.rb +4 -1
- data/lib/mongo/event.rb +8 -7
- data/lib/mongo/grid/file/chunk.rb +8 -5
- data/lib/mongo/grid/file/info.rb +14 -4
- data/lib/mongo/grid/file.rb +9 -1
- data/lib/mongo/grid/fs_bucket.rb +143 -62
- data/lib/mongo/grid/stream/read.rb +68 -31
- data/lib/mongo/grid/stream/write.rb +34 -9
- data/lib/mongo/grid/stream.rb +4 -1
- data/lib/mongo/grid.rb +4 -1
- data/lib/mongo/id.rb +69 -0
- data/lib/mongo/index/view.rb +94 -46
- data/lib/mongo/index.rb +5 -1
- data/lib/mongo/lint.rb +65 -5
- data/lib/mongo/loggable.rb +9 -2
- data/lib/mongo/logger.rb +7 -6
- data/lib/mongo/monitoring/cmap_log_subscriber.rb +56 -0
- data/lib/mongo/monitoring/command_log_subscriber.rb +24 -4
- data/lib/mongo/monitoring/event/cmap/base.rb +31 -0
- data/lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb +88 -0
- data/lib/mongo/monitoring/event/cmap/connection_check_out_started.rb +59 -0
- data/lib/mongo/monitoring/event/cmap/connection_checked_in.rb +74 -0
- data/lib/mongo/monitoring/event/cmap/connection_checked_out.rb +75 -0
- data/lib/mongo/monitoring/event/cmap/connection_closed.rb +106 -0
- data/lib/mongo/monitoring/event/cmap/connection_created.rb +67 -0
- data/lib/mongo/monitoring/event/cmap/connection_ready.rb +67 -0
- data/lib/mongo/monitoring/event/cmap/pool_cleared.rb +63 -0
- data/lib/mongo/monitoring/event/cmap/pool_closed.rb +68 -0
- data/lib/mongo/monitoring/event/cmap/pool_created.rb +75 -0
- data/lib/mongo/monitoring/event/cmap.rb +28 -0
- data/lib/mongo/monitoring/event/command_failed.rb +44 -6
- data/lib/mongo/monitoring/event/command_started.rb +90 -5
- data/lib/mongo/monitoring/event/command_succeeded.rb +41 -4
- data/lib/mongo/monitoring/event/secure.rb +45 -5
- data/lib/mongo/monitoring/event/server_closed.rb +17 -1
- data/lib/mongo/monitoring/event/server_description_changed.rb +43 -2
- data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +92 -0
- data/lib/mongo/monitoring/event/server_heartbeat_started.rb +65 -0
- data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +84 -0
- data/lib/mongo/monitoring/event/server_opening.rb +11 -4
- data/lib/mongo/monitoring/event/topology_changed.rb +12 -6
- data/lib/mongo/monitoring/event/topology_closed.rb +17 -1
- data/lib/mongo/monitoring/event/topology_opening.rb +11 -4
- data/lib/mongo/monitoring/event.rb +8 -1
- data/lib/mongo/monitoring/publishable.rb +49 -49
- data/lib/mongo/monitoring/sdam_log_subscriber.rb +4 -1
- data/lib/mongo/monitoring/server_closed_log_subscriber.rb +4 -1
- data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +13 -2
- data/lib/mongo/monitoring/server_opening_log_subscriber.rb +4 -1
- data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +8 -5
- data/lib/mongo/monitoring/topology_closed_log_subscriber.rb +33 -0
- data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +5 -2
- data/lib/mongo/monitoring/unified_sdam_log_subscriber.rb +65 -0
- data/lib/mongo/monitoring.rb +116 -10
- data/lib/mongo/operation/aggregate/command.rb +17 -21
- data/lib/mongo/operation/aggregate/op_msg.rb +7 -30
- data/lib/mongo/operation/aggregate/result.rb +28 -11
- data/lib/mongo/operation/aggregate.rb +6 -20
- data/lib/mongo/operation/collections_info/command.rb +48 -0
- data/lib/mongo/operation/collections_info/result.rb +23 -3
- data/lib/mongo/operation/collections_info.rb +18 -29
- data/lib/mongo/operation/command/command.rb +6 -3
- data/lib/mongo/operation/command/op_msg.rb +5 -27
- data/lib/mongo/operation/command.rb +5 -19
- data/lib/mongo/operation/context.rb +120 -0
- data/lib/mongo/operation/count/command.rb +12 -3
- data/lib/mongo/operation/count/op_msg.rb +7 -7
- data/lib/mongo/operation/count.rb +5 -19
- data/lib/mongo/operation/create/command.rb +13 -4
- data/lib/mongo/operation/create/op_msg.rb +9 -16
- data/lib/mongo/operation/create.rb +5 -19
- data/lib/mongo/operation/create_index/command.rb +24 -5
- data/lib/mongo/operation/create_index/op_msg.rb +24 -20
- data/lib/mongo/operation/create_index.rb +5 -19
- data/lib/mongo/operation/create_user/command.rb +8 -4
- data/lib/mongo/operation/create_user/op_msg.rb +7 -19
- data/lib/mongo/operation/create_user.rb +5 -19
- data/lib/mongo/operation/delete/bulk_result.rb +7 -2
- data/lib/mongo/operation/delete/command.rb +15 -22
- data/lib/mongo/operation/delete/legacy.rb +15 -20
- data/lib/mongo/operation/delete/op_msg.rb +20 -28
- data/lib/mongo/operation/delete/result.rb +9 -3
- data/lib/mongo/operation/delete.rb +4 -1
- data/lib/mongo/operation/distinct/command.rb +12 -3
- data/lib/mongo/operation/distinct/op_msg.rb +9 -16
- data/lib/mongo/operation/distinct.rb +5 -19
- data/lib/mongo/operation/drop/command.rb +6 -3
- data/lib/mongo/operation/drop/op_msg.rb +6 -20
- data/lib/mongo/operation/drop.rb +5 -19
- data/lib/mongo/operation/drop_database/command.rb +6 -3
- data/lib/mongo/operation/drop_database/op_msg.rb +6 -20
- data/lib/mongo/operation/drop_database.rb +5 -19
- data/lib/mongo/operation/drop_index/command.rb +7 -4
- data/lib/mongo/operation/drop_index/op_msg.rb +7 -19
- data/lib/mongo/operation/drop_index.rb +5 -19
- data/lib/mongo/operation/explain/command.rb +23 -19
- data/lib/mongo/operation/explain/legacy.rb +18 -19
- data/lib/mongo/operation/explain/op_msg.rb +17 -26
- data/lib/mongo/operation/explain/result.rb +8 -2
- data/lib/mongo/operation/explain.rb +5 -21
- data/lib/mongo/operation/find/builder/command.rb +110 -0
- data/lib/mongo/operation/find/builder/flags.rb +61 -0
- data/lib/mongo/operation/find/builder/legacy.rb +123 -0
- data/lib/mongo/operation/find/builder/modifiers.rb +89 -0
- data/lib/mongo/operation/find/builder.rb +21 -0
- data/lib/mongo/operation/find/command.rb +16 -19
- data/lib/mongo/operation/find/legacy/result.rb +8 -2
- data/lib/mongo/operation/find/legacy.rb +16 -19
- data/lib/mongo/operation/find/op_msg.rb +17 -33
- data/lib/mongo/operation/find/result.rb +18 -2
- data/lib/mongo/operation/find.rb +6 -21
- data/lib/mongo/operation/get_more/command.rb +8 -19
- data/lib/mongo/operation/get_more/command_builder.rb +38 -0
- data/lib/mongo/operation/get_more/legacy.rb +5 -2
- data/lib/mongo/operation/get_more/op_msg.rb +10 -37
- data/lib/mongo/operation/get_more/result.rb +17 -2
- data/lib/mongo/operation/get_more.rb +6 -11
- data/lib/mongo/operation/indexes/command.rb +7 -19
- data/lib/mongo/operation/indexes/legacy.rb +11 -20
- data/lib/mongo/operation/indexes/op_msg.rb +7 -30
- data/lib/mongo/operation/indexes/result.rb +10 -2
- data/lib/mongo/operation/indexes.rb +15 -17
- data/lib/mongo/operation/insert/bulk_result.rb +15 -3
- data/lib/mongo/operation/insert/command.rb +14 -20
- data/lib/mongo/operation/insert/legacy.rb +15 -19
- data/lib/mongo/operation/insert/op_msg.rb +17 -27
- data/lib/mongo/operation/insert/result.rb +16 -5
- data/lib/mongo/operation/insert.rb +6 -2
- data/lib/mongo/operation/kill_cursors/command.rb +14 -3
- data/lib/mongo/operation/kill_cursors/command_builder.rb +35 -0
- data/lib/mongo/operation/kill_cursors/legacy.rb +7 -3
- data/lib/mongo/operation/kill_cursors/op_msg.rb +12 -16
- data/lib/mongo/operation/kill_cursors.rb +6 -21
- data/lib/mongo/operation/list_collections/command.rb +9 -23
- data/lib/mongo/operation/list_collections/op_msg.rb +9 -31
- data/lib/mongo/operation/list_collections/result.rb +20 -3
- data/lib/mongo/operation/list_collections.rb +5 -19
- data/lib/mongo/operation/map_reduce/command.rb +15 -19
- data/lib/mongo/operation/map_reduce/op_msg.rb +8 -31
- data/lib/mongo/operation/map_reduce/result.rb +15 -2
- data/lib/mongo/operation/map_reduce.rb +5 -19
- data/lib/mongo/operation/op_msg_base.rb +33 -0
- data/lib/mongo/operation/parallel_scan/command.rb +13 -23
- data/lib/mongo/operation/parallel_scan/op_msg.rb +12 -30
- data/lib/mongo/operation/parallel_scan/result.rb +9 -2
- data/lib/mongo/operation/parallel_scan.rb +5 -19
- data/lib/mongo/operation/remove_user/command.rb +8 -4
- data/lib/mongo/operation/remove_user/op_msg.rb +7 -19
- data/lib/mongo/operation/remove_user.rb +5 -19
- data/lib/mongo/operation/result.rb +157 -40
- data/lib/mongo/operation/shared/bypass_document_validation.rb +14 -4
- data/lib/mongo/operation/shared/causal_consistency_supported.rb +19 -7
- data/lib/mongo/operation/shared/executable.rb +97 -13
- data/lib/mongo/operation/shared/executable_no_validate.rb +32 -0
- data/lib/mongo/operation/shared/executable_transaction_label.rb +30 -0
- data/lib/mongo/operation/shared/idable.rb +6 -2
- data/lib/mongo/operation/shared/limited.rb +14 -2
- data/lib/mongo/operation/shared/object_id_generator.rb +5 -1
- data/lib/mongo/operation/shared/op_msg_or_command.rb +41 -0
- data/lib/mongo/operation/shared/op_msg_or_find_command.rb +44 -0
- data/lib/mongo/operation/shared/polymorphic_lookup.rb +36 -0
- data/lib/mongo/operation/shared/polymorphic_operation.rb +42 -0
- data/lib/mongo/operation/shared/polymorphic_result.rb +50 -0
- data/lib/mongo/operation/shared/read_preference_supported.rb +82 -23
- data/lib/mongo/operation/shared/response_handling.rb +173 -0
- data/lib/mongo/operation/shared/result/aggregatable.rb +8 -9
- data/lib/mongo/operation/shared/result/use_legacy_error_parser.rb +32 -0
- data/lib/mongo/operation/shared/sessions_supported.rb +152 -46
- data/lib/mongo/operation/shared/specifiable.rb +40 -56
- data/lib/mongo/operation/shared/validatable.rb +87 -0
- data/lib/mongo/operation/shared/write.rb +33 -24
- data/lib/mongo/operation/shared/write_concern_supported.rb +10 -6
- data/lib/mongo/operation/update/bulk_result.rb +5 -2
- data/lib/mongo/operation/update/command.rb +15 -22
- data/lib/mongo/operation/update/legacy/result.rb +13 -2
- data/lib/mongo/operation/update/legacy.rb +25 -29
- data/lib/mongo/operation/update/op_msg.rb +18 -30
- data/lib/mongo/operation/update/result.rb +14 -3
- data/lib/mongo/operation/update.rb +4 -1
- data/lib/mongo/operation/update_user/command.rb +8 -4
- data/lib/mongo/operation/update_user/op_msg.rb +7 -19
- data/lib/mongo/operation/update_user.rb +5 -19
- data/lib/mongo/operation/users_info/command.rb +8 -20
- data/lib/mongo/operation/users_info/op_msg.rb +8 -29
- data/lib/mongo/operation/users_info/result.rb +8 -2
- data/lib/mongo/operation/users_info.rb +5 -19
- data/lib/mongo/operation/write_command/command.rb +51 -0
- data/lib/mongo/operation/write_command/op_msg.rb +43 -0
- data/lib/mongo/operation/write_command.rb +32 -0
- data/lib/mongo/operation.rb +26 -1
- data/lib/mongo/options/mapper.rb +13 -3
- data/lib/mongo/options/redacted.rb +4 -1
- data/lib/mongo/options.rb +4 -1
- data/lib/mongo/protocol/bit_vector.rb +6 -2
- data/lib/mongo/protocol/compressed.rb +62 -14
- data/lib/mongo/protocol/delete.rb +4 -1
- data/lib/mongo/protocol/get_more.rb +6 -2
- data/lib/mongo/protocol/insert.rb +7 -2
- data/lib/mongo/protocol/kill_cursors.rb +10 -14
- data/lib/mongo/protocol/message.rb +161 -29
- data/lib/mongo/protocol/msg.rb +271 -41
- data/lib/mongo/protocol/query.rb +98 -43
- data/lib/mongo/protocol/registry.rb +4 -1
- data/lib/mongo/protocol/reply.rb +4 -1
- data/lib/mongo/protocol/serializers.rb +67 -20
- data/lib/mongo/protocol/update.rb +10 -3
- data/lib/mongo/protocol.rb +3 -0
- data/lib/mongo/query_cache.rb +275 -0
- data/lib/mongo/retryable.rb +391 -72
- data/lib/mongo/semaphore.rb +49 -0
- data/lib/mongo/server/app_metadata.rb +267 -0
- data/lib/mongo/server/connection.rb +197 -135
- data/lib/mongo/server/connection_base.rb +276 -0
- data/lib/mongo/server/connection_common.rb +205 -0
- data/lib/mongo/server/connection_pool/generation_manager.rb +71 -0
- data/lib/mongo/server/connection_pool/populator.rb +61 -0
- data/lib/mongo/server/connection_pool.rb +792 -58
- data/lib/mongo/server/description/features.rb +50 -17
- data/lib/mongo/server/description/load_balancer.rb +33 -0
- data/lib/mongo/server/description.rb +314 -75
- data/lib/mongo/server/monitor/app_metadata.rb +37 -0
- data/lib/mongo/server/monitor/connection.rb +178 -112
- data/lib/mongo/server/monitor.rb +246 -110
- data/lib/mongo/server/pending_connection.rb +288 -0
- data/lib/mongo/server/push_monitor/connection.rb +31 -0
- data/lib/mongo/server/push_monitor.rb +194 -0
- data/lib/mongo/server/round_trip_time_averager.rb +76 -0
- data/lib/mongo/server.rb +416 -73
- data/lib/mongo/server_selector/base.rb +629 -0
- data/lib/mongo/server_selector/nearest.rb +32 -25
- data/lib/mongo/server_selector/primary.rb +30 -32
- data/lib/mongo/server_selector/primary_preferred.rb +38 -29
- data/lib/mongo/server_selector/secondary.rb +32 -25
- data/lib/mongo/server_selector/secondary_preferred.rb +30 -38
- data/lib/mongo/server_selector.rb +15 -2
- data/lib/mongo/session/server_session.rb +21 -7
- data/lib/mongo/session/session_pool.rb +32 -9
- data/lib/mongo/session.rb +747 -375
- data/lib/mongo/socket/ocsp_cache.rb +100 -0
- data/lib/mongo/socket/ocsp_verifier.rb +345 -0
- data/lib/mongo/socket/ssl.rb +285 -69
- data/lib/mongo/socket/tcp.rb +49 -33
- data/lib/mongo/socket/unix.rb +24 -34
- data/lib/mongo/socket.rb +218 -48
- data/lib/mongo/srv/monitor.rb +113 -0
- data/lib/mongo/srv/resolver.rb +137 -0
- data/lib/mongo/srv/result.rb +128 -0
- data/lib/mongo/srv.rb +20 -0
- data/lib/mongo/timeout.rb +54 -0
- data/lib/mongo/topology_version.rb +92 -0
- data/lib/mongo/uri/options_mapper.rb +624 -0
- data/lib/mongo/uri/srv_protocol.rb +141 -60
- data/lib/mongo/uri.rb +194 -302
- data/lib/mongo/utils.rb +111 -0
- data/lib/mongo/version.rb +5 -2
- data/lib/mongo/write_concern/acknowledged.rb +17 -4
- data/lib/mongo/write_concern/base.rb +70 -0
- data/lib/mongo/write_concern/unacknowledged.rb +17 -4
- data/lib/mongo/write_concern.rb +19 -35
- data/lib/mongo.rb +65 -3
- data/mongo.gemspec +15 -9
- data/spec/NOTES.aws-auth.md +296 -0
- data/spec/README.aws-auth.md +318 -0
- data/spec/README.md +715 -0
- data/spec/USERS.md +72 -0
- data/spec/atlas/atlas_connectivity_spec.rb +10 -37
- data/spec/atlas/operations_spec.rb +28 -0
- data/spec/integration/auth_spec.rb +309 -0
- data/spec/integration/awaited_ismaster_spec.rb +31 -0
- data/spec/integration/aws_auth_request_spec.rb +77 -0
- data/spec/integration/aws_credentials_retriever_spec.rb +106 -0
- data/spec/integration/bson_symbol_spec.rb +39 -0
- data/spec/integration/bulk_insert_spec.rb +8 -3
- data/spec/integration/bulk_write_error_message_spec.rb +41 -0
- data/spec/integration/bulk_write_spec.rb +70 -0
- data/spec/integration/change_stream_examples_spec.rb +60 -42
- data/spec/integration/change_stream_spec.rb +499 -56
- data/spec/integration/check_clean_slate_spec.rb +19 -0
- data/spec/integration/client_authentication_options_spec.rb +514 -0
- data/spec/integration/client_connectivity_spec.rb +41 -0
- data/spec/integration/client_construction_aws_auth_spec.rb +194 -0
- data/spec/integration/client_construction_spec.rb +293 -0
- data/spec/integration/client_side_encryption/auto_encryption_bulk_writes_spec.rb +360 -0
- data/spec/integration/client_side_encryption/auto_encryption_command_monitoring_spec.rb +306 -0
- data/spec/integration/client_side_encryption/auto_encryption_mongocryptd_spawn_spec.rb +75 -0
- data/spec/integration/client_side_encryption/auto_encryption_old_wire_version_spec.rb +82 -0
- data/spec/integration/client_side_encryption/auto_encryption_reconnect_spec.rb +224 -0
- data/spec/integration/client_side_encryption/auto_encryption_spec.rb +604 -0
- data/spec/integration/client_side_encryption/bson_size_limit_spec.rb +190 -0
- data/spec/integration/client_side_encryption/bypass_mongocryptd_spawn_spec.rb +81 -0
- data/spec/integration/client_side_encryption/client_close_spec.rb +66 -0
- data/spec/integration/client_side_encryption/corpus_spec.rb +236 -0
- data/spec/integration/client_side_encryption/custom_endpoint_spec.rb +135 -0
- data/spec/integration/client_side_encryption/data_key_spec.rb +168 -0
- data/spec/integration/client_side_encryption/explicit_encryption_spec.rb +117 -0
- data/spec/integration/client_side_encryption/external_key_vault_spec.rb +144 -0
- data/spec/integration/client_side_encryption/views_spec.rb +47 -0
- data/spec/integration/client_spec.rb +49 -0
- data/spec/integration/client_update_spec.rb +157 -0
- data/spec/integration/collection_indexes_prose_spec.rb +58 -0
- data/spec/integration/command_monitoring_spec.rb +145 -53
- data/spec/integration/command_spec.rb +179 -0
- data/spec/integration/connect_single_rs_name_spec.rb +75 -0
- data/spec/integration/connection_pool_populator_spec.rb +305 -0
- data/spec/integration/connection_spec.rb +353 -0
- data/spec/integration/crud_spec.rb +366 -0
- data/spec/integration/cursor_pinning_spec.rb +121 -0
- data/spec/integration/cursor_reaping_spec.rb +143 -0
- data/spec/integration/docs_examples_spec.rb +18 -5
- data/spec/integration/error_detection_spec.rb +42 -0
- data/spec/integration/fork_reconnect_spec.rb +200 -0
- data/spec/integration/get_more_spec.rb +42 -0
- data/spec/integration/grid_fs_bucket_spec.rb +51 -0
- data/spec/integration/heartbeat_events_spec.rb +102 -0
- data/spec/integration/map_reduce_spec.rb +77 -0
- data/spec/integration/mmapv1_spec.rb +31 -0
- data/spec/integration/mongos_pinning_spec.rb +37 -0
- data/spec/integration/ocsp_connectivity_spec.rb +29 -0
- data/spec/integration/ocsp_verifier_cache_spec.rb +191 -0
- data/spec/integration/ocsp_verifier_spec.rb +355 -0
- data/spec/integration/operation_failure_code_spec.rb +29 -0
- data/spec/integration/operation_failure_message_spec.rb +90 -0
- data/spec/integration/query_cache_spec.rb +1093 -0
- data/spec/integration/query_cache_transactions_spec.rb +193 -0
- data/spec/integration/read_concern_spec.rb +92 -0
- data/spec/integration/read_preference_spec.rb +544 -0
- data/spec/integration/reconnect_spec.rb +176 -12
- data/spec/integration/retryable_errors_spec.rb +286 -0
- data/spec/integration/retryable_writes/retryable_writes_36_and_older_spec.rb +764 -0
- data/spec/integration/retryable_writes/retryable_writes_40_and_newer_spec.rb +405 -0
- data/spec/integration/retryable_writes/shared/adds_diagnostics.rb +18 -0
- data/spec/integration/retryable_writes/shared/does_not_support_retries.rb +27 -0
- data/spec/integration/retryable_writes/shared/only_supports_legacy_retries.rb +28 -0
- data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +220 -0
- data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +235 -0
- data/spec/integration/retryable_writes/shared/performs_no_retries.rb +113 -0
- data/spec/integration/retryable_writes/shared/supports_legacy_retries.rb +22 -0
- data/spec/integration/retryable_writes/shared/supports_modern_retries.rb +28 -0
- data/spec/integration/retryable_writes/shared/supports_retries.rb +19 -0
- data/spec/integration/retryable_writes_errors_spec.rb +34 -0
- data/spec/integration/sdam_error_handling_spec.rb +426 -0
- data/spec/integration/sdam_events_spec.rb +138 -0
- data/spec/integration/sdam_prose_spec.rb +67 -0
- data/spec/integration/secondary_reads_spec.rb +102 -0
- data/spec/integration/server_description_spec.rb +48 -0
- data/spec/integration/server_monitor_spec.rb +56 -0
- data/spec/integration/server_selection_spec.rb +39 -0
- data/spec/integration/server_selector_spec.rb +105 -0
- data/spec/integration/server_spec.rb +69 -0
- data/spec/integration/shell_examples_spec.rb +3 -0
- data/spec/integration/size_limit_spec.rb +115 -0
- data/spec/integration/snappy_compression_spec.rb +28 -0
- data/spec/integration/srv_monitoring_spec.rb +406 -0
- data/spec/integration/srv_spec.rb +59 -0
- data/spec/integration/ssl_uri_options_spec.rb +28 -0
- data/spec/integration/step_down_spec.rb +207 -0
- data/spec/integration/time_zone_querying_spec.rb +55 -0
- data/spec/integration/transaction_pinning_spec.rb +120 -0
- data/spec/integration/transactions_api_examples_spec.rb +62 -0
- data/spec/integration/transactions_examples_spec.rb +42 -19
- data/spec/integration/truncated_utf8_spec.rb +26 -0
- data/spec/integration/versioned_api_examples_spec.rb +114 -0
- data/spec/integration/x509_auth_spec.rb +112 -0
- data/spec/integration/zlib_compression_spec.rb +28 -0
- data/spec/integration/zstd_compression_spec.rb +29 -0
- data/spec/kerberos/kerberos_spec.rb +94 -0
- data/spec/lite_spec_helper.rb +146 -47
- data/spec/mongo/address/ipv4_spec.rb +8 -1
- data/spec/mongo/address/ipv6_spec.rb +7 -0
- data/spec/mongo/address/unix_spec.rb +4 -0
- data/spec/mongo/address/validator_spec.rb +54 -0
- data/spec/mongo/address_spec.rb +52 -21
- data/spec/mongo/auth/aws/request_region_spec.rb +45 -0
- data/spec/mongo/auth/aws/request_spec.rb +79 -0
- data/spec/mongo/auth/cr_spec.rb +26 -38
- data/spec/mongo/auth/gssapi/conversation_spec.rb +124 -0
- data/spec/mongo/auth/invalid_mechanism_spec.rb +14 -0
- data/spec/mongo/auth/ldap/conversation_spec.rb +6 -3
- data/spec/mongo/auth/ldap_spec.rb +19 -34
- data/spec/mongo/auth/scram/conversation_spec.rb +124 -323
- data/spec/mongo/auth/scram256/conversation_spec.rb +174 -0
- data/spec/mongo/auth/scram_negotiation_spec.rb +531 -0
- data/spec/mongo/auth/scram_spec.rb +61 -108
- data/spec/mongo/auth/stringprep/profiles/sasl_spec.rb +3 -0
- data/spec/mongo/auth/stringprep_spec.rb +3 -0
- data/spec/mongo/auth/user/view_spec.rb +162 -19
- data/spec/mongo/auth/user_spec.rb +164 -11
- data/spec/mongo/auth/x509/conversation_spec.rb +8 -5
- data/spec/mongo/auth/x509_spec.rb +43 -32
- data/spec/mongo/auth_spec.rb +7 -4
- data/spec/mongo/bson_spec.rb +3 -0
- data/spec/mongo/bulk_write/ordered_combiner_spec.rb +9 -6
- data/spec/mongo/bulk_write/result_spec.rb +14 -7
- data/spec/mongo/bulk_write/unordered_combiner_spec.rb +7 -4
- data/spec/mongo/bulk_write_spec.rb +333 -129
- data/spec/mongo/caching_cursor_spec.rb +73 -0
- data/spec/mongo/client_construction_spec.rb +2620 -0
- data/spec/mongo/client_encryption_spec.rb +414 -0
- data/spec/mongo/client_spec.rb +259 -1034
- data/spec/mongo/cluster/cursor_reaper_spec.rb +53 -31
- data/spec/mongo/cluster/periodic_executor_spec.rb +21 -0
- data/spec/mongo/cluster/socket_reaper_spec.rb +18 -4
- data/spec/mongo/cluster/topology/replica_set_spec.rb +253 -267
- data/spec/mongo/cluster/topology/sharded_spec.rb +59 -55
- data/spec/mongo/cluster/topology/single_spec.rb +94 -31
- data/spec/mongo/cluster/topology/unknown_spec.rb +33 -115
- data/spec/mongo/cluster/topology_spec.rb +114 -13
- data/spec/mongo/cluster_spec.rb +400 -262
- data/spec/mongo/cluster_time_spec.rb +151 -0
- data/spec/mongo/collection/view/aggregation_spec.rb +65 -32
- data/spec/mongo/collection/view/builder/find_command_spec.rb +24 -6
- data/spec/mongo/collection/view/builder/op_query_spec.rb +7 -0
- data/spec/mongo/collection/view/change_stream_resume_spec.rb +397 -0
- data/spec/mongo/collection/view/change_stream_spec.rb +70 -282
- data/spec/mongo/collection/view/explainable_spec.rb +91 -5
- data/spec/mongo/collection/view/immutable_spec.rb +4 -1
- data/spec/mongo/collection/view/iterable_spec.rb +41 -0
- data/spec/mongo/collection/view/map_reduce_spec.rb +64 -27
- data/spec/mongo/collection/view/readable_spec.rb +133 -45
- data/spec/mongo/collection/view/writable_spec.rb +276 -34
- data/spec/mongo/collection/view_spec.rb +13 -9
- data/spec/mongo/collection_crud_spec.rb +4365 -0
- data/spec/mongo/collection_ddl_spec.rb +537 -0
- data/spec/mongo/collection_spec.rb +326 -4242
- data/spec/mongo/crypt/auto_decryption_context_spec.rb +93 -0
- data/spec/mongo/crypt/auto_encrypter_spec.rb +190 -0
- data/spec/mongo/crypt/auto_encryption_context_spec.rb +110 -0
- data/spec/mongo/crypt/binary_spec.rb +113 -0
- data/spec/mongo/crypt/binding/binary_spec.rb +54 -0
- data/spec/mongo/crypt/binding/context_spec.rb +255 -0
- data/spec/mongo/crypt/binding/helpers_spec.rb +44 -0
- data/spec/mongo/crypt/binding/mongocrypt_spec.rb +142 -0
- data/spec/mongo/crypt/binding/status_spec.rb +97 -0
- data/spec/mongo/crypt/binding/version_spec.rb +20 -0
- data/spec/mongo/crypt/binding_unloaded_spec.rb +23 -0
- data/spec/mongo/crypt/data_key_context_spec.rb +216 -0
- data/spec/mongo/crypt/encryption_io_spec.rb +139 -0
- data/spec/mongo/crypt/explicit_decryption_context_spec.rb +75 -0
- data/spec/mongo/crypt/explicit_encryption_context_spec.rb +173 -0
- data/spec/mongo/crypt/handle_spec.rb +235 -0
- data/spec/mongo/crypt/helpers/mongo_crypt_spec_helper.rb +111 -0
- data/spec/mongo/crypt/status_spec.rb +150 -0
- data/spec/mongo/cursor/builder/get_more_command_spec.rb +20 -4
- data/spec/mongo/cursor/builder/op_get_more_spec.rb +20 -4
- data/spec/mongo/cursor_spec.rb +315 -49
- data/spec/mongo/database_spec.rb +749 -73
- data/spec/mongo/dbref_spec.rb +3 -0
- data/spec/mongo/distinguishing_semaphore_spec.rb +66 -0
- data/spec/mongo/error/bulk_write_error_spec.rb +52 -0
- data/spec/mongo/error/crypt_error_spec.rb +29 -0
- data/spec/mongo/error/max_bson_size_spec.rb +38 -0
- data/spec/mongo/error/no_server_available_spec.rb +35 -0
- data/spec/mongo/error/notable_spec.rb +62 -0
- data/spec/mongo/error/operation_failure_heavy_spec.rb +61 -0
- data/spec/mongo/error/operation_failure_spec.rb +439 -38
- data/spec/mongo/error/parser_spec.rb +325 -31
- data/spec/mongo/error/unsupported_option_spec.rb +57 -0
- data/spec/mongo/event/publisher_spec.rb +3 -0
- data/spec/mongo/event/subscriber_spec.rb +3 -0
- data/spec/mongo/grid/file/chunk_spec.rb +7 -4
- data/spec/mongo/grid/file/info_spec.rb +6 -3
- data/spec/mongo/grid/file_spec.rb +4 -1
- data/spec/mongo/grid/fs_bucket_spec.rb +76 -70
- data/spec/mongo/grid/stream/read_spec.rb +44 -27
- data/spec/mongo/grid/stream/write_spec.rb +51 -33
- data/spec/mongo/grid/stream_spec.rb +4 -1
- data/spec/mongo/id_spec.rb +38 -0
- data/spec/mongo/index/view_spec.rb +374 -96
- data/spec/mongo/lint_spec.rb +79 -0
- data/spec/mongo/logger_spec.rb +16 -11
- data/spec/mongo/monitoring/command_log_subscriber_spec.rb +3 -0
- data/spec/mongo/monitoring/event/cmap/connection_check_out_failed_spec.rb +26 -0
- data/spec/mongo/monitoring/event/cmap/connection_check_out_started_spec.rb +22 -0
- data/spec/mongo/monitoring/event/cmap/connection_checked_in_spec.rb +33 -0
- data/spec/mongo/monitoring/event/cmap/connection_checked_out_spec.rb +33 -0
- data/spec/mongo/monitoring/event/cmap/connection_closed_spec.rb +30 -0
- data/spec/mongo/monitoring/event/cmap/connection_created_spec.rb +27 -0
- data/spec/mongo/monitoring/event/cmap/connection_ready_spec.rb +27 -0
- data/spec/mongo/monitoring/event/cmap/pool_cleared_spec.rb +22 -0
- data/spec/mongo/monitoring/event/cmap/pool_closed_spec.rb +29 -0
- data/spec/mongo/monitoring/event/cmap/pool_created_spec.rb +36 -0
- data/spec/mongo/monitoring/event/command_failed_spec.rb +60 -3
- data/spec/mongo/monitoring/event/command_started_spec.rb +4 -1
- data/spec/mongo/monitoring/event/command_succeeded_spec.rb +47 -7
- data/spec/mongo/monitoring/event/secure_spec.rb +29 -5
- data/spec/mongo/monitoring/event/server_closed_spec.rb +38 -0
- data/spec/mongo/monitoring/event/server_description_changed_spec.rb +38 -0
- data/spec/mongo/monitoring/event/server_heartbeat_failed_spec.rb +34 -0
- data/spec/mongo/monitoring/event/server_heartbeat_started_spec.rb +34 -0
- data/spec/mongo/monitoring/event/server_heartbeat_succeeded_spec.rb +34 -0
- data/spec/mongo/monitoring/event/server_opening_spec.rb +38 -0
- data/spec/mongo/monitoring/event/topology_changed_spec.rb +44 -0
- data/spec/mongo/monitoring/event/topology_closed_spec.rb +38 -0
- data/spec/mongo/monitoring/event/topology_opening_spec.rb +38 -0
- data/spec/mongo/monitoring_spec.rb +5 -2
- data/spec/mongo/operation/aggregate/result_spec.rb +11 -1
- data/spec/mongo/operation/aggregate_spec.rb +7 -3
- data/spec/mongo/operation/collections_info_spec.rb +9 -3
- data/spec/mongo/operation/command_spec.rb +12 -6
- data/spec/mongo/operation/create_index_spec.rb +17 -14
- data/spec/mongo/operation/create_user_spec.rb +15 -6
- data/spec/mongo/operation/delete/bulk_spec.rb +40 -18
- data/spec/mongo/operation/delete/command_spec.rb +6 -2
- data/spec/mongo/operation/delete/op_msg_spec.rb +69 -35
- data/spec/mongo/operation/delete_spec.rb +35 -17
- data/spec/mongo/operation/drop_index_spec.rb +14 -4
- data/spec/mongo/operation/find/builder/flags_spec.rb +109 -0
- data/spec/mongo/operation/find/builder/modifiers_spec.rb +213 -0
- data/spec/mongo/operation/find/legacy_spec.rb +37 -9
- data/spec/mongo/operation/get_more_spec.rb +13 -3
- data/spec/mongo/operation/indexes_spec.rb +10 -2
- data/spec/mongo/operation/insert/bulk_spec.rb +42 -11
- data/spec/mongo/operation/insert/command_spec.rb +10 -2
- data/spec/mongo/operation/insert/op_msg_spec.rb +100 -57
- data/spec/mongo/operation/insert_spec.rb +25 -18
- data/spec/mongo/operation/kill_cursors_spec.rb +8 -2
- data/spec/mongo/operation/limited_spec.rb +8 -3
- data/spec/mongo/operation/map_reduce_spec.rb +10 -4
- data/spec/mongo/operation/read_preference_legacy_spec.rb +360 -0
- data/spec/mongo/operation/read_preference_op_msg_spec.rb +309 -0
- data/spec/mongo/operation/remove_user_spec.rb +15 -5
- data/spec/mongo/operation/result_spec.rb +46 -6
- data/spec/mongo/operation/specifiable_spec.rb +3 -0
- data/spec/mongo/operation/update/bulk_spec.rb +28 -9
- data/spec/mongo/operation/update/command_spec.rb +15 -7
- data/spec/mongo/operation/update/op_msg_spec.rb +74 -40
- data/spec/mongo/operation/update_spec.rb +21 -13
- data/spec/mongo/operation/update_user_spec.rb +13 -7
- data/spec/mongo/options/redacted_spec.rb +3 -0
- data/spec/mongo/protocol/compressed_spec.rb +30 -13
- data/spec/mongo/protocol/delete_spec.rb +13 -9
- data/spec/mongo/protocol/get_more_spec.rb +13 -9
- data/spec/mongo/protocol/insert_spec.rb +13 -9
- data/spec/mongo/protocol/kill_cursors_spec.rb +10 -6
- data/spec/mongo/protocol/msg_spec.rb +90 -61
- data/spec/mongo/protocol/query_spec.rb +19 -16
- data/spec/mongo/protocol/registry_spec.rb +4 -1
- data/spec/mongo/protocol/reply_spec.rb +4 -1
- data/spec/mongo/protocol/update_spec.rb +14 -10
- data/spec/mongo/query_cache_middleware_spec.rb +55 -0
- data/spec/mongo/query_cache_spec.rb +287 -0
- data/spec/mongo/retryable_spec.rb +272 -127
- data/spec/mongo/semaphore_spec.rb +54 -0
- data/spec/mongo/server/app_metadata_spec.rb +170 -0
- data/spec/mongo/server/connection_auth_spec.rb +136 -0
- data/spec/mongo/server/connection_common_spec.rb +75 -0
- data/spec/mongo/server/connection_pool/populator_spec.rb +106 -0
- data/spec/mongo/server/connection_pool_spec.rb +862 -220
- data/spec/mongo/server/connection_spec.rb +830 -213
- data/spec/mongo/server/description/features_spec.rb +3 -0
- data/spec/mongo/server/description_query_methods_spec.rb +291 -0
- data/spec/mongo/server/description_spec.rb +619 -713
- data/spec/mongo/server/monitor/app_metadata_spec.rb +25 -0
- data/spec/mongo/server/monitor/connection_spec.rb +99 -40
- data/spec/mongo/server/monitor_spec.rb +180 -103
- data/spec/mongo/server/round_trip_time_averager_spec.rb +48 -0
- data/spec/mongo/server_selector/nearest_spec.rb +32 -25
- data/spec/mongo/server_selector/primary_preferred_spec.rb +35 -28
- data/spec/mongo/server_selector/primary_spec.rb +35 -11
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +52 -29
- data/spec/mongo/server_selector/secondary_spec.rb +27 -20
- data/spec/mongo/server_selector_spec.rb +208 -5
- data/spec/mongo/server_spec.rb +238 -51
- data/spec/mongo/session/server_session_spec.rb +3 -0
- data/spec/mongo/session/session_pool_spec.rb +66 -18
- data/spec/mongo/session_spec.rb +104 -8
- data/spec/mongo/session_transaction_spec.rb +206 -0
- data/spec/mongo/socket/ssl_spec.rb +472 -173
- data/spec/mongo/socket/tcp_spec.rb +17 -0
- data/spec/mongo/socket/unix_spec.rb +13 -9
- data/spec/mongo/socket_spec.rb +87 -10
- data/spec/mongo/srv/monitor_spec.rb +233 -0
- data/spec/mongo/srv/result_spec.rb +57 -0
- data/spec/mongo/timeout_spec.rb +42 -0
- data/spec/mongo/tls_context_hooks_spec.rb +40 -0
- data/spec/mongo/uri/srv_protocol_spec.rb +264 -93
- data/spec/mongo/uri_option_parsing_spec.rb +625 -0
- data/spec/mongo/uri_spec.rb +373 -89
- data/spec/mongo/utils_spec.rb +56 -0
- data/spec/mongo/write_concern/acknowledged_spec.rb +3 -0
- data/spec/mongo/write_concern/unacknowledged_spec.rb +3 -0
- data/spec/mongo/write_concern_spec.rb +72 -4
- data/spec/runners/auth.rb +140 -0
- data/spec/runners/change_streams/outcome.rb +45 -0
- data/spec/runners/change_streams/spec.rb +60 -0
- data/spec/runners/change_streams/test.rb +232 -0
- data/spec/runners/cmap/verifier.rb +48 -0
- data/spec/runners/cmap.rb +373 -0
- data/spec/runners/command_monitoring.rb +346 -0
- data/spec/runners/connection_string.rb +385 -0
- data/spec/runners/crud/context.rb +30 -0
- data/spec/runners/crud/operation.rb +471 -0
- data/spec/runners/crud/outcome.rb +56 -0
- data/spec/runners/crud/requirement.rb +134 -0
- data/spec/runners/crud/spec.rb +73 -0
- data/spec/runners/crud/test.rb +123 -0
- data/spec/runners/crud/test_base.rb +53 -0
- data/spec/runners/crud/verifier.rb +217 -0
- data/spec/runners/crud.rb +257 -0
- data/spec/runners/gridfs.rb +641 -0
- data/spec/runners/read_write_concern_document.rb +70 -0
- data/spec/runners/sdam/verifier.rb +112 -0
- data/spec/runners/sdam.rb +279 -0
- data/spec/runners/server_selection.rb +365 -0
- data/spec/runners/server_selection_rtt.rb +41 -0
- data/spec/runners/transactions/operation.rb +328 -0
- data/spec/runners/transactions/spec.rb +29 -0
- data/spec/runners/transactions/test.rb +326 -0
- data/spec/runners/transactions.rb +104 -0
- data/spec/runners/unified/assertions.rb +281 -0
- data/spec/runners/unified/change_stream_operations.rb +29 -0
- data/spec/runners/unified/crud_operations.rb +206 -0
- data/spec/runners/unified/ddl_operations.rb +106 -0
- data/spec/runners/unified/entity_map.rb +42 -0
- data/spec/runners/unified/error.rb +28 -0
- data/spec/runners/unified/event_subscriber.rb +104 -0
- data/spec/runners/unified/exceptions.rb +24 -0
- data/spec/runners/unified/grid_fs_operations.rb +58 -0
- data/spec/runners/unified/support_operations.rb +261 -0
- data/spec/runners/unified/test.rb +426 -0
- data/spec/runners/unified/test_group.rb +31 -0
- data/spec/runners/unified.rb +99 -0
- data/spec/shared/LICENSE +20 -0
- data/spec/shared/bin/get-mongodb-download-url +17 -0
- data/spec/shared/bin/s3-copy +45 -0
- data/spec/shared/bin/s3-upload +69 -0
- data/spec/shared/lib/mrss/child_process_helper.rb +80 -0
- data/spec/shared/lib/mrss/cluster_config.rb +231 -0
- data/spec/shared/lib/mrss/constraints.rb +385 -0
- data/spec/shared/lib/mrss/docker_runner.rb +271 -0
- data/spec/shared/lib/mrss/event_subscriber.rb +200 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +191 -0
- data/spec/shared/lib/mrss/server_version_registry.rb +120 -0
- data/spec/shared/lib/mrss/spec_organizer.rb +179 -0
- data/spec/shared/lib/mrss/utils.rb +15 -0
- data/spec/shared/share/Dockerfile.erb +323 -0
- data/spec/shared/share/haproxy-1.conf +16 -0
- data/spec/shared/share/haproxy-2.conf +17 -0
- data/spec/shared/shlib/distro.sh +73 -0
- data/spec/shared/shlib/server.sh +367 -0
- data/spec/shared/shlib/set_env.sh +131 -0
- data/spec/solo/clean_exit_spec.rb +24 -0
- data/spec/spec_helper.rb +15 -303
- data/spec/spec_tests/auth_spec.rb +58 -0
- data/spec/spec_tests/change_streams_spec.rb +60 -9
- data/spec/spec_tests/change_streams_unified_spec.rb +13 -0
- data/spec/spec_tests/client_side_encryption_spec.rb +14 -0
- data/spec/spec_tests/cmap_spec.rb +112 -0
- data/spec/spec_tests/collection_management_spec.rb +13 -0
- data/spec/spec_tests/command_monitoring_spec.rb +49 -42
- data/spec/spec_tests/command_monitoring_unified_spec.rb +13 -0
- data/spec/spec_tests/connection_string_spec.rb +6 -111
- data/spec/spec_tests/crud_spec.rb +14 -35
- data/spec/spec_tests/crud_unified_spec.rb +13 -0
- data/spec/spec_tests/data/auth/connection-string.yml +366 -0
- data/spec/spec_tests/data/change_streams/change-streams-errors.yml +101 -0
- data/spec/spec_tests/data/change_streams/change-streams-resume-allowlist.yml +1173 -0
- data/spec/spec_tests/data/change_streams/change-streams-resume-errorLabels.yml +1105 -0
- data/spec/spec_tests/data/change_streams/change-streams.yml +535 -0
- data/spec/spec_tests/data/change_streams_unified/change-streams.yml +72 -0
- data/spec/spec_tests/data/client_side_encryption/aggregate.yml +134 -0
- data/spec/spec_tests/data/client_side_encryption/badQueries.yml +526 -0
- data/spec/spec_tests/data/client_side_encryption/badSchema.yml +73 -0
- data/spec/spec_tests/data/client_side_encryption/basic.yml +116 -0
- data/spec/spec_tests/data/client_side_encryption/bulk.yml +88 -0
- data/spec/spec_tests/data/client_side_encryption/bypassAutoEncryption.yml +100 -0
- data/spec/spec_tests/data/client_side_encryption/bypassedCommand.yml +42 -0
- data/spec/spec_tests/data/client_side_encryption/count.yml +61 -0
- data/spec/spec_tests/data/client_side_encryption/countDocuments.yml +59 -0
- data/spec/spec_tests/data/client_side_encryption/delete.yml +105 -0
- data/spec/spec_tests/data/client_side_encryption/distinct.yml +73 -0
- data/spec/spec_tests/data/client_side_encryption/explain.yml +64 -0
- data/spec/spec_tests/data/client_side_encryption/find.yml +119 -0
- data/spec/spec_tests/data/client_side_encryption/findOneAndDelete.yml +57 -0
- data/spec/spec_tests/data/client_side_encryption/findOneAndReplace.yml +57 -0
- data/spec/spec_tests/data/client_side_encryption/findOneAndUpdate.yml +57 -0
- data/spec/spec_tests/data/client_side_encryption/getMore.yml +68 -0
- data/spec/spec_tests/data/client_side_encryption/insert.yml +102 -0
- data/spec/spec_tests/data/client_side_encryption/keyAltName.yml +71 -0
- data/spec/spec_tests/data/client_side_encryption/localKMS.yml +54 -0
- data/spec/spec_tests/data/client_side_encryption/localSchema.yml +72 -0
- data/spec/spec_tests/data/client_side_encryption/malformedCiphertext.yml +69 -0
- data/spec/spec_tests/data/client_side_encryption/maxWireVersion.yml +20 -0
- data/spec/spec_tests/data/client_side_encryption/missingKey.yml +49 -0
- data/spec/spec_tests/data/client_side_encryption/replaceOne.yml +64 -0
- data/spec/spec_tests/data/client_side_encryption/types.yml +527 -0
- data/spec/spec_tests/data/client_side_encryption/unsupportedCommand.yml +25 -0
- data/spec/spec_tests/data/client_side_encryption/updateMany.yml +77 -0
- data/spec/spec_tests/data/client_side_encryption/updateOne.yml +171 -0
- data/spec/spec_tests/data/cmap/connection-must-have-id.yml +27 -0
- data/spec/spec_tests/data/cmap/connection-must-order-ids.yml +27 -0
- data/spec/spec_tests/data/cmap/pool-checkin-destroy-closed.yml +27 -0
- data/spec/spec_tests/data/cmap/pool-checkin-destroy-stale.yml +27 -0
- data/spec/spec_tests/data/cmap/pool-checkin-make-available.yml +24 -0
- data/spec/spec_tests/data/cmap/pool-checkin.yml +19 -0
- data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +19 -0
- data/spec/spec_tests/data/cmap/pool-checkout-error-closed.yml +36 -0
- data/spec/spec_tests/data/cmap/pool-checkout-multiple.yml +37 -0
- data/spec/spec_tests/data/cmap/pool-checkout-no-idle.yml +35 -0
- data/spec/spec_tests/data/cmap/pool-checkout-no-stale.yml +33 -0
- data/spec/spec_tests/data/cmap/pool-close-destroy-conns.yml +28 -0
- data/spec/spec_tests/data/cmap/pool-close.yml +11 -0
- data/spec/spec_tests/data/cmap/pool-create-max-size.yml +71 -0
- data/spec/spec_tests/data/cmap/pool-create-min-size.yml +34 -0
- data/spec/spec_tests/data/cmap/pool-create-with-options.yml +21 -0
- data/spec/spec_tests/data/cmap/pool-create.yml +12 -0
- data/spec/spec_tests/data/cmap/wait-queue-fairness.yml +124 -0
- data/spec/spec_tests/data/cmap/wait-queue-timeout.yml +46 -0
- data/spec/spec_tests/data/collection_management/timeseries-collection.yml +129 -0
- data/spec/spec_tests/data/command_monitoring/bulkWrite.yml +49 -0
- data/spec/{support → spec_tests/data}/command_monitoring/command.yml +0 -0
- data/spec/{support → spec_tests/data}/command_monitoring/deleteMany.yml +0 -0
- data/spec/{support → spec_tests/data}/command_monitoring/deleteOne.yml +0 -0
- data/spec/spec_tests/data/command_monitoring/find.yml +266 -0
- data/spec/spec_tests/data/command_monitoring/insertMany.yml +75 -0
- data/spec/{support → spec_tests/data}/command_monitoring/insertOne.yml +0 -0
- data/spec/{support → spec_tests/data}/command_monitoring/unacknowledgedBulkWrite.yml +0 -0
- data/spec/spec_tests/data/command_monitoring/updateMany.yml +65 -0
- data/spec/spec_tests/data/command_monitoring/updateOne.yml +90 -0
- data/spec/spec_tests/data/command_monitoring_unified/redacted-commands.yml +340 -0
- data/spec/spec_tests/data/connection_string/invalid-uris.yml +261 -0
- data/spec/spec_tests/data/connection_string/valid-auth.yml +257 -0
- data/spec/{support/connection_string_tests → spec_tests/data/connection_string}/valid-db-with-dotted-name.yml +0 -0
- data/spec/{support/connection_string_tests → spec_tests/data/connection_string}/valid-host_identifiers.yml +0 -0
- data/spec/{support/connection_string_tests → spec_tests/data/connection_string}/valid-options.yml +0 -0
- data/spec/{support/connection_string_tests → spec_tests/data/connection_string}/valid-unix_socket-absolute.yml +0 -0
- data/spec/{support/connection_string_tests → spec_tests/data/connection_string}/valid-unix_socket-relative.yml +0 -0
- data/spec/spec_tests/data/connection_string/valid-warnings.yml +75 -0
- data/spec/spec_tests/data/crud/read/aggregate-collation.yml +18 -0
- data/spec/spec_tests/data/crud/read/aggregate-out.yml +44 -0
- data/spec/{support/crud_tests → spec_tests/data/crud}/read/aggregate.yml +0 -0
- data/spec/spec_tests/data/crud/read/count-collation.yml +26 -0
- data/spec/spec_tests/data/crud/read/count-empty.yml +29 -0
- data/spec/{support/crud_tests → spec_tests/data/crud}/read/count.yml +0 -0
- data/spec/spec_tests/data/crud/read/distinct-collation.yml +18 -0
- data/spec/{support/crud_tests → spec_tests/data/crud}/read/distinct.yml +0 -0
- data/spec/spec_tests/data/crud/read/find-collation.yml +16 -0
- data/spec/{support/crud_tests → spec_tests/data/crud}/read/find.yml +0 -0
- data/spec/spec_tests/data/crud/write/bulkWrite-arrayFilters.yml +45 -0
- data/spec/spec_tests/data/crud/write/bulkWrite-collation.yml +102 -0
- data/spec/spec_tests/data/crud/write/bulkWrite.yml +405 -0
- data/spec/spec_tests/data/crud/write/deleteMany-collation.yml +23 -0
- data/spec/{support/crud_tests → spec_tests/data/crud}/write/deleteMany.yml +0 -0
- data/spec/spec_tests/data/crud/write/deleteOne-collation.yml +23 -0
- data/spec/{support/crud_tests → spec_tests/data/crud}/write/deleteOne.yml +0 -0
- data/spec/spec_tests/data/crud/write/findOneAndDelete-collation.yml +24 -0
- data/spec/{support/crud_tests → spec_tests/data/crud}/write/findOneAndDelete.yml +0 -0
- data/spec/spec_tests/data/crud/write/findOneAndReplace-collation.yml +25 -0
- data/spec/{support/crud_tests → spec_tests/data/crud}/write/findOneAndReplace-upsert.yml +0 -0
- data/spec/{support/crud_tests → spec_tests/data/crud}/write/findOneAndReplace-upsert_pre_2.6.yml +0 -0
- data/spec/{support/crud_tests → spec_tests/data/crud}/write/findOneAndReplace.yml +0 -0
- data/spec/{support/crud_tests → spec_tests/data/crud}/write/findOneAndUpdate-arrayFilters.yml +0 -0
- data/spec/spec_tests/data/crud/write/findOneAndUpdate-collation.yml +28 -0
- data/spec/{support/crud_tests → spec_tests/data/crud}/write/findOneAndUpdate.yml +0 -0
- data/spec/spec_tests/data/crud/write/insertMany.yml +81 -0
- data/spec/{support/crud_tests → spec_tests/data/crud}/write/insertOne.yml +0 -0
- data/spec/spec_tests/data/crud/write/replaceOne-collation.yml +25 -0
- data/spec/{support/crud_tests → spec_tests/data/crud}/write/replaceOne-pre_2.6.yml +0 -0
- data/spec/{support/crud_tests → spec_tests/data/crud}/write/replaceOne-upsert.yml +0 -0
- data/spec/{support/crud_tests → spec_tests/data/crud}/write/replaceOne.yml +0 -0
- data/spec/spec_tests/data/crud/write/updateMany-arrayFilters.yml +66 -0
- data/spec/spec_tests/data/crud/write/updateMany-collation.yml +29 -0
- data/spec/{support/crud_tests → spec_tests/data/crud}/write/updateMany-pre_2.6.yml +0 -0
- data/spec/{support/crud_tests → spec_tests/data/crud}/write/updateMany.yml +0 -0
- data/spec/spec_tests/data/crud/write/updateOne-arrayFilters.yml +114 -0
- data/spec/spec_tests/data/crud/write/updateOne-collation.yml +26 -0
- data/spec/{support/crud_tests → spec_tests/data/crud}/write/updateOne-pre_2.6.yml +0 -0
- data/spec/{support/crud_tests → spec_tests/data/crud}/write/updateOne.yml +0 -0
- data/spec/spec_tests/data/crud_unified/estimatedDocumentCount.yml +267 -0
- data/spec/spec_tests/data/crud_unified/updateWithPipelines.yml +305 -0
- data/spec/spec_tests/data/crud_v2/aggregate-merge.yml +103 -0
- data/spec/spec_tests/data/crud_v2/aggregate-out-readConcern.yml +111 -0
- data/spec/spec_tests/data/crud_v2/bulkWrite-arrayFilters.yml +103 -0
- data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-clientError.yml +63 -0
- data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint-serverError.yml +92 -0
- data/spec/spec_tests/data/crud_v2/bulkWrite-delete-hint.yml +103 -0
- data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-clientError.yml +90 -0
- data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint-serverError.yml +147 -0
- data/spec/spec_tests/data/crud_v2/bulkWrite-update-hint.yml +164 -0
- data/spec/spec_tests/data/crud_v2/db-aggregate.yml +39 -0
- data/spec/spec_tests/data/crud_v2/deleteMany-hint-clientError.yml +43 -0
- data/spec/spec_tests/data/crud_v2/deleteMany-hint-serverError.yml +62 -0
- data/spec/spec_tests/data/crud_v2/deleteMany-hint.yml +58 -0
- data/spec/spec_tests/data/crud_v2/deleteOne-hint-clientError.yml +41 -0
- data/spec/spec_tests/data/crud_v2/deleteOne-hint-serverError.yml +60 -0
- data/spec/spec_tests/data/crud_v2/deleteOne-hint.yml +57 -0
- data/spec/spec_tests/data/crud_v2/find-allowdiskuse-clientError.yml +28 -0
- data/spec/spec_tests/data/crud_v2/find-allowdiskuse-serverError.yml +44 -0
- data/spec/spec_tests/data/crud_v2/find-allowdiskuse.yml +50 -0
- data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-clientError.yml +45 -0
- data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint-serverError.yml +60 -0
- data/spec/spec_tests/data/crud_v2/findOneAndDelete-hint.yml +56 -0
- data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-clientError.yml +40 -0
- data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint-serverError.yml +59 -0
- data/spec/spec_tests/data/crud_v2/findOneAndReplace-hint.yml +55 -0
- data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-clientError.yml +40 -0
- data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint-serverError.yml +58 -0
- data/spec/spec_tests/data/crud_v2/findOneAndUpdate-hint.yml +55 -0
- data/spec/spec_tests/data/crud_v2/replaceOne-hint.yml +61 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-delete-hint-clientError.yml +60 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-bulkWrite-update-hint-clientError.yml +88 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-deleteMany-hint-clientError.yml +40 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-deleteOne-hint-clientError.yml +38 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndDelete-hint-clientError.yml +42 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndReplace-hint-clientError.yml +40 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-findOneAndUpdate-hint-clientError.yml +40 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-replaceOne-hint-clientError.yml +40 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-updateMany-hint-clientError.yml +43 -0
- data/spec/spec_tests/data/crud_v2/unacknowledged-updateOne-hint-clientError.yml +40 -0
- data/spec/spec_tests/data/crud_v2/updateMany-hint-clientError.yml +45 -0
- data/spec/spec_tests/data/crud_v2/updateMany-hint-serverError.yml +66 -0
- data/spec/spec_tests/data/crud_v2/updateMany-hint.yml +65 -0
- data/spec/spec_tests/data/crud_v2/updateOne-hint-clientError.yml +43 -0
- data/spec/spec_tests/data/crud_v2/updateOne-hint-serverError.yml +62 -0
- data/spec/spec_tests/data/crud_v2/updateOne-hint.yml +61 -0
- data/spec/spec_tests/data/crud_v2/updateWithPipelines.yml +157 -0
- data/spec/{support/gridfs_tests → spec_tests/data/gridfs}/delete.yml +0 -0
- data/spec/{support/gridfs_tests → spec_tests/data/gridfs}/download.yml +0 -0
- data/spec/{support/gridfs_tests → spec_tests/data/gridfs}/download_by_name.yml +0 -0
- data/spec/{support/gridfs_tests → spec_tests/data/gridfs}/upload.yml +0 -0
- data/spec/spec_tests/data/load_balancers/event-monitoring.yml +99 -0
- data/spec/spec_tests/data/load_balancers/lb-connection-establishment.yml +36 -0
- data/spec/spec_tests/data/load_balancers/non-lb-connection-establishment.yml +56 -0
- data/spec/spec_tests/data/load_balancers/server-selection.yml +50 -0
- data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetNoPrimary/DefaultNoMaxStaleness.yml +0 -0
- data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetNoPrimary/Incompatible.yml +0 -0
- data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetNoPrimary/LastUpdateTime.yml +0 -0
- data/spec/{support/max_staleness/ReplicaSetNoPrimary/NoKnownServers.yml → spec_tests/data/max_staleness/ReplicaSetNoPrimary/MaxStalenessTooSmall.yml} +0 -0
- data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetNoPrimary/Nearest.yml +0 -0
- data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetNoPrimary/Nearest2.yml +0 -0
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/NoKnownServers.yml +16 -0
- data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred.yml +0 -0
- data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetNoPrimary/PrimaryPreferred_tags.yml +0 -0
- data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetNoPrimary/Secondary.yml +0 -0
- data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred.yml +0 -0
- data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetNoPrimary/SecondaryPreferred_tags.yml +0 -0
- data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetNoPrimary/ZeroMaxStaleness.yml +0 -0
- data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/DefaultNoMaxStaleness.yml +0 -0
- data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/Incompatible.yml +0 -0
- data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/LastUpdateTime.yml +0 -0
- data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/LongHeartbeat.yml +0 -0
- data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/LongHeartbeat2.yml +0 -0
- data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/MaxStalenessTooSmall.yml +0 -0
- data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/MaxStalenessWithModePrimary.yml +0 -0
- data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/Nearest.yml +0 -0
- data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/Nearest2.yml +0 -0
- data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/Nearest_tags.yml +0 -0
- data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred.yml +0 -0
- data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/PrimaryPreferred_incompatible.yml +0 -0
- data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred.yml +0 -0
- data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags.yml +0 -0
- data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/SecondaryPreferred_tags2.yml +0 -0
- data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/Secondary_tags.yml +0 -0
- data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/Secondary_tags2.yml +0 -0
- data/spec/{support → spec_tests/data}/max_staleness/ReplicaSetWithPrimary/ZeroMaxStaleness.yml +0 -0
- data/spec/{support → spec_tests/data}/max_staleness/Sharded/Incompatible.yml +0 -0
- data/spec/{support → spec_tests/data}/max_staleness/Sharded/SmallMaxStaleness.yml +0 -0
- data/spec/{support → spec_tests/data}/max_staleness/Single/Incompatible.yml +0 -0
- data/spec/{support → spec_tests/data}/max_staleness/Single/SmallMaxStaleness.yml +0 -0
- data/spec/spec_tests/data/max_staleness/Unknown/SmallMaxStaleness.yml +15 -0
- data/spec/spec_tests/data/read_write_concern/connection-string/read-concern.yml +32 -0
- data/spec/spec_tests/data/read_write_concern/connection-string/write-concern.yml +79 -0
- data/spec/spec_tests/data/read_write_concern/document/read-concern.yml +37 -0
- data/spec/spec_tests/data/read_write_concern/document/write-concern.yml +100 -0
- data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-2.6.yml +215 -0
- data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-3.2.yml +58 -0
- data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-3.4.yml +95 -0
- data/spec/spec_tests/data/read_write_concern/operation/default-write-concern-4.2.yml +36 -0
- data/spec/spec_tests/data/retryable_reads/aggregate-merge.yml +39 -0
- data/spec/spec_tests/data/retryable_reads/aggregate-serverErrors.yml +157 -0
- data/spec/spec_tests/data/retryable_reads/aggregate.yml +87 -0
- data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch-serverErrors.yml +150 -0
- data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch.yml +62 -0
- data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch-serverErrors.yml +150 -0
- data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch.yml +66 -0
- data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch-serverErrors.yml +154 -0
- data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch.yml +62 -0
- data/spec/spec_tests/data/retryable_reads/count-serverErrors.yml +150 -0
- data/spec/spec_tests/data/retryable_reads/count.yml +64 -0
- data/spec/spec_tests/data/retryable_reads/countDocuments-serverErrors.yml +150 -0
- data/spec/spec_tests/data/retryable_reads/countDocuments.yml +64 -0
- data/spec/spec_tests/data/retryable_reads/distinct-serverErrors.yml +156 -0
- data/spec/spec_tests/data/retryable_reads/distinct.yml +71 -0
- data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-4.9.yml +60 -0
- data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-pre4.9.yml +64 -0
- data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-4.9.yml +146 -0
- data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors-pre4.9.yml +150 -0
- data/spec/spec_tests/data/retryable_reads/find-serverErrors.yml +160 -0
- data/spec/spec_tests/data/retryable_reads/find.yml +86 -0
- data/spec/spec_tests/data/retryable_reads/findOne-serverErrors.yml +154 -0
- data/spec/spec_tests/data/retryable_reads/findOne.yml +68 -0
- data/spec/spec_tests/data/retryable_reads/gridfs-download-serverErrors.yml +173 -0
- data/spec/spec_tests/data/retryable_reads/gridfs-download.yml +79 -0
- data/spec/spec_tests/data/retryable_reads/gridfs-downloadByName-serverErrors.yml +174 -0
- data/spec/spec_tests/data/retryable_reads/gridfs-downloadByName.yml +79 -0
- data/spec/spec_tests/data/retryable_reads/listCollectionNames-serverErrors.yml +143 -0
- data/spec/spec_tests/data/retryable_reads/listCollectionNames.yml +59 -0
- data/spec/spec_tests/data/retryable_reads/listCollectionObjects-serverErrors.yml +144 -0
- data/spec/spec_tests/data/retryable_reads/listCollectionObjects.yml +59 -0
- data/spec/spec_tests/data/retryable_reads/listCollections-serverErrors.yml +143 -0
- data/spec/spec_tests/data/retryable_reads/listCollections.yml +59 -0
- data/spec/spec_tests/data/retryable_reads/listDatabaseNames-serverErrors.yml +143 -0
- data/spec/spec_tests/data/retryable_reads/listDatabaseNames.yml +59 -0
- data/spec/spec_tests/data/retryable_reads/listDatabaseObjects-serverErrors.yml +144 -0
- data/spec/spec_tests/data/retryable_reads/listDatabaseObjects.yml +59 -0
- data/spec/spec_tests/data/retryable_reads/listDatabases-serverErrors.yml +144 -0
- data/spec/spec_tests/data/retryable_reads/listDatabases.yml +59 -0
- data/spec/spec_tests/data/retryable_reads/listIndexNames-serverErrors.yml +144 -0
- data/spec/spec_tests/data/retryable_reads/listIndexNames.yml +60 -0
- data/spec/spec_tests/data/retryable_reads/listIndexes-serverErrors.yml +145 -0
- data/spec/spec_tests/data/retryable_reads/listIndexes.yml +60 -0
- data/spec/spec_tests/data/retryable_reads/mapReduce.yml +62 -0
- data/spec/spec_tests/data/retryable_writes/bulkWrite-errorLabels.yml +77 -0
- data/spec/spec_tests/data/retryable_writes/bulkWrite-serverErrors.yml +130 -0
- data/spec/spec_tests/data/retryable_writes/bulkWrite.yml +402 -0
- data/spec/spec_tests/data/retryable_writes/deleteMany.yml +22 -0
- data/spec/spec_tests/data/retryable_writes/deleteOne-errorLabels.yml +48 -0
- data/spec/spec_tests/data/retryable_writes/deleteOne-serverErrors.yml +73 -0
- data/spec/spec_tests/data/retryable_writes/deleteOne.yml +57 -0
- data/spec/spec_tests/data/retryable_writes/findOneAndDelete-errorLabels.yml +49 -0
- data/spec/spec_tests/data/retryable_writes/findOneAndDelete-serverErrors.yml +74 -0
- data/spec/spec_tests/data/retryable_writes/findOneAndDelete.yml +58 -0
- data/spec/spec_tests/data/retryable_writes/findOneAndReplace-errorLabels.yml +52 -0
- data/spec/spec_tests/data/retryable_writes/findOneAndReplace-serverErrors.yml +80 -0
- data/spec/spec_tests/data/retryable_writes/findOneAndReplace.yml +63 -0
- data/spec/spec_tests/data/retryable_writes/findOneAndUpdate-errorLabels.yml +52 -0
- data/spec/spec_tests/data/retryable_writes/findOneAndUpdate-serverErrors.yml +79 -0
- data/spec/spec_tests/data/retryable_writes/findOneAndUpdate.yml +62 -0
- data/spec/spec_tests/data/retryable_writes/insertMany-errorLabels.yml +54 -0
- data/spec/spec_tests/data/retryable_writes/insertMany-serverErrors.yml +84 -0
- data/spec/spec_tests/data/retryable_writes/insertMany.yml +74 -0
- data/spec/spec_tests/data/retryable_writes/insertOne-errorLabels.yml +44 -0
- data/spec/spec_tests/data/retryable_writes/insertOne-serverErrors.yml +527 -0
- data/spec/spec_tests/data/retryable_writes/insertOne.yml +61 -0
- data/spec/spec_tests/data/retryable_writes/replaceOne-errorLabels.yml +53 -0
- data/spec/spec_tests/data/retryable_writes/replaceOne-serverErrors.yml +82 -0
- data/spec/spec_tests/data/retryable_writes/replaceOne.yml +66 -0
- data/spec/spec_tests/data/retryable_writes/updateMany.yml +27 -0
- data/spec/spec_tests/data/retryable_writes/updateOne-errorLabels.yml +53 -0
- data/spec/spec_tests/data/retryable_writes/updateOne-serverErrors.yml +82 -0
- data/spec/spec_tests/data/retryable_writes/updateOne.yml +129 -0
- data/spec/spec_tests/data/sdam/errors/error_handling_handshake.yml +55 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-network-error.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-network-timeout-error.yml +38 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedAtShutdown.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-InterruptedDueToReplStateChange.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-LegacyNotPrimary.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotPrimaryNoSecondaryOk.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotPrimaryOrSecondary.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-NotWritablePrimary.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-PrimarySteppedDown.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-greater-ShutdownInProgress.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedAtShutdown.yml +52 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-InterruptedDueToReplStateChange.yml +52 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-LegacyNotPrimary.yml +52 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotPrimaryNoSecondaryOk.yml +52 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotPrimaryOrSecondary.yml +52 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-NotWritablePrimary.yml +52 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-PrimarySteppedDown.yml +52 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-missing-ShutdownInProgress.yml +52 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedAtShutdown.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-InterruptedDueToReplStateChange.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-LegacyNotPrimary.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryNoSecondaryOk.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryOrSecondary.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-NotWritablePrimary.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-PrimarySteppedDown.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/non-stale-topologyVersion-proccessId-changed-ShutdownInProgress.yml +61 -0
- data/spec/spec_tests/data/sdam/errors/post-42-InterruptedAtShutdown.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/post-42-InterruptedDueToReplStateChange.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/post-42-LegacyNotPrimary.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/post-42-NotPrimaryNoSecondaryOk.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/post-42-NotPrimaryOrSecondary.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/post-42-NotWritablePrimary.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/post-42-PrimarySteppedDown.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/post-42-ShutdownInProgress.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedAtShutdown.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-InterruptedDueToReplStateChange.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-LegacyNotPrimary.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-NotPrimaryNoSecondaryOk.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-NotPrimaryOrSecondary.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-NotWritablePrimary.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-PrimarySteppedDown.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/pre-42-ShutdownInProgress.yml +47 -0
- data/spec/spec_tests/data/sdam/errors/prefer-error-code.yml +54 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedAtShutdown.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-InterruptedDueToReplStateChange.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-NotPrimaryNoSecondaryOk.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-NotPrimaryOrSecondary.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-NotWritablePrimary.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-PrimarySteppedDown.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-ShutdownInProgress.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedAtShutdown.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-InterruptedDueToReplStateChange.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-LegacyNotPrimary.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotPrimaryNoSecondaryOk.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotPrimaryOrSecondary.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-NotWritablePrimary.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-PrimarySteppedDown.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-ShutdownInProgress.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-network.yml +82 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-afterHandshakeCompletes-timeout.yml +82 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedAtShutdown.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-InterruptedDueToReplStateChange.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-LegacyNotPrimary.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryNoSecondaryOk.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryOrSecondary.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-NotWritablePrimary.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-PrimarySteppedDown.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-ShutdownInProgress.yml +91 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-network.yml +82 -0
- data/spec/spec_tests/data/sdam/errors/stale-generation-beforeHandshakeCompletes-timeout.yml +82 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedAtShutdown.yml +65 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-InterruptedDueToReplStateChange.yml +65 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-LegacyNotPrimary.yml +65 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotPrimaryNoSecondaryOk.yml +65 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotPrimaryOrSecondary.yml +65 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-NotWritablePrimary.yml +65 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-PrimarySteppedDown.yml +65 -0
- data/spec/spec_tests/data/sdam/errors/stale-topologyVersion-ShutdownInProgress.yml +65 -0
- data/spec/spec_tests/data/sdam/errors/write_errors_ignored.yml +42 -0
- data/spec/spec_tests/data/sdam/load-balanced/discover_load_balancer.yml +25 -0
- data/spec/spec_tests/data/sdam/rs/compatible.yml +45 -0
- data/spec/spec_tests/data/sdam/rs/compatible_unknown.yml +34 -0
- data/spec/spec_tests/data/sdam/rs/discover_arbiters.yml +44 -0
- data/spec/spec_tests/data/sdam/rs/discover_arbiters_replicaset.yml +44 -0
- data/spec/spec_tests/data/sdam/rs/discover_ghost.yml +36 -0
- data/spec/spec_tests/data/sdam/rs/discover_ghost_replicaset.yml +42 -0
- data/spec/spec_tests/data/sdam/rs/discover_hidden.yml +51 -0
- data/spec/spec_tests/data/sdam/rs/discover_hidden_replicaset.yml +51 -0
- data/spec/spec_tests/data/sdam/rs/discover_passives.yml +83 -0
- data/spec/spec_tests/data/sdam/rs/discover_passives_replicaset.yml +83 -0
- data/spec/spec_tests/data/sdam/rs/discover_primary.yml +43 -0
- data/spec/spec_tests/data/sdam/rs/discover_primary_replicaset.yml +43 -0
- data/spec/spec_tests/data/sdam/rs/discover_rsother.yml +50 -0
- data/spec/spec_tests/data/sdam/rs/discover_rsother_replicaset.yml +68 -0
- data/spec/spec_tests/data/sdam/rs/discover_secondary.yml +44 -0
- data/spec/spec_tests/data/sdam/rs/discover_secondary_replicaset.yml +44 -0
- data/spec/spec_tests/data/sdam/rs/discovery.yml +207 -0
- data/spec/spec_tests/data/sdam/rs/equal_electionids.yml +57 -0
- data/spec/spec_tests/data/sdam/rs/hosts_differ_from_seeds.yml +37 -0
- data/spec/spec_tests/data/sdam/rs/incompatible_arbiter.yml +36 -0
- data/spec/spec_tests/data/sdam/rs/incompatible_ghost.yml +34 -0
- data/spec/spec_tests/data/sdam/rs/incompatible_other.yml +36 -0
- data/spec/spec_tests/data/sdam/rs/ls_timeout.yml +249 -0
- data/spec/spec_tests/data/sdam/rs/member_reconfig.yml +74 -0
- data/spec/spec_tests/data/sdam/rs/member_standalone.yml +66 -0
- data/spec/spec_tests/data/sdam/rs/new_primary.yml +80 -0
- data/spec/spec_tests/data/sdam/rs/new_primary_new_electionid.yml +119 -0
- data/spec/spec_tests/data/sdam/rs/new_primary_new_setversion.yml +119 -0
- data/spec/spec_tests/data/sdam/rs/new_primary_wrong_set_name.yml +77 -0
- data/spec/spec_tests/data/sdam/rs/non_rs_member.yml +33 -0
- data/spec/spec_tests/data/sdam/rs/normalize_case.yml +52 -0
- data/spec/spec_tests/data/sdam/rs/normalize_case_me.yml +102 -0
- data/spec/spec_tests/data/sdam/rs/null_election_id.yml +175 -0
- data/spec/spec_tests/data/sdam/rs/primary_becomes_ghost.yml +65 -0
- data/spec/spec_tests/data/sdam/rs/primary_becomes_mongos.yml +58 -0
- data/spec/spec_tests/data/sdam/rs/primary_becomes_standalone.yml +55 -0
- data/spec/spec_tests/data/sdam/rs/primary_changes_set_name.yml +63 -0
- data/spec/spec_tests/data/sdam/rs/primary_disconnect.yml +59 -0
- data/spec/spec_tests/data/sdam/rs/primary_disconnect_electionid.yml +189 -0
- data/spec/spec_tests/data/sdam/rs/primary_disconnect_setversion.yml +189 -0
- data/spec/spec_tests/data/sdam/rs/primary_hint_from_secondary_with_mismatched_me.yml +64 -0
- data/spec/spec_tests/data/sdam/rs/primary_mismatched_me.yml +27 -0
- data/spec/spec_tests/data/sdam/rs/primary_mismatched_me_not_removed.yml +75 -0
- data/spec/spec_tests/data/sdam/rs/primary_reports_new_member.yml +175 -0
- data/spec/spec_tests/data/sdam/rs/primary_to_no_primary_mismatched_me.yml +81 -0
- data/spec/spec_tests/data/sdam/rs/primary_wrong_set_name.yml +30 -0
- data/spec/spec_tests/data/sdam/rs/repeated.yml +105 -0
- data/spec/spec_tests/data/sdam/rs/replicaset_rsnp.yml +21 -0
- data/spec/spec_tests/data/sdam/rs/response_from_removed.yml +69 -0
- data/spec/spec_tests/data/sdam/rs/ruby_primary_address_change.yml +31 -0
- data/spec/spec_tests/data/sdam/rs/ruby_secondary_wrong_set_name_with_primary_second.yml +73 -0
- data/spec/spec_tests/data/sdam/rs/sec_not_auth.yml +55 -0
- data/spec/spec_tests/data/sdam/rs/secondary_ignore_ok_0.yml +87 -0
- data/spec/spec_tests/data/sdam/rs/secondary_mismatched_me.yml +28 -0
- data/spec/spec_tests/data/sdam/rs/secondary_wrong_set_name.yml +31 -0
- data/spec/spec_tests/data/sdam/rs/secondary_wrong_set_name_with_primary.yml +75 -0
- data/spec/spec_tests/data/sdam/rs/setversion_without_electionid.yml +79 -0
- data/spec/spec_tests/data/sdam/rs/stepdown_change_set_name.yml +65 -0
- data/spec/spec_tests/data/sdam/rs/too_new.yml +45 -0
- data/spec/spec_tests/data/sdam/rs/too_old.yml +41 -0
- data/spec/spec_tests/data/sdam/rs/topology_version_equal.yml +68 -0
- data/spec/spec_tests/data/sdam/rs/topology_version_greater.yml +194 -0
- data/spec/spec_tests/data/sdam/rs/topology_version_less.yml +64 -0
- data/spec/spec_tests/data/sdam/rs/unexpected_mongos.yml +29 -0
- data/spec/spec_tests/data/sdam/rs/use_setversion_without_electionid.yml +117 -0
- data/spec/spec_tests/data/sdam/rs/wrong_set_name.yml +38 -0
- data/spec/spec_tests/data/sdam/sharded/compatible.yml +40 -0
- data/spec/spec_tests/data/sdam/sharded/discover_single_mongos.yml +24 -0
- data/spec/spec_tests/data/sdam/sharded/ls_timeout_mongos.yml +101 -0
- data/spec/spec_tests/data/sdam/sharded/mongos_disconnect.yml +113 -0
- data/spec/spec_tests/data/sdam/sharded/multiple_mongoses.yml +52 -0
- data/spec/spec_tests/data/sdam/sharded/non_mongos_removed.yml +47 -0
- data/spec/{support → spec_tests/data}/sdam/sharded/normalize_uri_case.yml +0 -0
- data/spec/spec_tests/data/sdam/sharded/ruby_primary_different_address.yml +21 -0
- data/spec/spec_tests/data/sdam/sharded/ruby_primary_mismatched_me.yml +22 -0
- data/spec/spec_tests/data/sdam/sharded/too_new.yml +38 -0
- data/spec/spec_tests/data/sdam/sharded/too_old.yml +38 -0
- data/spec/spec_tests/data/sdam/single/compatible.yml +27 -0
- data/spec/spec_tests/data/sdam/single/direct_connection_external_ip.yml +37 -0
- data/spec/spec_tests/data/sdam/single/direct_connection_mongos.yml +36 -0
- data/spec/spec_tests/data/sdam/single/direct_connection_replicaset.yml +23 -0
- data/spec/spec_tests/data/sdam/single/direct_connection_rsarbiter.yml +38 -0
- data/spec/spec_tests/data/sdam/single/direct_connection_rsprimary.yml +37 -0
- data/spec/spec_tests/data/sdam/single/direct_connection_rssecondary.yml +38 -0
- data/spec/spec_tests/data/sdam/single/direct_connection_standalone.yml +35 -0
- data/spec/spec_tests/data/sdam/single/direct_connection_unavailable_seed.yml +28 -0
- data/spec/spec_tests/data/sdam/single/direct_connection_wrong_set_name.yml +40 -0
- data/spec/spec_tests/data/sdam/single/discover_standalone.yml +35 -0
- data/spec/spec_tests/data/sdam/single/discover_unavailable_seed.yml +28 -0
- data/spec/spec_tests/data/sdam/single/ls_timeout_standalone.yml +36 -0
- data/spec/spec_tests/data/sdam/single/not_ok_response.yml +44 -0
- data/spec/spec_tests/data/sdam/single/ruby_primary_different_address.yml +24 -0
- data/spec/spec_tests/data/sdam/single/ruby_primary_mismatched_me.yml +25 -0
- data/spec/spec_tests/data/sdam/single/standalone_removed.yml +35 -0
- data/spec/spec_tests/data/sdam/single/standalone_using_legacy_hello.yml +34 -0
- data/spec/spec_tests/data/sdam/single/too_new.yml +27 -0
- data/spec/spec_tests/data/sdam/single/too_old.yml +25 -0
- data/spec/spec_tests/data/sdam/single/too_old_then_upgraded.yml +48 -0
- data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +96 -0
- data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +88 -0
- data/spec/spec_tests/data/sdam_integration/find-network-error.yml +85 -0
- data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +118 -0
- data/spec/spec_tests/data/sdam_integration/hello-command-error.yml +160 -0
- data/spec/spec_tests/data/sdam_integration/hello-network-error.yml +158 -0
- data/spec/spec_tests/data/sdam_integration/hello-timeout.yml +225 -0
- data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +88 -0
- data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +117 -0
- data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +98 -0
- data/spec/spec_tests/data/sdam_monitoring/discovered_standalone.yml +70 -0
- data/spec/spec_tests/data/sdam_monitoring/load_balancer.yml +65 -0
- data/spec/spec_tests/data/sdam_monitoring/replica_set_other_chain.yml +222 -0
- data/spec/spec_tests/data/sdam_monitoring/replica_set_other_change.yml +225 -0
- data/spec/spec_tests/data/sdam_monitoring/replica_set_primary_address_change.yml +251 -0
- data/spec/spec_tests/data/sdam_monitoring/replica_set_with_me_mismatch.yml +111 -0
- data/spec/spec_tests/data/sdam_monitoring/replica_set_with_no_primary.yml +113 -0
- data/spec/spec_tests/data/sdam_monitoring/replica_set_with_primary.yml +112 -0
- data/spec/spec_tests/data/sdam_monitoring/replica_set_with_primary_and_secondary.yml +198 -0
- data/spec/spec_tests/data/sdam_monitoring/replica_set_with_primary_removal.yml +175 -0
- data/spec/spec_tests/data/sdam_monitoring/replica_set_with_removal.yml +111 -0
- data/spec/spec_tests/data/sdam_monitoring/replica_set_with_second_seed_removal.yml +106 -0
- data/spec/spec_tests/data/sdam_monitoring/required_replica_set.yml +108 -0
- data/spec/spec_tests/data/sdam_monitoring/standalone.yml +70 -0
- data/spec/spec_tests/data/sdam_monitoring/standalone_repeated.yml +86 -0
- data/spec/spec_tests/data/sdam_monitoring/standalone_suppress_equal_description_changes.yml +73 -0
- data/spec/spec_tests/data/sdam_monitoring/standalone_to_rs_with_me_mismatch.yml +90 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-directConnection.yml +13 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-replicaSet-errors.yml +6 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-multiple-hosts.yml +5 -0
- data/spec/spec_tests/data/seed_list_discovery/load-balanced/loadBalanced-true-txt.yml +10 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/direct-connection-false.yml +10 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/direct-connection-true.yml +5 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/encoded-userinfo-and-db.yml +15 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/loadBalanced-false-txt.yml +10 -0
- data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/longer-parent-in-return.yml +0 -0
- data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/misformatted-option.yml +0 -0
- data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/no-results.yml +0 -0
- data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/not-enough-parts.yml +0 -0
- data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/one-result-default-port.yml +0 -0
- data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/one-txt-record-multiple-strings.yml +0 -0
- data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/one-txt-record.yml +0 -0
- data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/parent-part-mismatch1.yml +0 -0
- data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/parent-part-mismatch2.yml +0 -0
- data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/parent-part-mismatch3.yml +0 -0
- data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/parent-part-mismatch4.yml +0 -0
- data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/parent-part-mismatch5.yml +0 -0
- data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/returned-parent-too-short.yml +0 -0
- data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/returned-parent-wrong.yml +0 -0
- data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/two-results-default-port.yml +0 -0
- data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/two-results-nonstandard-port.yml +0 -0
- data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/two-txt-records.yml +0 -0
- data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/txt-record-not-allowed-option.yml +0 -0
- data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/txt-record-with-overridden-ssl-option.yml +0 -0
- data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/txt-record-with-overridden-uri-option.yml +0 -0
- data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/txt-record-with-unallowed-option.yml +0 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-admin-database.yml +13 -0
- data/spec/spec_tests/data/seed_list_discovery/replica-set/uri-with-auth.yml +12 -0
- data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/uri-with-port.yml +0 -0
- data/spec/{support/dns_seedlist_discovery_tests → spec_tests/data/seed_list_discovery/replica-set}/uri-with-two-hosts.yml +0 -0
- data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/Nearest.yml +0 -0
- data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/Nearest_multiple.yml +0 -0
- data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +0 -0
- data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/PossiblePrimary.yml +0 -0
- data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/PossiblePrimaryNearest.yml +0 -0
- data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/Primary.yml +0 -0
- data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +0 -0
- data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +0 -0
- data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/Secondary.yml +0 -0
- data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +0 -0
- data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +0 -0
- data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/Secondary_multi_tags.yml +0 -0
- data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/Secondary_multi_tags2.yml +0 -0
- data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +0 -0
- data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetWithPrimary/read/Nearest.yml +0 -0
- data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetWithPrimary/read/Nearest_multiple.yml +0 -0
- data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +0 -0
- data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetWithPrimary/read/Primary.yml +0 -0
- data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +0 -0
- data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +0 -0
- data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetWithPrimary/read/Secondary.yml +0 -0
- data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetWithPrimary/read/SecondaryPreferred.yml +0 -0
- data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetWithPrimary/read/SecondaryPreferred_non_matching.yml +0 -0
- data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetWithPrimary/read/SecondaryPreferred_tags.yml +0 -0
- data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/ReplicaSetWithPrimary/read/Secondary_non_matching.yml +0 -0
- data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/Sharded/read/Nearest.yml +0 -0
- data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/Sharded/read/Primary.yml +0 -0
- data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/Sharded/read/PrimaryPreferred.yml +0 -0
- data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/Sharded/read/Secondary.yml +0 -0
- data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/Sharded/read/SecondaryPreferred.yml +0 -0
- data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/Single/read/SecondaryPreferred.yml +0 -0
- data/spec/{support/server_selection/selection → spec_tests/data/server_selection}/Unknown/read/SecondaryPreferred.yml +0 -0
- data/spec/{support/server_selection/rtt → spec_tests/data/server_selection_rtt}/first_value.yml +0 -0
- data/spec/{support/server_selection/rtt → spec_tests/data/server_selection_rtt}/first_value_zero.yml +0 -0
- data/spec/{support/server_selection/rtt → spec_tests/data/server_selection_rtt}/value_test_1.yml +0 -0
- data/spec/{support/server_selection/rtt → spec_tests/data/server_selection_rtt}/value_test_2.yml +0 -0
- data/spec/{support/server_selection/rtt → spec_tests/data/server_selection_rtt}/value_test_3.yml +0 -0
- data/spec/{support/server_selection/rtt → spec_tests/data/server_selection_rtt}/value_test_4.yml +0 -0
- data/spec/{support/server_selection/rtt → spec_tests/data/server_selection_rtt}/value_test_5.yml +0 -0
- data/spec/spec_tests/data/transactions/abort.yml +413 -0
- data/spec/spec_tests/data/transactions/bulk.yml +267 -0
- data/spec/spec_tests/data/transactions/causal-consistency.yml +175 -0
- data/spec/spec_tests/data/transactions/commit.yml +603 -0
- data/spec/spec_tests/data/transactions/count.yml +67 -0
- data/spec/spec_tests/data/transactions/create-collection.yml +131 -0
- data/spec/spec_tests/data/transactions/create-index.yml +152 -0
- data/spec/spec_tests/data/transactions/delete.yml +192 -0
- data/spec/spec_tests/data/transactions/error-labels.yml +1030 -0
- data/spec/spec_tests/data/transactions/errors-client.yml +56 -0
- data/spec/spec_tests/data/transactions/errors.yml +133 -0
- data/spec/spec_tests/data/transactions/findOneAndDelete.yml +134 -0
- data/spec/spec_tests/data/transactions/findOneAndReplace.yml +148 -0
- data/spec/spec_tests/data/transactions/findOneAndUpdate.yml +236 -0
- data/spec/spec_tests/data/transactions/insert.yml +390 -0
- data/spec/spec_tests/data/transactions/isolation.yml +133 -0
- data/spec/spec_tests/data/transactions/mongos-pin-auto.yml +1674 -0
- data/spec/spec_tests/data/transactions/mongos-recovery-token.yml +350 -0
- data/spec/spec_tests/data/transactions/pin-mongos.yml +559 -0
- data/spec/spec_tests/data/transactions/read-concern.yml +623 -0
- data/spec/spec_tests/data/transactions/read-pref.yml +348 -0
- data/spec/spec_tests/data/transactions/reads.yml +261 -0
- data/spec/spec_tests/data/transactions/retryable-abort-errorLabels.yml +126 -0
- data/spec/spec_tests/data/transactions/retryable-abort.yml +1317 -0
- data/spec/spec_tests/data/transactions/retryable-commit-errorLabels.yml +134 -0
- data/spec/spec_tests/data/transactions/retryable-commit.yml +1462 -0
- data/spec/spec_tests/data/transactions/retryable-writes.yml +218 -0
- data/spec/spec_tests/data/transactions/run-command.yml +197 -0
- data/spec/spec_tests/data/transactions/transaction-options-repl.yml +117 -0
- data/spec/spec_tests/data/transactions/transaction-options.yml +781 -0
- data/spec/spec_tests/data/transactions/update.yml +246 -0
- data/spec/spec_tests/data/transactions/write-concern.yml +554 -0
- data/spec/spec_tests/data/transactions_api/callback-aborts.yml +170 -0
- data/spec/spec_tests/data/transactions_api/callback-commits.yml +204 -0
- data/spec/spec_tests/data/transactions_api/callback-retry.yml +215 -0
- data/spec/spec_tests/data/transactions_api/commit-retry.yml +324 -0
- data/spec/spec_tests/data/transactions_api/commit-transienttransactionerror-4.2.yml +139 -0
- data/spec/spec_tests/data/transactions_api/commit-transienttransactionerror.yml +175 -0
- data/spec/spec_tests/data/transactions_api/commit-writeconcernerror.yml +216 -0
- data/spec/spec_tests/data/transactions_api/commit.yml +193 -0
- data/spec/spec_tests/data/transactions_api/transaction-options.yml +274 -0
- data/spec/spec_tests/data/transactions_unified/mongos-unpin.yml +172 -0
- data/spec/spec_tests/data/unified/valid-fail/operation-failure.yml +31 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-change-streams.yml +220 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-command-monitoring.yml +102 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-crud.yml +184 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-gridfs.yml +155 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-retryable-reads.yml +193 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-retryable-writes.yml +210 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-sessions.yml +215 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-transactions-convenient-api.yml +235 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-transactions-mongos-pin-auto.yml +169 -0
- data/spec/spec_tests/data/unified/valid-pass/poc-transactions.yml +170 -0
- data/spec/spec_tests/data/uri_options/auth-options.yml +49 -0
- data/spec/spec_tests/data/uri_options/compression-options.yml +51 -0
- data/spec/spec_tests/data/uri_options/concern-options.yml +55 -0
- data/spec/spec_tests/data/uri_options/connection-options.yml +209 -0
- data/spec/spec_tests/data/uri_options/connection-pool-options.yml +26 -0
- data/spec/spec_tests/data/uri_options/read-preference-options.yml +66 -0
- data/spec/spec_tests/data/uri_options/ruby-auth-options.yml +12 -0
- data/spec/spec_tests/data/uri_options/ruby-connection-options.yml +58 -0
- data/spec/spec_tests/data/uri_options/tls-options.yml +364 -0
- data/spec/spec_tests/data/versioned_api/crud-api-version-1-strict.yml +417 -0
- data/spec/spec_tests/data/versioned_api/crud-api-version-1.yml +411 -0
- data/spec/spec_tests/data/versioned_api/runcommand-helper-no-api-version-declared.yml +75 -0
- data/spec/spec_tests/data/versioned_api/test-commands-deprecation-errors.yml +47 -0
- data/spec/spec_tests/data/versioned_api/test-commands-strict-mode.yml +46 -0
- data/spec/spec_tests/data/versioned_api/transaction-handling.yml +128 -0
- data/spec/spec_tests/gridfs_spec.rb +6 -1
- data/spec/spec_tests/load_balancers_spec.rb +15 -0
- data/spec/spec_tests/max_staleness_spec.rb +7 -120
- data/spec/spec_tests/read_write_concern_connection_string_spec.rb +13 -0
- data/spec/spec_tests/read_write_concern_document_spec.rb +77 -0
- data/spec/spec_tests/read_write_concern_operaton_spec.rb +13 -0
- data/spec/spec_tests/retryable_reads_spec.rb +50 -0
- data/spec/spec_tests/retryable_writes_spec.rb +14 -70
- data/spec/spec_tests/sdam_integration_spec.rb +16 -0
- data/spec/spec_tests/sdam_monitoring_spec.rb +59 -22
- data/spec/spec_tests/sdam_spec.rb +156 -20
- data/spec/spec_tests/seed_list_discovery_spec.rb +118 -0
- data/spec/spec_tests/server_selection_rtt_spec.rb +11 -63
- data/spec/spec_tests/server_selection_spec.rb +7 -90
- data/spec/spec_tests/transactions_api_spec.rb +13 -0
- data/spec/spec_tests/transactions_spec.rb +8 -44
- data/spec/spec_tests/transactions_unified_spec.rb +13 -0
- data/spec/spec_tests/unified_spec.rb +18 -0
- data/spec/spec_tests/uri_options_spec.rb +93 -0
- data/spec/spec_tests/versioned_api_spec.rb +13 -0
- data/spec/stress/cleanup_spec.rb +61 -0
- data/spec/stress/connection_pool_stress_spec.rb +204 -0
- data/spec/stress/connection_pool_timing_spec.rb +184 -0
- data/spec/stress/fork_reconnect_stress_spec.rb +108 -0
- data/spec/stress/push_monitor_close_spec.rb +44 -0
- data/spec/support/authorization.rb +43 -173
- data/spec/support/aws_utils/base.rb +137 -0
- data/spec/support/aws_utils/inspector.rb +227 -0
- data/spec/support/aws_utils/orchestrator.rb +373 -0
- data/spec/support/aws_utils/provisioner.rb +363 -0
- data/spec/support/aws_utils.rb +65 -0
- data/spec/support/background_thread_registry.rb +70 -0
- data/spec/support/certificates/README.md +106 -0
- data/spec/support/certificates/atlas-ocsp-ca.crt +110 -0
- data/spec/support/certificates/atlas-ocsp.crt +157 -0
- data/spec/support/certificates/ca.crt +76 -0
- data/spec/support/certificates/client-encrypted.key +30 -0
- data/spec/support/certificates/client-int.crt +78 -0
- data/spec/support/certificates/client-second-level-bundle.pem +179 -0
- data/spec/support/certificates/client-second-level.crt +74 -0
- data/spec/support/certificates/client-second-level.key +27 -0
- data/spec/support/certificates/client-second-level.pem +101 -0
- data/spec/support/certificates/client-x509.crt +78 -0
- data/spec/support/certificates/client-x509.key +27 -0
- data/spec/support/certificates/client-x509.pem +105 -0
- data/spec/support/certificates/client.crt +74 -0
- data/spec/support/certificates/client.key +27 -0
- data/spec/support/certificates/client.pem +90 -90
- data/spec/support/certificates/crl.pem +10 -8
- data/spec/support/certificates/crl_client_revoked.pem +11 -10
- data/spec/support/certificates/multi-ca.crt +152 -0
- data/spec/support/certificates/python-ca.crt +76 -0
- data/spec/support/certificates/server-int.crt +78 -0
- data/spec/support/certificates/server-second-level-bundle.pem +179 -0
- data/spec/support/certificates/server-second-level.crt +74 -0
- data/spec/support/certificates/server-second-level.key +27 -0
- data/spec/support/certificates/server-second-level.pem +101 -0
- data/spec/support/certificates/server.pem +99 -32
- data/spec/support/client_registry.rb +254 -0
- data/spec/support/client_registry_macros.rb +26 -0
- data/spec/support/cluster_tools.rb +379 -0
- data/spec/support/common_shortcuts.rb +374 -0
- data/spec/support/constraints.rb +12 -73
- data/spec/support/crypt/corpus/corpus-key-aws.json +33 -0
- data/spec/support/crypt/corpus/corpus-key-local.json +31 -0
- data/spec/support/crypt/corpus/corpus-schema.json +2057 -0
- data/spec/support/crypt/corpus/corpus.json +3657 -0
- data/spec/support/crypt/corpus/corpus_encrypted.json +4152 -0
- data/spec/support/crypt/data_keys/key_document_aws.json +34 -0
- data/spec/support/crypt/data_keys/key_document_local.json +31 -0
- data/spec/support/crypt/external/external-key.json +31 -0
- data/spec/support/crypt/external/external-schema.json +19 -0
- data/spec/support/crypt/limits/limits-doc.json +102 -0
- data/spec/support/crypt/limits/limits-key.json +31 -0
- data/spec/support/crypt/limits/limits-schema.json +1405 -0
- data/spec/support/crypt/schema_maps/schema_map_aws.json +17 -0
- data/spec/support/crypt/schema_maps/schema_map_aws_key_alt_names.json +12 -0
- data/spec/support/crypt/schema_maps/schema_map_local.json +18 -0
- data/spec/support/crypt/schema_maps/schema_map_local_key_alt_names.json +12 -0
- data/spec/support/crypt.rb +157 -0
- data/spec/support/dns.rb +16 -0
- data/spec/support/json_ext_formatter.rb +16 -0
- data/spec/support/keyword_struct.rb +29 -0
- data/spec/support/local_resource_registry.rb +37 -0
- data/spec/support/matchers.rb +52 -1
- data/spec/support/monitoring_ext.rb +19 -0
- data/spec/support/ocsp +1 -0
- data/spec/support/primary_socket.rb +5 -2
- data/spec/support/sdam_formatter_integration.rb +119 -0
- data/spec/support/session_registry.rb +55 -0
- data/spec/support/shared/app_metadata.rb +167 -0
- data/spec/support/shared/auth_context.rb +16 -0
- data/spec/support/shared/protocol.rb +5 -0
- data/spec/support/shared/scram_conversation.rb +103 -0
- data/spec/support/shared/server_selector.rb +114 -65
- data/spec/support/shared/session.rb +108 -63
- data/spec/support/spec_config.rb +585 -22
- data/spec/support/spec_setup.rb +83 -0
- data/spec/support/using_hash.rb +31 -0
- data/spec/support/utils.rb +598 -0
- data.tar.gz.sig +0 -0
- metadata +2227 -792
- metadata.gz.sig +2 -1
- data/lib/mongo/cluster/app_metadata.rb +0 -158
- data/lib/mongo/cluster/topology/replica_set.rb +0 -339
- data/lib/mongo/collection/view/builder/find_command.rb +0 -139
- data/lib/mongo/collection/view/builder/flags.rb +0 -62
- data/lib/mongo/collection/view/builder/modifiers.rb +0 -80
- data/lib/mongo/collection/view/builder/op_query.rb +0 -91
- data/lib/mongo/cursor/builder/get_more_command.rb +0 -74
- data/lib/mongo/cursor/builder/kill_cursors_command.rb +0 -90
- data/lib/mongo/cursor/builder/op_get_more.rb +0 -61
- data/lib/mongo/cursor/builder/op_kill_cursors.rb +0 -84
- data/lib/mongo/cursor/builder.rb +0 -18
- data/lib/mongo/error/failed_stringprep_validation.rb +0 -38
- data/lib/mongo/event/description_changed.rb +0 -72
- data/lib/mongo/event/member_discovered.rb +0 -67
- data/lib/mongo/event/primary_elected.rb +0 -55
- data/lib/mongo/event/standalone_discovered.rb +0 -53
- data/lib/mongo/server/connectable.rb +0 -107
- data/lib/mongo/server/connection_pool/queue.rb +0 -242
- data/lib/mongo/server/context.rb +0 -69
- data/lib/mongo/server/description/inspector/description_changed.rb +0 -57
- data/lib/mongo/server/description/inspector/member_discovered.rb +0 -59
- data/lib/mongo/server/description/inspector/primary_elected.rb +0 -60
- data/lib/mongo/server/description/inspector/standalone_discovered.rb +0 -56
- data/lib/mongo/server/description/inspector.rb +0 -81
- data/lib/mongo/server_selector/selectable.rb +0 -281
- data/lib/mongo/write_concern/normalizable.rb +0 -64
- data/spec/integration/retryable_writes_spec.rb +0 -737
- data/spec/mongo/auth/scram/negotiation_spec.rb +0 -575
- data/spec/mongo/cluster/app_metadata_spec.rb +0 -133
- data/spec/mongo/collection/view/builder/flags_spec.rb +0 -106
- data/spec/mongo/collection/view/builder/modifiers_spec.rb +0 -210
- data/spec/mongo/operation/read_preference_spec.rb +0 -245
- data/spec/mongo/server/connection_pool/queue_spec.rb +0 -223
- data/spec/mongo/server/description/inspector/description_changed_spec.rb +0 -78
- data/spec/mongo/server/description/inspector/primary_elected_spec.rb +0 -94
- data/spec/spec_tests/dns_seedlist_discovery_spec.rb +0 -96
- data/spec/support/certificates/ca.pem +0 -17
- data/spec/support/certificates/client_cert.pem +0 -21
- data/spec/support/certificates/client_key.pem +0 -28
- data/spec/support/certificates/client_key_encrypted.pem +0 -30
- data/spec/support/certificates/password_protected.pem +0 -51
- data/spec/support/change_streams/operation.rb +0 -62
- data/spec/support/change_streams.rb +0 -265
- data/spec/support/change_streams_tests/change-streams-errors.yml +0 -53
- data/spec/support/change_streams_tests/change-streams.yml +0 -299
- data/spec/support/command_monitoring/bulkWrite.yml +0 -49
- data/spec/support/command_monitoring/find.yml +0 -266
- data/spec/support/command_monitoring/insertMany.yml +0 -75
- data/spec/support/command_monitoring/updateMany.yml +0 -67
- data/spec/support/command_monitoring/updateOne.yml +0 -95
- data/spec/support/command_monitoring.rb +0 -376
- data/spec/support/connection_string.rb +0 -232
- data/spec/support/connection_string_tests/invalid-uris.yml +0 -241
- data/spec/support/connection_string_tests/valid-auth.yml +0 -241
- data/spec/support/connection_string_tests/valid-warnings.yml +0 -55
- data/spec/support/crud/read.rb +0 -175
- data/spec/support/crud/write.rb +0 -269
- data/spec/support/crud.rb +0 -320
- data/spec/support/crud_tests/read/aggregate-collation.yml +0 -17
- data/spec/support/crud_tests/read/aggregate-out.yml +0 -49
- data/spec/support/crud_tests/read/count-collation.yml +0 -25
- data/spec/support/crud_tests/read/distinct-collation.yml +0 -17
- data/spec/support/crud_tests/read/find-collation.yml +0 -15
- data/spec/support/crud_tests/write/bulkWrite-arrayFilters.yml +0 -44
- data/spec/support/crud_tests/write/deleteMany-collation.yml +0 -22
- data/spec/support/crud_tests/write/deleteOne-collation.yml +0 -22
- data/spec/support/crud_tests/write/findOneAndDelete-collation.yml +0 -23
- data/spec/support/crud_tests/write/findOneAndReplace-collation.yml +0 -24
- data/spec/support/crud_tests/write/findOneAndUpdate-collation.yml +0 -27
- data/spec/support/crud_tests/write/insertMany.yml +0 -21
- data/spec/support/crud_tests/write/replaceOne-collation.yml +0 -24
- data/spec/support/crud_tests/write/updateMany-arrayFilters.yml +0 -63
- data/spec/support/crud_tests/write/updateMany-collation.yml +0 -28
- data/spec/support/crud_tests/write/updateOne-arrayFilters.yml +0 -109
- data/spec/support/crud_tests/write/updateOne-collation.yml +0 -25
- data/spec/support/event_subscriber.rb +0 -66
- data/spec/support/gridfs.rb +0 -638
- data/spec/support/lite_constraints.rb +0 -18
- data/spec/support/max_staleness/Unknown/SmallMaxStaleness.yml +0 -14
- data/spec/support/retryable_writes_tests/bulkWrite-serverErrors.yml +0 -90
- data/spec/support/retryable_writes_tests/bulkWrite.yml +0 -403
- data/spec/support/retryable_writes_tests/deleteOne-serverErrors.yml +0 -50
- data/spec/support/retryable_writes_tests/deleteOne.yml +0 -60
- data/spec/support/retryable_writes_tests/findOneAndDelete-serverErrors.yml +0 -50
- data/spec/support/retryable_writes_tests/findOneAndDelete.yml +0 -61
- data/spec/support/retryable_writes_tests/findOneAndReplace-serverErrors.yml +0 -54
- data/spec/support/retryable_writes_tests/findOneAndReplace.yml +0 -66
- data/spec/support/retryable_writes_tests/findOneAndUpdate-serverErrors.yml +0 -54
- data/spec/support/retryable_writes_tests/findOneAndUpdate.yml +0 -65
- data/spec/support/retryable_writes_tests/insertMany-serverErrors.yml +0 -59
- data/spec/support/retryable_writes_tests/insertMany.yml +0 -77
- data/spec/support/retryable_writes_tests/insertOne-serverErrors.yml +0 -471
- data/spec/support/retryable_writes_tests/insertOne.yml +0 -64
- data/spec/support/retryable_writes_tests/replaceOne-serverErrors.yml +0 -58
- data/spec/support/retryable_writes_tests/replaceOne.yml +0 -69
- data/spec/support/retryable_writes_tests/updateOne-serverErrors.yml +0 -58
- data/spec/support/retryable_writes_tests/updateOne.yml +0 -138
- data/spec/support/sdam/rs/compatible.yml +0 -41
- data/spec/support/sdam/rs/discover_arbiters.yml +0 -43
- data/spec/support/sdam/rs/discover_passives.yml +0 -81
- data/spec/support/sdam/rs/discover_primary.yml +0 -42
- data/spec/support/sdam/rs/discover_secondary.yml +0 -43
- data/spec/support/sdam/rs/discovery.yml +0 -203
- data/spec/support/sdam/rs/equal_electionids.yml +0 -53
- data/spec/support/sdam/rs/ghost_discovered.yml +0 -41
- data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +0 -36
- data/spec/support/sdam/rs/ls_timeout.yml +0 -243
- data/spec/support/sdam/rs/member_reconfig.yml +0 -72
- data/spec/support/sdam/rs/member_standalone.yml +0 -64
- data/spec/support/sdam/rs/new_primary.yml +0 -78
- data/spec/support/sdam/rs/new_primary_new_electionid.yml +0 -110
- data/spec/support/sdam/rs/new_primary_new_setversion.yml +0 -110
- data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +0 -75
- data/spec/support/sdam/rs/non_rs_member.yml +0 -32
- data/spec/support/sdam/rs/normalize_case.yml +0 -51
- data/spec/support/sdam/rs/normalize_case_me.yml +0 -100
- data/spec/support/sdam/rs/null_election_id.yml +0 -164
- data/spec/support/sdam/rs/primary_becomes_standalone.yml +0 -54
- data/spec/support/sdam/rs/primary_changes_set_name.yml +0 -61
- data/spec/support/sdam/rs/primary_disconnect.yml +0 -58
- data/spec/support/sdam/rs/primary_disconnect_electionid.yml +0 -174
- data/spec/support/sdam/rs/primary_disconnect_setversion.yml +0 -174
- data/spec/support/sdam/rs/primary_hint_from_secondary_with_mismatched_me.yml +0 -62
- data/spec/support/sdam/rs/primary_mismatched_me.yml +0 -26
- data/spec/support/sdam/rs/primary_reports_new_member.yml +0 -171
- data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +0 -79
- data/spec/support/sdam/rs/primary_wrong_set_name.yml +0 -29
- data/spec/support/sdam/rs/response_from_removed.yml +0 -67
- data/spec/support/sdam/rs/rsother_discovered.yml +0 -66
- data/spec/support/sdam/rs/sec_not_auth.yml +0 -53
- data/spec/support/sdam/rs/secondary_ignore_ok_0.yml +0 -85
- data/spec/support/sdam/rs/secondary_mismatched_me.yml +0 -26
- data/spec/support/sdam/rs/secondary_wrong_set_name.yml +0 -30
- data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +0 -73
- data/spec/support/sdam/rs/set_version_without_electionid.yml +0 -69
- data/spec/support/sdam/rs/setversion_without_electionid.yml +0 -75
- data/spec/support/sdam/rs/stepdown_change_set_name.yml +0 -63
- data/spec/support/sdam/rs/too_new.yml +0 -41
- data/spec/support/sdam/rs/too_old.yml +0 -39
- data/spec/support/sdam/rs/unexpected_mongos.yml +0 -28
- data/spec/support/sdam/rs/use_setversion_without_electionid.yml +0 -108
- data/spec/support/sdam/rs/wrong_set_name.yml +0 -37
- data/spec/support/sdam/sharded/compatible.yml +0 -38
- data/spec/support/sdam/sharded/ls_timeout_mongos.yml +0 -97
- data/spec/support/sdam/sharded/mongos_disconnect.yml +0 -110
- data/spec/support/sdam/sharded/multiple_mongoses.yml +0 -50
- data/spec/support/sdam/sharded/non_mongos_removed.yml +0 -45
- data/spec/support/sdam/sharded/single_mongos.yml +0 -33
- data/spec/support/sdam/sharded/too_new.yml +0 -36
- data/spec/support/sdam/sharded/too_old.yml +0 -36
- data/spec/support/sdam/single/compatible.yml +0 -26
- data/spec/support/sdam/single/direct_connection_external_ip.yml +0 -36
- data/spec/support/sdam/single/direct_connection_mongos.yml +0 -35
- data/spec/support/sdam/single/direct_connection_rsarbiter.yml +0 -37
- data/spec/support/sdam/single/direct_connection_rsprimary.yml +0 -36
- data/spec/support/sdam/single/direct_connection_rssecondary.yml +0 -37
- data/spec/support/sdam/single/direct_connection_slave.yml +0 -34
- data/spec/support/sdam/single/direct_connection_standalone.yml +0 -34
- data/spec/support/sdam/single/ls_timeout_standalone.yml +0 -35
- data/spec/support/sdam/single/not_ok_response.yml +0 -42
- data/spec/support/sdam/single/standalone_removed.yml +0 -34
- data/spec/support/sdam/single/too_new.yml +0 -26
- data/spec/support/sdam/single/too_old.yml +0 -24
- data/spec/support/sdam/single/unavailable_seed.yml +0 -28
- data/spec/support/sdam_monitoring/replica_set_with_no_primary.yml +0 -112
- data/spec/support/sdam_monitoring/replica_set_with_primary.yml +0 -111
- data/spec/support/sdam_monitoring/replica_set_with_removal.yml +0 -106
- data/spec/support/sdam_monitoring/required_replica_set.yml +0 -84
- data/spec/support/sdam_monitoring/standalone.yml +0 -70
- data/spec/support/sdam_monitoring.rb +0 -144
- data/spec/support/server_discovery_and_monitoring.rb +0 -236
- data/spec/support/server_selection.rb +0 -163
- data/spec/support/server_selection_rtt.rb +0 -41
- data/spec/support/transactions/operation.rb +0 -373
- data/spec/support/transactions.rb +0 -391
- data/spec/support/transactions_tests/abort.yml +0 -403
- data/spec/support/transactions_tests/bulk.yml +0 -267
- data/spec/support/transactions_tests/causal-consistency.yml +0 -173
- data/spec/support/transactions_tests/commit.yml +0 -593
- data/spec/support/transactions_tests/delete.yml +0 -184
- data/spec/support/transactions_tests/error-labels.yml +0 -948
- data/spec/support/transactions_tests/errors.yml +0 -125
- data/spec/support/transactions_tests/findOneAndDelete.yml +0 -126
- data/spec/support/transactions_tests/findOneAndReplace.yml +0 -140
- data/spec/support/transactions_tests/findOneAndUpdate.yml +0 -228
- data/spec/support/transactions_tests/insert.yml +0 -264
- data/spec/support/transactions_tests/isolation.yml +0 -125
- data/spec/support/transactions_tests/read-pref.yml +0 -340
- data/spec/support/transactions_tests/reads.yml +0 -298
- data/spec/support/transactions_tests/retryable-abort.yml +0 -1292
- data/spec/support/transactions_tests/retryable-commit.yml +0 -1332
- data/spec/support/transactions_tests/retryable-writes.yml +0 -208
- data/spec/support/transactions_tests/run-command.yml +0 -189
- data/spec/support/transactions_tests/transaction-options.yml +0 -877
- data/spec/support/transactions_tests/update.yml +0 -246
- data/spec/support/transactions_tests/write-concern.yml +0 -236
- data/spec/support/travis.rb +0 -14
data/lib/mongo/session.rb
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
#
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# encoding: utf-8
|
|
3
|
+
|
|
4
|
+
# Copyright (C) 2017-2020 MongoDB Inc.
|
|
2
5
|
#
|
|
3
6
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
7
|
# you may not use this file except in compliance with the License.
|
|
@@ -18,37 +21,204 @@ require 'mongo/session/server_session'
|
|
|
18
21
|
module Mongo
|
|
19
22
|
|
|
20
23
|
# A logical session representing a set of sequential operations executed
|
|
21
|
-
#
|
|
24
|
+
# by an application that are related in some way.
|
|
25
|
+
#
|
|
26
|
+
# @note Session objects are not thread-safe. An application may use a session
|
|
27
|
+
# from only one thread or process at a time.
|
|
22
28
|
#
|
|
23
29
|
# @since 2.5.0
|
|
24
30
|
class Session
|
|
25
31
|
extend Forwardable
|
|
26
32
|
include Retryable
|
|
33
|
+
include Loggable
|
|
34
|
+
include ClusterTime::Consumer
|
|
27
35
|
|
|
28
|
-
#
|
|
36
|
+
# Initialize a Session.
|
|
37
|
+
#
|
|
38
|
+
# @note Applications should use Client#start_session to begin a session.
|
|
39
|
+
#
|
|
40
|
+
# @example
|
|
41
|
+
# Session.new(server_session, client, options)
|
|
42
|
+
#
|
|
43
|
+
# @param [ ServerSession ] server_session The server session this session is associated with.
|
|
44
|
+
# @param [ Client ] client The client through which this session is created.
|
|
45
|
+
# @param [ Hash ] options The options for this session.
|
|
46
|
+
#
|
|
47
|
+
# @option options [ true|false ] :causal_consistency Whether to enable
|
|
48
|
+
# causal consistency for this session.
|
|
49
|
+
# @option options [ Hash ] :default_transaction_options Options to pass
|
|
50
|
+
# to start_transaction by default, can contain any of the options that
|
|
51
|
+
# start_transaction accepts.
|
|
52
|
+
# @option options [ true|false ] :implicit For internal driver use only -
|
|
53
|
+
# specifies whether the session is implicit.
|
|
54
|
+
# @option options [ Hash ] :read_preference The read preference options hash,
|
|
55
|
+
# with the following optional keys:
|
|
56
|
+
# - *:mode* -- the read preference as a string or symbol; valid values are
|
|
57
|
+
# *:primary*, *:primary_preferred*, *:secondary*, *:secondary_preferred*
|
|
58
|
+
# and *:nearest*.
|
|
59
|
+
#
|
|
60
|
+
# @since 2.5.0
|
|
61
|
+
# @api private
|
|
62
|
+
def initialize(server_session, client, options = {})
|
|
63
|
+
@server_session = server_session
|
|
64
|
+
options = options.dup
|
|
65
|
+
|
|
66
|
+
@client = client.use(:admin)
|
|
67
|
+
@options = options.freeze
|
|
68
|
+
@cluster_time = nil
|
|
69
|
+
@state = NO_TRANSACTION_STATE
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# @return [ Hash ] The options for this session.
|
|
29
73
|
#
|
|
30
74
|
# @since 2.5.0
|
|
31
75
|
attr_reader :options
|
|
32
76
|
|
|
33
|
-
#
|
|
77
|
+
# @return [ Client ] The client through which this session was created.
|
|
34
78
|
#
|
|
35
79
|
# @since 2.5.1
|
|
36
80
|
attr_reader :client
|
|
37
81
|
|
|
38
|
-
|
|
82
|
+
def cluster
|
|
83
|
+
@client.cluster
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# @return [ BSON::Timestamp ] The latest seen operation time for this session.
|
|
39
87
|
#
|
|
40
88
|
# @since 2.5.0
|
|
41
|
-
attr_reader :
|
|
89
|
+
attr_reader :operation_time
|
|
90
|
+
|
|
91
|
+
# @return [ Hash ] The options for the transaction currently being executed
|
|
92
|
+
# on this session.
|
|
93
|
+
#
|
|
94
|
+
# @since 2.6.0
|
|
95
|
+
def txn_options
|
|
96
|
+
@txn_options or raise ArgumentError, "There is no active transaction"
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# Is this session an implicit one (not user-created).
|
|
100
|
+
#
|
|
101
|
+
# @example Is the session implicit?
|
|
102
|
+
# session.implicit?
|
|
103
|
+
#
|
|
104
|
+
# @return [ true, false ] Whether this session is implicit.
|
|
105
|
+
#
|
|
106
|
+
# @since 2.5.1
|
|
107
|
+
def implicit?
|
|
108
|
+
@implicit ||= !!(@options.key?(:implicit) && @options[:implicit] == true)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Is this session an explicit one (i.e. user-created).
|
|
112
|
+
#
|
|
113
|
+
# @example Is the session explicit?
|
|
114
|
+
# session.explicit?
|
|
115
|
+
#
|
|
116
|
+
# @return [ true, false ] Whether this session is explicit.
|
|
117
|
+
#
|
|
118
|
+
# @since 2.5.2
|
|
119
|
+
def explicit?
|
|
120
|
+
!implicit?
|
|
121
|
+
end
|
|
42
122
|
|
|
43
|
-
#
|
|
123
|
+
# Whether reads executed with this session can be retried according to
|
|
124
|
+
# the modern retryable reads specification.
|
|
125
|
+
#
|
|
126
|
+
# If this method returns true, the modern retryable reads have been
|
|
127
|
+
# requested by the application. If the server selected for a read operation
|
|
128
|
+
# supports modern retryable reads, they will be used for that particular
|
|
129
|
+
# operation. If the server selected for a read operation does not support
|
|
130
|
+
# modern retryable reads, the read will not be retried.
|
|
131
|
+
#
|
|
132
|
+
# If this method returns false, legacy retryable reads have been requested
|
|
133
|
+
# by the application. Legacy retryable read logic will be used regardless
|
|
134
|
+
# of server version of the server(s) that the client is connected to.
|
|
135
|
+
# The number of read retries is given by :max_read_retries client option,
|
|
136
|
+
# which is 1 by default and can be set to 0 to disable legacy read retries.
|
|
137
|
+
#
|
|
138
|
+
# @api private
|
|
139
|
+
def retry_reads?
|
|
140
|
+
client.options[:retry_reads] != false
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
# Will writes executed with this session be retried.
|
|
144
|
+
#
|
|
145
|
+
# @example Will writes be retried.
|
|
146
|
+
# session.retry_writes?
|
|
147
|
+
#
|
|
148
|
+
# @return [ true, false ] If writes will be retried.
|
|
149
|
+
#
|
|
150
|
+
# @note Retryable writes are only available on server versions at least 3.6
|
|
151
|
+
# and with sharded clusters or replica sets.
|
|
44
152
|
#
|
|
45
153
|
# @since 2.5.0
|
|
46
|
-
|
|
154
|
+
def retry_writes?
|
|
155
|
+
!!client.options[:retry_writes] && (cluster.replica_set? || cluster.sharded?)
|
|
156
|
+
end
|
|
47
157
|
|
|
48
|
-
#
|
|
158
|
+
# Get the read preference the session will use in the currently
|
|
159
|
+
# active transaction.
|
|
160
|
+
#
|
|
161
|
+
# This is a driver style hash with underscore keys.
|
|
162
|
+
#
|
|
163
|
+
# @example Get the transaction's read preference
|
|
164
|
+
# session.txn_read_preference
|
|
165
|
+
#
|
|
166
|
+
# @return [ Hash ] The read preference of the transaction.
|
|
49
167
|
#
|
|
50
168
|
# @since 2.6.0
|
|
51
|
-
|
|
169
|
+
def txn_read_preference
|
|
170
|
+
rp = txn_options[:read] ||
|
|
171
|
+
@client.read_preference
|
|
172
|
+
Mongo::Lint.validate_underscore_read_preference(rp)
|
|
173
|
+
rp
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
# Whether this session has ended.
|
|
177
|
+
#
|
|
178
|
+
# @example
|
|
179
|
+
# session.ended?
|
|
180
|
+
#
|
|
181
|
+
# @return [ true, false ] Whether the session has ended.
|
|
182
|
+
#
|
|
183
|
+
# @since 2.5.0
|
|
184
|
+
def ended?
|
|
185
|
+
@server_session.nil?
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
# Get the server session id of this session, if the session was not ended.
|
|
189
|
+
# If the session was ended, returns nil.
|
|
190
|
+
#
|
|
191
|
+
# @example Get the session id.
|
|
192
|
+
# session.session_id
|
|
193
|
+
#
|
|
194
|
+
# @return [ BSON::Document ] The server session id.
|
|
195
|
+
#
|
|
196
|
+
# @since 2.5.0
|
|
197
|
+
def session_id
|
|
198
|
+
if ended?
|
|
199
|
+
raise Error::SessionEnded
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
@server_session.session_id
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
# @return [ Server | nil ] The server (which should be a mongos) that this
|
|
206
|
+
# session is pinned to, if any.
|
|
207
|
+
#
|
|
208
|
+
# @api private
|
|
209
|
+
attr_reader :pinned_server
|
|
210
|
+
|
|
211
|
+
# @return [ Object | nil ] The service id that this session is pinned to,
|
|
212
|
+
# if any.
|
|
213
|
+
#
|
|
214
|
+
# @api private
|
|
215
|
+
attr_reader :pinned_service_id
|
|
216
|
+
|
|
217
|
+
# @return [ BSON::Document | nil ] Recovery token for the sharded
|
|
218
|
+
# transaction being executed on this session, if any.
|
|
219
|
+
#
|
|
220
|
+
# @api private
|
|
221
|
+
attr_accessor :recovery_token
|
|
52
222
|
|
|
53
223
|
# Error message indicating that the session was retrieved from a client with a different cluster than that of the
|
|
54
224
|
# client through which it is currently being used.
|
|
@@ -66,22 +236,25 @@ module Mongo
|
|
|
66
236
|
# Error message describing that sessions are not supported by the server version.
|
|
67
237
|
#
|
|
68
238
|
# @since 2.5.0
|
|
239
|
+
# @deprecated
|
|
69
240
|
SESSIONS_NOT_SUPPORTED = 'Sessions are not supported by the connected servers.'.freeze
|
|
241
|
+
# Note: SESSIONS_NOT_SUPPORTED is used by Mongoid - do not remove from driver.
|
|
70
242
|
|
|
71
|
-
# The state of a session in which the last operation was not related to
|
|
72
|
-
# operations have yet occurred.
|
|
243
|
+
# The state of a session in which the last operation was not related to
|
|
244
|
+
# any transaction or no operations have yet occurred.
|
|
73
245
|
#
|
|
74
246
|
# @since 2.6.0
|
|
75
247
|
NO_TRANSACTION_STATE = :no_transaction
|
|
76
248
|
|
|
77
|
-
# The state of a session in which a user has initiated a transaction but
|
|
78
|
-
# the transactions have occurred yet.
|
|
249
|
+
# The state of a session in which a user has initiated a transaction but
|
|
250
|
+
# no operations within the transactions have occurred yet.
|
|
79
251
|
#
|
|
80
252
|
# @since 2.6.0
|
|
81
253
|
STARTING_TRANSACTION_STATE = :starting_transaction
|
|
82
254
|
|
|
83
|
-
# The state of a session in which a transaction has been started and at
|
|
84
|
-
# occurred, but the transaction has not yet been
|
|
255
|
+
# The state of a session in which a transaction has been started and at
|
|
256
|
+
# least one operation has occurred, but the transaction has not yet been
|
|
257
|
+
# committed or aborted.
|
|
85
258
|
#
|
|
86
259
|
# @since 2.6.0
|
|
87
260
|
TRANSACTION_IN_PROGRESS_STATE = :transaction_in_progress
|
|
@@ -96,43 +269,12 @@ module Mongo
|
|
|
96
269
|
# @since 2.6.0
|
|
97
270
|
TRANSACTION_ABORTED_STATE = :transaction_aborted
|
|
98
271
|
|
|
272
|
+
# @api private
|
|
99
273
|
UNLABELED_WRITE_CONCERN_CODES = [
|
|
100
274
|
79, # UnknownReplWriteConcern
|
|
101
275
|
100, # CannotSatisfyWriteConcern,
|
|
102
276
|
].freeze
|
|
103
277
|
|
|
104
|
-
# Initialize a Session.
|
|
105
|
-
#
|
|
106
|
-
# @example
|
|
107
|
-
# Session.new(server_session, client, options)
|
|
108
|
-
#
|
|
109
|
-
# @param [ ServerSession ] server_session The server session this session is associated with.
|
|
110
|
-
# @param [ Client ] client The client through which this session is created.
|
|
111
|
-
# @param [ Hash ] options The options for this session.
|
|
112
|
-
#
|
|
113
|
-
# @option options [ Hash ] :read_preference The read preference options hash,
|
|
114
|
-
# with the following optional keys:
|
|
115
|
-
# - *:mode* -- the read preference as a string or symbol; valid values are
|
|
116
|
-
# *:primary*, *:primary_preferred*, *:secondary*, *:secondary_preferred*
|
|
117
|
-
# and *:nearest*.
|
|
118
|
-
#
|
|
119
|
-
# @since 2.5.0
|
|
120
|
-
def initialize(server_session, client, options = {})
|
|
121
|
-
@server_session = server_session
|
|
122
|
-
options = options.dup
|
|
123
|
-
|
|
124
|
-
# Because the read preference will need to be inserted into a command as a string, we convert
|
|
125
|
-
# it from a symbol immediately upon receiving it.
|
|
126
|
-
if options[:read_preference] && options[:read_preference][:mode]
|
|
127
|
-
options[:read_preference][:mode] = options[:read_preference][:mode].to_s
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
@client = client.use(:admin)
|
|
131
|
-
@options = options.freeze
|
|
132
|
-
@cluster_time = nil
|
|
133
|
-
@state = NO_TRANSACTION_STATE
|
|
134
|
-
end
|
|
135
|
-
|
|
136
278
|
# Get a formatted string for use in inspection.
|
|
137
279
|
#
|
|
138
280
|
# @example Inspect the session object.
|
|
@@ -147,6 +289,16 @@ module Mongo
|
|
|
147
289
|
|
|
148
290
|
# End this session.
|
|
149
291
|
#
|
|
292
|
+
# If there is an in-progress transaction on this session, the transaction
|
|
293
|
+
# is aborted. The server session associated with this session is returned
|
|
294
|
+
# to the server session pool. Finally, this session is marked ended and
|
|
295
|
+
# is no longer usable.
|
|
296
|
+
#
|
|
297
|
+
# If this session is already ended, this method does nothing.
|
|
298
|
+
#
|
|
299
|
+
# Note that this method does not directly issue an endSessions command
|
|
300
|
+
# to this server, contrary to what its name might suggest.
|
|
301
|
+
#
|
|
150
302
|
# @example
|
|
151
303
|
# session.end_session
|
|
152
304
|
#
|
|
@@ -155,23 +307,455 @@ module Mongo
|
|
|
155
307
|
# @since 2.5.0
|
|
156
308
|
def end_session
|
|
157
309
|
if !ended? && @client
|
|
158
|
-
|
|
310
|
+
if within_states?(TRANSACTION_IN_PROGRESS_STATE)
|
|
311
|
+
begin
|
|
312
|
+
abort_transaction
|
|
313
|
+
rescue Mongo::Error, Error::AuthError
|
|
314
|
+
end
|
|
315
|
+
end
|
|
159
316
|
@client.cluster.session_pool.checkin(@server_session)
|
|
160
317
|
end
|
|
161
|
-
ensure
|
|
162
|
-
@server_session = nil
|
|
318
|
+
ensure
|
|
319
|
+
@server_session = nil
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
# Executes the provided block in a transaction, retrying as necessary.
|
|
323
|
+
#
|
|
324
|
+
# Returns the return value of the block.
|
|
325
|
+
#
|
|
326
|
+
# Exact number of retries and when they are performed are implementation
|
|
327
|
+
# details of the driver; the provided block should be idempotent, and
|
|
328
|
+
# should be prepared to be called more than once. The driver may retry
|
|
329
|
+
# the commit command within an active transaction or it may repeat the
|
|
330
|
+
# transaction and invoke the block again, depending on the error
|
|
331
|
+
# encountered if any. Note also that the retries may be executed against
|
|
332
|
+
# different servers.
|
|
333
|
+
#
|
|
334
|
+
# Transactions cannot be nested - InvalidTransactionOperation will be raised
|
|
335
|
+
# if this method is called when the session already has an active transaction.
|
|
336
|
+
#
|
|
337
|
+
# Exceptions raised by the block which are not derived from Mongo::Error
|
|
338
|
+
# stop processing, abort the transaction and are propagated out of
|
|
339
|
+
# with_transaction. Exceptions derived from Mongo::Error may be
|
|
340
|
+
# handled by with_transaction, resulting in retries of the process.
|
|
341
|
+
#
|
|
342
|
+
# Currently, with_transaction will retry commits and block invocations
|
|
343
|
+
# until at least 120 seconds have passed since with_transaction started
|
|
344
|
+
# executing. This timeout is not configurable and may change in a future
|
|
345
|
+
# driver version.
|
|
346
|
+
#
|
|
347
|
+
# @note with_transaction contains a loop, therefore the if with_transaction
|
|
348
|
+
# itself is placed in a loop, its block should not call next or break to
|
|
349
|
+
# control the outer loop because this will instead affect the loop in
|
|
350
|
+
# with_transaction. The driver will warn and abort the transaction
|
|
351
|
+
# if it detects this situation.
|
|
352
|
+
#
|
|
353
|
+
# @example Execute a statement in a transaction
|
|
354
|
+
# session.with_transaction(write_concern: {w: :majority}) do
|
|
355
|
+
# collection.update_one({ id: 3 }, { '$set' => { status: 'Inactive'} },
|
|
356
|
+
# session: session)
|
|
357
|
+
#
|
|
358
|
+
# end
|
|
359
|
+
#
|
|
360
|
+
# @example Execute a statement in a transaction, limiting total time consumed
|
|
361
|
+
# Timeout.timeout(5) do
|
|
362
|
+
# session.with_transaction(write_concern: {w: :majority}) do
|
|
363
|
+
# collection.update_one({ id: 3 }, { '$set' => { status: 'Inactive'} },
|
|
364
|
+
# session: session)
|
|
365
|
+
#
|
|
366
|
+
# end
|
|
367
|
+
# end
|
|
368
|
+
#
|
|
369
|
+
# @param [ Hash ] options The options for the transaction being started.
|
|
370
|
+
# These are the same options that start_transaction accepts.
|
|
371
|
+
#
|
|
372
|
+
# @raise [ Error::InvalidTransactionOperation ] If a transaction is already in
|
|
373
|
+
# progress or if the write concern is unacknowledged.
|
|
374
|
+
#
|
|
375
|
+
# @since 2.7.0
|
|
376
|
+
def with_transaction(options=nil)
|
|
377
|
+
# Non-configurable 120 second timeout for the entire operation
|
|
378
|
+
deadline = Utils.monotonic_time + 120
|
|
379
|
+
transaction_in_progress = false
|
|
380
|
+
loop do
|
|
381
|
+
commit_options = {}
|
|
382
|
+
if options
|
|
383
|
+
commit_options[:write_concern] = options[:write_concern]
|
|
384
|
+
end
|
|
385
|
+
start_transaction(options)
|
|
386
|
+
transaction_in_progress = true
|
|
387
|
+
begin
|
|
388
|
+
rv = yield self
|
|
389
|
+
rescue Exception => e
|
|
390
|
+
if within_states?(STARTING_TRANSACTION_STATE, TRANSACTION_IN_PROGRESS_STATE)
|
|
391
|
+
log_warn("Aborting transaction due to #{e.class}: #{e}")
|
|
392
|
+
abort_transaction
|
|
393
|
+
transaction_in_progress = false
|
|
394
|
+
end
|
|
395
|
+
|
|
396
|
+
if Utils.monotonic_time >= deadline
|
|
397
|
+
transaction_in_progress = false
|
|
398
|
+
raise
|
|
399
|
+
end
|
|
400
|
+
|
|
401
|
+
if e.is_a?(Mongo::Error) && e.label?('TransientTransactionError')
|
|
402
|
+
next
|
|
403
|
+
end
|
|
404
|
+
|
|
405
|
+
raise
|
|
406
|
+
else
|
|
407
|
+
if within_states?(TRANSACTION_ABORTED_STATE, NO_TRANSACTION_STATE, TRANSACTION_COMMITTED_STATE)
|
|
408
|
+
transaction_in_progress = false
|
|
409
|
+
return rv
|
|
410
|
+
end
|
|
411
|
+
|
|
412
|
+
begin
|
|
413
|
+
commit_transaction(commit_options)
|
|
414
|
+
transaction_in_progress = false
|
|
415
|
+
return rv
|
|
416
|
+
rescue Mongo::Error => e
|
|
417
|
+
if e.label?('UnknownTransactionCommitResult')
|
|
418
|
+
if Utils.monotonic_time >= deadline ||
|
|
419
|
+
e.is_a?(Error::OperationFailure) && e.max_time_ms_expired?
|
|
420
|
+
then
|
|
421
|
+
transaction_in_progress = false
|
|
422
|
+
raise
|
|
423
|
+
end
|
|
424
|
+
wc_options = case v = commit_options[:write_concern]
|
|
425
|
+
when WriteConcern::Base
|
|
426
|
+
v.options
|
|
427
|
+
when nil
|
|
428
|
+
{}
|
|
429
|
+
else
|
|
430
|
+
v
|
|
431
|
+
end
|
|
432
|
+
commit_options[:write_concern] = wc_options.merge(w: :majority)
|
|
433
|
+
retry
|
|
434
|
+
elsif e.label?('TransientTransactionError')
|
|
435
|
+
if Utils.monotonic_time >= deadline
|
|
436
|
+
transaction_in_progress = false
|
|
437
|
+
raise
|
|
438
|
+
end
|
|
439
|
+
@state = NO_TRANSACTION_STATE
|
|
440
|
+
next
|
|
441
|
+
else
|
|
442
|
+
transaction_in_progress = false
|
|
443
|
+
raise
|
|
444
|
+
end
|
|
445
|
+
rescue Error::AuthError
|
|
446
|
+
transaction_in_progress = false
|
|
447
|
+
raise
|
|
448
|
+
end
|
|
449
|
+
end
|
|
450
|
+
end
|
|
451
|
+
|
|
452
|
+
# No official return value, but return true so that in interactive
|
|
453
|
+
# use the method hints that it succeeded.
|
|
454
|
+
true
|
|
455
|
+
ensure
|
|
456
|
+
if transaction_in_progress
|
|
457
|
+
log_warn('with_transaction callback broke out of with_transaction loop, aborting transaction')
|
|
458
|
+
begin
|
|
459
|
+
abort_transaction
|
|
460
|
+
rescue Error::OperationFailure, Error::InvalidTransactionOperation
|
|
461
|
+
end
|
|
462
|
+
end
|
|
463
|
+
end
|
|
464
|
+
|
|
465
|
+
# Places subsequent operations in this session into a new transaction.
|
|
466
|
+
#
|
|
467
|
+
# Note that the transaction will not be started on the server until an
|
|
468
|
+
# operation is performed after start_transaction is called.
|
|
469
|
+
#
|
|
470
|
+
# @example Start a new transaction
|
|
471
|
+
# session.start_transaction(options)
|
|
472
|
+
#
|
|
473
|
+
# @param [ Hash ] options The options for the transaction being started.
|
|
474
|
+
#
|
|
475
|
+
# @option options [ Integer ] :max_commit_time_ms The maximum amount of
|
|
476
|
+
# time to allow a single commitTransaction command to run, in milliseconds.
|
|
477
|
+
# @option options [ Hash ] read_concern The read concern options hash,
|
|
478
|
+
# with the following optional keys:
|
|
479
|
+
# - *:level* -- the read preference level as a symbol; valid values
|
|
480
|
+
# are *:local*, *:majority*, and *:snapshot*
|
|
481
|
+
# @option options [ Hash ] :write_concern The write concern options. Can be :w =>
|
|
482
|
+
# Integer|String, :fsync => Boolean, :j => Boolean.
|
|
483
|
+
# @option options [ Hash ] :read The read preference options. The hash may have the following
|
|
484
|
+
# items:
|
|
485
|
+
# - *:mode* -- read preference specified as a symbol; the only valid value is
|
|
486
|
+
# *:primary*.
|
|
487
|
+
#
|
|
488
|
+
# @raise [ Error::InvalidTransactionOperation ] If a transaction is already in
|
|
489
|
+
# progress or if the write concern is unacknowledged.
|
|
490
|
+
#
|
|
491
|
+
# @since 2.6.0
|
|
492
|
+
def start_transaction(options = nil)
|
|
493
|
+
if options
|
|
494
|
+
Lint.validate_read_concern_option(options[:read_concern])
|
|
495
|
+
|
|
496
|
+
=begin
|
|
497
|
+
# It would be handy to detect invalid read preferences here, but
|
|
498
|
+
# some of the spec tests require later detection of invalid read prefs.
|
|
499
|
+
# Maybe we can do this when lint mode is on.
|
|
500
|
+
mode = options[:read] && options[:read][:mode].to_s
|
|
501
|
+
if mode && mode != 'primary'
|
|
502
|
+
raise Mongo::Error::InvalidTransactionOperation.new(
|
|
503
|
+
"read preference in a transaction must be primary (requested: #{mode})"
|
|
504
|
+
)
|
|
505
|
+
end
|
|
506
|
+
=end
|
|
507
|
+
end
|
|
508
|
+
|
|
509
|
+
check_if_ended!
|
|
510
|
+
|
|
511
|
+
if within_states?(STARTING_TRANSACTION_STATE, TRANSACTION_IN_PROGRESS_STATE)
|
|
512
|
+
raise Mongo::Error::InvalidTransactionOperation.new(
|
|
513
|
+
Mongo::Error::InvalidTransactionOperation::TRANSACTION_ALREADY_IN_PROGRESS)
|
|
514
|
+
end
|
|
515
|
+
|
|
516
|
+
unpin
|
|
517
|
+
|
|
518
|
+
next_txn_num
|
|
519
|
+
@txn_options = (@options[:default_transaction_options] || {}).merge(options || {})
|
|
520
|
+
|
|
521
|
+
if txn_write_concern && !WriteConcern.get(txn_write_concern).acknowledged?
|
|
522
|
+
raise Mongo::Error::InvalidTransactionOperation.new(
|
|
523
|
+
Mongo::Error::InvalidTransactionOperation::UNACKNOWLEDGED_WRITE_CONCERN)
|
|
524
|
+
end
|
|
525
|
+
|
|
526
|
+
@state = STARTING_TRANSACTION_STATE
|
|
527
|
+
@already_committed = false
|
|
528
|
+
|
|
529
|
+
# This method has no explicit return value.
|
|
530
|
+
# We could return nil here but true indicates to the user that the
|
|
531
|
+
# operation succeeded. This is intended for interactive use.
|
|
532
|
+
# Note that the return value is not documented.
|
|
533
|
+
true
|
|
534
|
+
end
|
|
535
|
+
|
|
536
|
+
# Commit the currently active transaction on the session.
|
|
537
|
+
#
|
|
538
|
+
# @example Commits the transaction.
|
|
539
|
+
# session.commit_transaction
|
|
540
|
+
#
|
|
541
|
+
# @option options :write_concern [ nil | WriteConcern::Base ] The write
|
|
542
|
+
# concern to use for this operation.
|
|
543
|
+
#
|
|
544
|
+
# @raise [ Error::InvalidTransactionOperation ] If there is no active transaction.
|
|
545
|
+
#
|
|
546
|
+
# @since 2.6.0
|
|
547
|
+
def commit_transaction(options=nil)
|
|
548
|
+
QueryCache.clear
|
|
549
|
+
check_if_ended!
|
|
550
|
+
check_if_no_transaction!
|
|
551
|
+
|
|
552
|
+
if within_states?(TRANSACTION_ABORTED_STATE)
|
|
553
|
+
raise Mongo::Error::InvalidTransactionOperation.new(
|
|
554
|
+
Mongo::Error::InvalidTransactionOperation.cannot_call_after_msg(
|
|
555
|
+
:abortTransaction, :commitTransaction))
|
|
556
|
+
end
|
|
557
|
+
|
|
558
|
+
options ||= {}
|
|
559
|
+
|
|
560
|
+
begin
|
|
561
|
+
# If commitTransaction is called twice, we need to run the same commit
|
|
562
|
+
# operation again, so we revert the session to the previous state.
|
|
563
|
+
if within_states?(TRANSACTION_COMMITTED_STATE)
|
|
564
|
+
@state = @last_commit_skipped ? STARTING_TRANSACTION_STATE : TRANSACTION_IN_PROGRESS_STATE
|
|
565
|
+
@already_committed = true
|
|
566
|
+
end
|
|
567
|
+
|
|
568
|
+
if starting_transaction?
|
|
569
|
+
@last_commit_skipped = true
|
|
570
|
+
else
|
|
571
|
+
@last_commit_skipped = false
|
|
572
|
+
@committing_transaction = true
|
|
573
|
+
|
|
574
|
+
write_concern = options[:write_concern] || txn_options[:write_concern]
|
|
575
|
+
if write_concern && !write_concern.is_a?(WriteConcern::Base)
|
|
576
|
+
write_concern = WriteConcern.get(write_concern)
|
|
577
|
+
end
|
|
578
|
+
write_with_retry(self, write_concern, true) do |server, txn_num, is_retry|
|
|
579
|
+
if is_retry
|
|
580
|
+
if write_concern
|
|
581
|
+
wco = write_concern.options.merge(w: :majority)
|
|
582
|
+
wco[:wtimeout] ||= 10000
|
|
583
|
+
write_concern = WriteConcern.get(wco)
|
|
584
|
+
else
|
|
585
|
+
write_concern = WriteConcern.get(w: :majority, wtimeout: 10000)
|
|
586
|
+
end
|
|
587
|
+
end
|
|
588
|
+
spec = {
|
|
589
|
+
selector: { commitTransaction: 1 },
|
|
590
|
+
db_name: 'admin',
|
|
591
|
+
session: self,
|
|
592
|
+
txn_num: txn_num,
|
|
593
|
+
write_concern: write_concern,
|
|
594
|
+
}
|
|
595
|
+
Operation::Command.new(spec).execute(server, context: Operation::Context.new(client: @client, session: self))
|
|
596
|
+
end
|
|
597
|
+
end
|
|
598
|
+
ensure
|
|
599
|
+
@state = TRANSACTION_COMMITTED_STATE
|
|
600
|
+
@committing_transaction = false
|
|
601
|
+
end
|
|
602
|
+
|
|
603
|
+
# No official return value, but return true so that in interactive
|
|
604
|
+
# use the method hints that it succeeded.
|
|
605
|
+
true
|
|
606
|
+
end
|
|
607
|
+
|
|
608
|
+
# Abort the currently active transaction without making any changes to the database.
|
|
609
|
+
#
|
|
610
|
+
# @example Abort the transaction.
|
|
611
|
+
# session.abort_transaction
|
|
612
|
+
#
|
|
613
|
+
# @raise [ Error::InvalidTransactionOperation ] If there is no active transaction.
|
|
614
|
+
#
|
|
615
|
+
# @since 2.6.0
|
|
616
|
+
def abort_transaction
|
|
617
|
+
QueryCache.clear
|
|
618
|
+
|
|
619
|
+
check_if_ended!
|
|
620
|
+
check_if_no_transaction!
|
|
621
|
+
|
|
622
|
+
if within_states?(TRANSACTION_COMMITTED_STATE)
|
|
623
|
+
raise Mongo::Error::InvalidTransactionOperation.new(
|
|
624
|
+
Mongo::Error::InvalidTransactionOperation.cannot_call_after_msg(
|
|
625
|
+
:commitTransaction, :abortTransaction))
|
|
626
|
+
end
|
|
627
|
+
|
|
628
|
+
if within_states?(TRANSACTION_ABORTED_STATE)
|
|
629
|
+
raise Mongo::Error::InvalidTransactionOperation.new(
|
|
630
|
+
Mongo::Error::InvalidTransactionOperation.cannot_call_twice_msg(:abortTransaction))
|
|
631
|
+
end
|
|
632
|
+
|
|
633
|
+
begin
|
|
634
|
+
unless starting_transaction?
|
|
635
|
+
@aborting_transaction = true
|
|
636
|
+
write_with_retry(self, txn_options[:write_concern], true) do |server, txn_num|
|
|
637
|
+
begin
|
|
638
|
+
Operation::Command.new(
|
|
639
|
+
selector: { abortTransaction: 1 },
|
|
640
|
+
db_name: 'admin',
|
|
641
|
+
session: self,
|
|
642
|
+
txn_num: txn_num
|
|
643
|
+
).execute(server, context: Operation::Context.new(client: @client, session: self))
|
|
644
|
+
ensure
|
|
645
|
+
unpin
|
|
646
|
+
end
|
|
647
|
+
end
|
|
648
|
+
end
|
|
649
|
+
|
|
650
|
+
@state = TRANSACTION_ABORTED_STATE
|
|
651
|
+
rescue Mongo::Error::InvalidTransactionOperation
|
|
652
|
+
raise
|
|
653
|
+
rescue Mongo::Error
|
|
654
|
+
@state = TRANSACTION_ABORTED_STATE
|
|
655
|
+
rescue Exception
|
|
656
|
+
@state = TRANSACTION_ABORTED_STATE
|
|
657
|
+
raise
|
|
658
|
+
ensure
|
|
659
|
+
@aborting_transaction = false
|
|
660
|
+
end
|
|
661
|
+
|
|
662
|
+
# No official return value, but return true so that in interactive
|
|
663
|
+
# use the method hints that it succeeded.
|
|
664
|
+
true
|
|
665
|
+
end
|
|
666
|
+
|
|
667
|
+
# @api private
|
|
668
|
+
def starting_transaction?
|
|
669
|
+
within_states?(STARTING_TRANSACTION_STATE)
|
|
670
|
+
end
|
|
671
|
+
|
|
672
|
+
# Whether or not the session is currently in a transaction.
|
|
673
|
+
#
|
|
674
|
+
# @example Is the session in a transaction?
|
|
675
|
+
# session.in_transaction?
|
|
676
|
+
#
|
|
677
|
+
# @return [ true | false ] Whether or not the session in a transaction.
|
|
678
|
+
#
|
|
679
|
+
# @since 2.6.0
|
|
680
|
+
def in_transaction?
|
|
681
|
+
within_states?(STARTING_TRANSACTION_STATE, TRANSACTION_IN_PROGRESS_STATE)
|
|
682
|
+
end
|
|
683
|
+
|
|
684
|
+
# @return [ true | false ] Whether the session is currently committing a
|
|
685
|
+
# transaction.
|
|
686
|
+
#
|
|
687
|
+
# @api private
|
|
688
|
+
def committing_transaction?
|
|
689
|
+
!!@committing_transaction
|
|
690
|
+
end
|
|
691
|
+
|
|
692
|
+
# @return [ true | false ] Whether the session is currently aborting a
|
|
693
|
+
# transaction.
|
|
694
|
+
#
|
|
695
|
+
# @api private
|
|
696
|
+
def aborting_transaction?
|
|
697
|
+
!!@aborting_transaction
|
|
698
|
+
end
|
|
699
|
+
|
|
700
|
+
# Pins this session to the specified server, which should be a mongos.
|
|
701
|
+
#
|
|
702
|
+
# @param [ Server ] server The server to pin this session to.
|
|
703
|
+
#
|
|
704
|
+
# @api private
|
|
705
|
+
def pin_to_server(server)
|
|
706
|
+
if server.nil?
|
|
707
|
+
raise ArgumentError, 'Cannot pin to a nil server'
|
|
708
|
+
end
|
|
709
|
+
if Lint.enabled?
|
|
710
|
+
unless server.mongos?
|
|
711
|
+
raise Error::LintError, "Attempted to pin the session to server #{server.summary} which is not a mongos"
|
|
712
|
+
end
|
|
713
|
+
end
|
|
714
|
+
@pinned_server = server
|
|
715
|
+
end
|
|
716
|
+
|
|
717
|
+
# Pins this session to the specified service.
|
|
718
|
+
#
|
|
719
|
+
# @param [ Object ] service_id The service id to pin this session to.
|
|
720
|
+
#
|
|
721
|
+
# @api private
|
|
722
|
+
def pin_to_service(service_id)
|
|
723
|
+
if service_id.nil?
|
|
724
|
+
raise ArgumentError, 'Cannot pin to a nil service id'
|
|
725
|
+
end
|
|
726
|
+
@pinned_service_id = service_id
|
|
163
727
|
end
|
|
164
728
|
|
|
165
|
-
#
|
|
729
|
+
# Unpins this session from the pinned server, if the session was pinned.
|
|
166
730
|
#
|
|
167
|
-
# @
|
|
168
|
-
|
|
731
|
+
# @api private
|
|
732
|
+
def unpin
|
|
733
|
+
@pinned_server = nil
|
|
734
|
+
@pinned_service_id = nil
|
|
735
|
+
end
|
|
736
|
+
|
|
737
|
+
# Unpins this session from the pinned server, if the session was pinned
|
|
738
|
+
# and the specified exception instance and the session's transaction state
|
|
739
|
+
# require it to be unpinned.
|
|
169
740
|
#
|
|
170
|
-
#
|
|
741
|
+
# The exception instance should already have all of the labels set on it
|
|
742
|
+
# (both client- and server-side generated ones).
|
|
171
743
|
#
|
|
172
|
-
# @
|
|
173
|
-
|
|
174
|
-
|
|
744
|
+
# @param [ Error ] error The exception instance to process.
|
|
745
|
+
#
|
|
746
|
+
# @api private
|
|
747
|
+
def unpin_maybe(error)
|
|
748
|
+
if !within_states?(Session::NO_TRANSACTION_STATE) &&
|
|
749
|
+
error.label?('TransientTransactionError')
|
|
750
|
+
then
|
|
751
|
+
unpin
|
|
752
|
+
end
|
|
753
|
+
|
|
754
|
+
if committing_transaction? &&
|
|
755
|
+
error.label?('UnknownTransactionCommitResult')
|
|
756
|
+
then
|
|
757
|
+
unpin
|
|
758
|
+
end
|
|
175
759
|
end
|
|
176
760
|
|
|
177
761
|
# Add the autocommit field to a command document if applicable.
|
|
@@ -182,24 +766,13 @@ module Mongo
|
|
|
182
766
|
# @return [ Hash, BSON::Document ] The command document.
|
|
183
767
|
#
|
|
184
768
|
# @since 2.6.0
|
|
769
|
+
# @api private
|
|
185
770
|
def add_autocommit!(command)
|
|
186
771
|
command.tap do |c|
|
|
187
772
|
c[:autocommit] = false if in_transaction?
|
|
188
773
|
end
|
|
189
774
|
end
|
|
190
775
|
|
|
191
|
-
# Add this session's id to a command document.
|
|
192
|
-
#
|
|
193
|
-
# @example
|
|
194
|
-
# session.add_id!(cmd)
|
|
195
|
-
#
|
|
196
|
-
# @return [ Hash, BSON::Document ] The command document.
|
|
197
|
-
#
|
|
198
|
-
# @since 2.5.0
|
|
199
|
-
def add_id!(command)
|
|
200
|
-
command.merge!(lsid: session_id)
|
|
201
|
-
end
|
|
202
|
-
|
|
203
776
|
# Add the startTransaction field to a command document if applicable.
|
|
204
777
|
#
|
|
205
778
|
# @example
|
|
@@ -208,9 +781,12 @@ module Mongo
|
|
|
208
781
|
# @return [ Hash, BSON::Document ] The command document.
|
|
209
782
|
#
|
|
210
783
|
# @since 2.6.0
|
|
784
|
+
# @api private
|
|
211
785
|
def add_start_transaction!(command)
|
|
212
786
|
command.tap do |c|
|
|
213
|
-
|
|
787
|
+
if starting_transaction?
|
|
788
|
+
c[:startTransaction] = true
|
|
789
|
+
end
|
|
214
790
|
end
|
|
215
791
|
end
|
|
216
792
|
|
|
@@ -222,6 +798,7 @@ module Mongo
|
|
|
222
798
|
# @return [ Hash, BSON::Document ] The command document.
|
|
223
799
|
#
|
|
224
800
|
# @since 2.6.0
|
|
801
|
+
# @api private
|
|
225
802
|
def add_txn_num!(command)
|
|
226
803
|
command.tap do |c|
|
|
227
804
|
c[:txnNumber] = BSON::Int64.new(@server_session.txn_num) if in_transaction?
|
|
@@ -236,31 +813,55 @@ module Mongo
|
|
|
236
813
|
# @return [ Hash, BSON::Document ] The command document.
|
|
237
814
|
#
|
|
238
815
|
# @since 2.6.0
|
|
816
|
+
# @api private
|
|
239
817
|
def add_txn_opts!(command, read)
|
|
240
818
|
command.tap do |c|
|
|
241
|
-
# The read preference should be added for all read operations.
|
|
242
|
-
if read && txn_read_pref = txn_read_preference
|
|
243
|
-
Mongo::Lint.validate_underscore_read_preference(txn_read_pref)
|
|
244
|
-
txn_read_pref = txn_read_pref.dup
|
|
245
|
-
txn_read_pref[:mode] = txn_read_pref[:mode].to_s.gsub(/(_\w)/) { |match| match[1].upcase }
|
|
246
|
-
Mongo::Lint.validate_camel_case_read_preference(txn_read_pref)
|
|
247
|
-
c['$readPreference'] = txn_read_pref
|
|
248
|
-
end
|
|
249
|
-
|
|
250
819
|
# The read concern should be added to any command that starts a transaction.
|
|
251
|
-
if starting_transaction?
|
|
252
|
-
|
|
253
|
-
|
|
820
|
+
if starting_transaction?
|
|
821
|
+
# https://jira.mongodb.org/browse/SPEC-1161: transaction's
|
|
822
|
+
# read concern overrides collection/database/client read concerns,
|
|
823
|
+
# even if transaction's read concern is not set.
|
|
824
|
+
# Read concern here is the one sent to the server and may
|
|
825
|
+
# include afterClusterTime.
|
|
826
|
+
if rc = c[:readConcern]
|
|
827
|
+
rc = rc.dup
|
|
828
|
+
rc.delete(:level)
|
|
829
|
+
end
|
|
830
|
+
if txn_read_concern
|
|
831
|
+
if rc
|
|
832
|
+
rc.update(txn_read_concern)
|
|
833
|
+
else
|
|
834
|
+
rc = txn_read_concern.dup
|
|
835
|
+
end
|
|
836
|
+
end
|
|
837
|
+
if rc.nil? || rc.empty?
|
|
838
|
+
c.delete(:readConcern)
|
|
839
|
+
else
|
|
840
|
+
c[:readConcern ] = Options::Mapper.transform_values_to_strings(rc)
|
|
841
|
+
end
|
|
254
842
|
end
|
|
255
843
|
|
|
256
844
|
# We need to send the read concern level as a string rather than a symbol.
|
|
257
|
-
if c[:readConcern]
|
|
258
|
-
c[:readConcern]
|
|
845
|
+
if c[:readConcern]
|
|
846
|
+
c[:readConcern] = Options::Mapper.transform_values_to_strings(c[:readConcern])
|
|
847
|
+
end
|
|
848
|
+
|
|
849
|
+
if c[:commitTransaction]
|
|
850
|
+
if max_time_ms = txn_options[:max_commit_time_ms]
|
|
851
|
+
c[:maxTimeMS] = max_time_ms
|
|
852
|
+
end
|
|
259
853
|
end
|
|
260
854
|
|
|
261
855
|
# The write concern should be added to any abortTransaction or commitTransaction command.
|
|
262
|
-
if (c[:abortTransaction] || c[:commitTransaction])
|
|
263
|
-
|
|
856
|
+
if (c[:abortTransaction] || c[:commitTransaction])
|
|
857
|
+
if @already_committed
|
|
858
|
+
wc = BSON::Document.new(c[:writeConcern] || txn_write_concern || {})
|
|
859
|
+
wc.merge!(w: :majority)
|
|
860
|
+
wc[:wtimeout] ||= 10000
|
|
861
|
+
c[:writeConcern] = wc
|
|
862
|
+
elsif txn_write_concern
|
|
863
|
+
c[:writeConcern] ||= txn_write_concern
|
|
864
|
+
end
|
|
264
865
|
end
|
|
265
866
|
|
|
266
867
|
# A non-numeric write concern w value needs to be sent as a string rather than a symbol.
|
|
@@ -278,6 +879,7 @@ module Mongo
|
|
|
278
879
|
# @return [ Hash, BSON::Document ] The command document.
|
|
279
880
|
#
|
|
280
881
|
# @since 2.6.0
|
|
882
|
+
# @api private
|
|
281
883
|
def suppress_read_write_concern!(command)
|
|
282
884
|
command.tap do |c|
|
|
283
885
|
next unless in_transaction?
|
|
@@ -293,19 +895,27 @@ module Mongo
|
|
|
293
895
|
# session.validate_read_preference!(command)
|
|
294
896
|
#
|
|
295
897
|
# @raise [ Mongo::Error::InvalidTransactionOperation ] If the read preference of the command is
|
|
296
|
-
#
|
|
898
|
+
# not primary.
|
|
297
899
|
#
|
|
298
900
|
# @since 2.6.0
|
|
901
|
+
# @api private
|
|
299
902
|
def validate_read_preference!(command)
|
|
300
|
-
return unless in_transaction?
|
|
903
|
+
return unless in_transaction?
|
|
904
|
+
return unless command['$readPreference']
|
|
301
905
|
|
|
302
|
-
|
|
303
|
-
|
|
906
|
+
mode = command['$readPreference']['mode'] || command['$readPreference'][:mode]
|
|
907
|
+
|
|
908
|
+
if mode && mode != 'primary'
|
|
909
|
+
raise Mongo::Error::InvalidTransactionOperation.new(
|
|
910
|
+
"read preference in a transaction must be primary (requested: #{mode})"
|
|
911
|
+
)
|
|
912
|
+
end
|
|
304
913
|
end
|
|
305
914
|
|
|
306
915
|
# Update the state of the session due to a (non-commit and non-abort) operation being run.
|
|
307
916
|
#
|
|
308
917
|
# @since 2.6.0
|
|
918
|
+
# @api private
|
|
309
919
|
def update_state!
|
|
310
920
|
case @state
|
|
311
921
|
when STARTING_TRANSACTION_STATE
|
|
@@ -315,20 +925,21 @@ module Mongo
|
|
|
315
925
|
end
|
|
316
926
|
end
|
|
317
927
|
|
|
318
|
-
# Validate the session.
|
|
928
|
+
# Validate the session for use by the specified client.
|
|
319
929
|
#
|
|
320
|
-
#
|
|
321
|
-
#
|
|
930
|
+
# The session must not be ended and must have been created by a client
|
|
931
|
+
# with the same cluster as the client that the session is to be used with.
|
|
322
932
|
#
|
|
323
|
-
# @param [
|
|
933
|
+
# @param [ Client ] client The client the session is to be used with.
|
|
324
934
|
#
|
|
325
|
-
# @return [
|
|
935
|
+
# @return [ Session ] self, if the session is valid.
|
|
326
936
|
#
|
|
327
|
-
# @raise [ Mongo::Error::InvalidSession ]
|
|
937
|
+
# @raise [ Mongo::Error::InvalidSession ] Exception raised if the session is not valid.
|
|
328
938
|
#
|
|
329
939
|
# @since 2.5.0
|
|
330
|
-
|
|
331
|
-
|
|
940
|
+
# @api private
|
|
941
|
+
def validate!(client)
|
|
942
|
+
check_matching_cluster!(client)
|
|
332
943
|
check_if_ended!
|
|
333
944
|
self
|
|
334
945
|
end
|
|
@@ -343,31 +954,23 @@ module Mongo
|
|
|
343
954
|
# @return [ Operation::Result ] The result.
|
|
344
955
|
#
|
|
345
956
|
# @since 2.5.0
|
|
957
|
+
# @api private
|
|
346
958
|
def process(result)
|
|
347
959
|
unless implicit?
|
|
348
960
|
set_operation_time(result)
|
|
349
|
-
|
|
961
|
+
if cluster_time_doc = result.cluster_time
|
|
962
|
+
advance_cluster_time(cluster_time_doc)
|
|
963
|
+
end
|
|
350
964
|
end
|
|
351
965
|
@server_session.set_last_use!
|
|
352
|
-
result
|
|
353
|
-
end
|
|
354
966
|
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
#
|
|
360
|
-
# @param [ BSON::Document, Hash ] new_cluster_time The new cluster time.
|
|
361
|
-
#
|
|
362
|
-
# @return [ BSON::Document, Hash ] The new cluster time.
|
|
363
|
-
#
|
|
364
|
-
# @since 2.5.0
|
|
365
|
-
def advance_cluster_time(new_cluster_time)
|
|
366
|
-
if @cluster_time
|
|
367
|
-
@cluster_time = [ @cluster_time, new_cluster_time ].max_by { |doc| doc[Cluster::CLUSTER_TIME] }
|
|
368
|
-
else
|
|
369
|
-
@cluster_time = new_cluster_time
|
|
967
|
+
if doc = result.reply && result.reply.documents.first
|
|
968
|
+
if doc[:recoveryToken]
|
|
969
|
+
self.recovery_token = doc[:recoveryToken]
|
|
970
|
+
end
|
|
370
971
|
end
|
|
972
|
+
|
|
973
|
+
result
|
|
371
974
|
end
|
|
372
975
|
|
|
373
976
|
# Advance the cached operation time for this session.
|
|
@@ -388,33 +991,6 @@ module Mongo
|
|
|
388
991
|
end
|
|
389
992
|
end
|
|
390
993
|
|
|
391
|
-
# Will writes executed with this session be retried.
|
|
392
|
-
#
|
|
393
|
-
# @example Will writes be retried.
|
|
394
|
-
# session.retry_writes?
|
|
395
|
-
#
|
|
396
|
-
# @return [ true, false ] If writes will be retried.
|
|
397
|
-
#
|
|
398
|
-
# @note Retryable writes are only available on server versions at least 3.6
|
|
399
|
-
# and with sharded clusters or replica sets.
|
|
400
|
-
#
|
|
401
|
-
# @since 2.5.0
|
|
402
|
-
def retry_writes?
|
|
403
|
-
!!cluster.options[:retry_writes] && (cluster.replica_set? || cluster.sharded?)
|
|
404
|
-
end
|
|
405
|
-
|
|
406
|
-
# Get the session id.
|
|
407
|
-
#
|
|
408
|
-
# @example Get the session id.
|
|
409
|
-
# session.session_id
|
|
410
|
-
#
|
|
411
|
-
# @return [ BSON::Document ] The session id.
|
|
412
|
-
#
|
|
413
|
-
# @since 2.5.0
|
|
414
|
-
def session_id
|
|
415
|
-
@server_session.session_id if @server_session
|
|
416
|
-
end
|
|
417
|
-
|
|
418
994
|
# Increment and return the next transaction number.
|
|
419
995
|
#
|
|
420
996
|
# @example Get the next transaction number.
|
|
@@ -423,8 +999,13 @@ module Mongo
|
|
|
423
999
|
# @return [ Integer ] The next transaction number.
|
|
424
1000
|
#
|
|
425
1001
|
# @since 2.5.0
|
|
1002
|
+
# @api private
|
|
426
1003
|
def next_txn_num
|
|
427
|
-
|
|
1004
|
+
if ended?
|
|
1005
|
+
raise Error::SessionEnded
|
|
1006
|
+
end
|
|
1007
|
+
|
|
1008
|
+
@server_session.next_txn_num
|
|
428
1009
|
end
|
|
429
1010
|
|
|
430
1011
|
# Get the current transaction number.
|
|
@@ -436,224 +1017,34 @@ module Mongo
|
|
|
436
1017
|
#
|
|
437
1018
|
# @since 2.6.0
|
|
438
1019
|
def txn_num
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
# Is this session an implicit one (not user-created).
|
|
443
|
-
#
|
|
444
|
-
# @example Is the session implicit?
|
|
445
|
-
# session.implicit?
|
|
446
|
-
#
|
|
447
|
-
# @return [ true, false ] Whether this session is implicit.
|
|
448
|
-
#
|
|
449
|
-
# @since 2.5.1
|
|
450
|
-
def implicit?
|
|
451
|
-
@implicit ||= !!(@options.key?(:implicit) && @options[:implicit] == true)
|
|
452
|
-
end
|
|
453
|
-
|
|
454
|
-
# Is this session an explicit one (i.e. user-created).
|
|
455
|
-
#
|
|
456
|
-
# @example Is the session explicit?
|
|
457
|
-
# session.explicit?
|
|
458
|
-
#
|
|
459
|
-
# @return [ true, false ] Whether this session is explicit.
|
|
460
|
-
#
|
|
461
|
-
# @since 2.5.2
|
|
462
|
-
def explicit?
|
|
463
|
-
@explicit ||= !implicit?
|
|
464
|
-
end
|
|
465
|
-
|
|
466
|
-
# Start a new transaction.
|
|
467
|
-
#
|
|
468
|
-
# Note that the transaction will not be started on the server until an
|
|
469
|
-
# operation is performed after start_transaction is called.
|
|
470
|
-
#
|
|
471
|
-
# @example Start a new transaction
|
|
472
|
-
# session.start_transaction(options)
|
|
473
|
-
#
|
|
474
|
-
# @param [ Hash ] options The options for the transaction being started.
|
|
475
|
-
#
|
|
476
|
-
# @option options [ Hash ] read_concern The read concern options hash, with the following
|
|
477
|
-
# optional keys:
|
|
478
|
-
# - *:level* -- the read preference level as a symbol; valid values are *:local*, *:majority*,
|
|
479
|
-
# and *:snapshot*
|
|
480
|
-
# - *:after_cluster_time* -- the cluster time BSON::Document or hash specifying which cluster
|
|
481
|
-
# time reads should occur after
|
|
482
|
-
# @option options [ Hash ] :write_concern The write concern options. Can be :w =>
|
|
483
|
-
# Integer|String, :fsync => Boolean, :j => Boolean.
|
|
484
|
-
# @option options [ Hash ] :read The read preference options. The hash may have the following
|
|
485
|
-
# items:
|
|
486
|
-
# - *:mode* -- read preference specified as a symbol; the only valid value is
|
|
487
|
-
# *:primary*.
|
|
488
|
-
#
|
|
489
|
-
# @raise [ InvalidTransactionOperation ] If a transaction is already in
|
|
490
|
-
# progress or if the write concern is unacknowledged.
|
|
491
|
-
#
|
|
492
|
-
# @since 2.6.0
|
|
493
|
-
def start_transaction(options = nil)
|
|
494
|
-
check_if_ended!
|
|
495
|
-
|
|
496
|
-
if within_states?(STARTING_TRANSACTION_STATE, TRANSACTION_IN_PROGRESS_STATE)
|
|
497
|
-
raise Mongo::Error::InvalidTransactionOperation.new(
|
|
498
|
-
Mongo::Error::InvalidTransactionOperation::TRANSACTION_ALREADY_IN_PROGRESS)
|
|
1020
|
+
if ended?
|
|
1021
|
+
raise Error::SessionEnded
|
|
499
1022
|
end
|
|
500
1023
|
|
|
501
|
-
|
|
502
|
-
@txn_options = options || @options[:default_transaction_options] || {}
|
|
503
|
-
|
|
504
|
-
if txn_write_concern && WriteConcern.send(:unacknowledged?, txn_write_concern)
|
|
505
|
-
raise Mongo::Error::InvalidTransactionOperation.new(
|
|
506
|
-
Mongo::Error::InvalidTransactionOperation::UNACKNOWLEDGED_WRITE_CONCERN)
|
|
507
|
-
end
|
|
508
|
-
|
|
509
|
-
@state = STARTING_TRANSACTION_STATE
|
|
510
|
-
end
|
|
511
|
-
|
|
512
|
-
# Commit the currently active transaction on the session.
|
|
513
|
-
#
|
|
514
|
-
# @example Commits the transaction.
|
|
515
|
-
# session.commit_transaction
|
|
516
|
-
#
|
|
517
|
-
# @raise [ InvalidTransactionOperation ] If a transaction was just aborted and no new one was
|
|
518
|
-
# started.
|
|
519
|
-
#
|
|
520
|
-
# @since 2.6.0
|
|
521
|
-
def commit_transaction
|
|
522
|
-
check_if_ended!
|
|
523
|
-
check_if_no_transaction!
|
|
524
|
-
|
|
525
|
-
if within_states?(TRANSACTION_ABORTED_STATE)
|
|
526
|
-
raise Mongo::Error::InvalidTransactionOperation.new(
|
|
527
|
-
Mongo::Error::InvalidTransactionOperation.cannot_call_after_msg(
|
|
528
|
-
:abortTransaction, :commitTransaction))
|
|
529
|
-
end
|
|
530
|
-
|
|
531
|
-
begin
|
|
532
|
-
# If commitTransaction is called twice, we need to run the same commit operation again, so
|
|
533
|
-
# we revert the session to the previous state.
|
|
534
|
-
if within_states?(TRANSACTION_COMMITTED_STATE)
|
|
535
|
-
@state = @last_commit_skipped ? STARTING_TRANSACTION_STATE : TRANSACTION_IN_PROGRESS_STATE
|
|
536
|
-
end
|
|
537
|
-
|
|
538
|
-
if starting_transaction?
|
|
539
|
-
@last_commit_skipped = true
|
|
540
|
-
else
|
|
541
|
-
@last_commit_skipped = false
|
|
542
|
-
|
|
543
|
-
write_with_retry(self, txn_options[:write_concern], true) do |server, txn_num|
|
|
544
|
-
Operation::Command.new(
|
|
545
|
-
selector: { commitTransaction: 1 },
|
|
546
|
-
db_name: 'admin',
|
|
547
|
-
session: self,
|
|
548
|
-
txn_num: txn_num
|
|
549
|
-
).execute(server)
|
|
550
|
-
end
|
|
551
|
-
end
|
|
552
|
-
rescue Mongo::Error::NoServerAvailable, Mongo::Error::SocketError => e
|
|
553
|
-
e.send(:add_label, Mongo::Error::UNKNOWN_TRANSACTION_COMMIT_RESULT_LABEL)
|
|
554
|
-
raise e
|
|
555
|
-
rescue Mongo::Error::OperationFailure => e
|
|
556
|
-
err_doc = e.instance_variable_get(:@result).send(:first_document)
|
|
557
|
-
|
|
558
|
-
if e.write_retryable? || (err_doc['writeConcernError'] &&
|
|
559
|
-
!UNLABELED_WRITE_CONCERN_CODES.include?(err_doc['writeConcernError']['code']))
|
|
560
|
-
e.send(:add_label, Mongo::Error::UNKNOWN_TRANSACTION_COMMIT_RESULT_LABEL)
|
|
561
|
-
end
|
|
562
|
-
|
|
563
|
-
raise e
|
|
564
|
-
ensure
|
|
565
|
-
@state = TRANSACTION_COMMITTED_STATE
|
|
566
|
-
end
|
|
567
|
-
end
|
|
568
|
-
|
|
569
|
-
# Abort the currently active transaction without making any changes to the database.
|
|
570
|
-
#
|
|
571
|
-
# @example Abort the transaction.
|
|
572
|
-
# session.abort_transaction
|
|
573
|
-
#
|
|
574
|
-
# @raise [ Mongo::Error::InvalidTransactionOperation ] If a transaction was just committed or
|
|
575
|
-
# aborted and no new one was started.
|
|
576
|
-
#
|
|
577
|
-
# @since 2.6.0
|
|
578
|
-
def abort_transaction
|
|
579
|
-
check_if_ended!
|
|
580
|
-
check_if_no_transaction!
|
|
581
|
-
|
|
582
|
-
if within_states?(TRANSACTION_COMMITTED_STATE)
|
|
583
|
-
raise Mongo::Error::InvalidTransactionOperation.new(
|
|
584
|
-
Mongo::Error::InvalidTransactionOperation.cannot_call_after_msg(
|
|
585
|
-
:commitTransaction, :abortTransaction))
|
|
586
|
-
end
|
|
587
|
-
|
|
588
|
-
if within_states?(TRANSACTION_ABORTED_STATE)
|
|
589
|
-
raise Mongo::Error::InvalidTransactionOperation.new(
|
|
590
|
-
Mongo::Error::InvalidTransactionOperation.cannot_call_twice_msg(:abortTransaction))
|
|
591
|
-
end
|
|
592
|
-
|
|
593
|
-
begin
|
|
594
|
-
unless starting_transaction?
|
|
595
|
-
write_with_retry(self, txn_options[:write_concern], true) do |server, txn_num|
|
|
596
|
-
Operation::Command.new(
|
|
597
|
-
selector: { abortTransaction: 1 },
|
|
598
|
-
db_name: 'admin',
|
|
599
|
-
session: self,
|
|
600
|
-
txn_num: txn_num
|
|
601
|
-
).execute(server)
|
|
602
|
-
end
|
|
603
|
-
end
|
|
604
|
-
|
|
605
|
-
@state = TRANSACTION_ABORTED_STATE
|
|
606
|
-
rescue Mongo::Error::InvalidTransactionOperation
|
|
607
|
-
raise
|
|
608
|
-
rescue Mongo::Error
|
|
609
|
-
@state = TRANSACTION_ABORTED_STATE
|
|
610
|
-
end
|
|
1024
|
+
@server_session.txn_num
|
|
611
1025
|
end
|
|
612
1026
|
|
|
613
|
-
|
|
614
|
-
#
|
|
615
|
-
# @example Is the session in a transaction?
|
|
616
|
-
# session.in_transaction?
|
|
617
|
-
#
|
|
618
|
-
# @return [ true | false ] Whether or not the session in a transaction.
|
|
619
|
-
#
|
|
620
|
-
# @since 2.6.0
|
|
621
|
-
def in_transaction?
|
|
622
|
-
within_states?(STARTING_TRANSACTION_STATE, TRANSACTION_IN_PROGRESS_STATE)
|
|
623
|
-
end
|
|
1027
|
+
private
|
|
624
1028
|
|
|
625
|
-
# Get the read
|
|
626
|
-
# active transaction.
|
|
1029
|
+
# Get the read concern the session will use when starting a transaction.
|
|
627
1030
|
#
|
|
628
1031
|
# This is a driver style hash with underscore keys.
|
|
629
1032
|
#
|
|
630
|
-
# @example Get the
|
|
631
|
-
# session.
|
|
1033
|
+
# @example Get the session's transaction read concern.
|
|
1034
|
+
# session.txn_read_concern
|
|
632
1035
|
#
|
|
633
|
-
# @return [ Hash ] The read
|
|
1036
|
+
# @return [ Hash ] The read concern used for starting transactions.
|
|
634
1037
|
#
|
|
635
|
-
# @since 2.
|
|
636
|
-
def
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
Mongo::Lint.validate_underscore_read_preference(rp)
|
|
640
|
-
rp
|
|
641
|
-
end
|
|
642
|
-
|
|
643
|
-
def cluster
|
|
644
|
-
@client.cluster
|
|
1038
|
+
# @since 2.9.0
|
|
1039
|
+
def txn_read_concern
|
|
1040
|
+
# Read concern is inherited from client but not db or collection.
|
|
1041
|
+
txn_options[:read_concern] || @client.read_concern
|
|
645
1042
|
end
|
|
646
1043
|
|
|
647
|
-
private
|
|
648
|
-
|
|
649
1044
|
def within_states?(*states)
|
|
650
1045
|
states.include?(@state)
|
|
651
1046
|
end
|
|
652
1047
|
|
|
653
|
-
def starting_transaction?
|
|
654
|
-
within_states?(STARTING_TRANSACTION_STATE)
|
|
655
|
-
end
|
|
656
|
-
|
|
657
1048
|
def check_if_no_transaction!
|
|
658
1049
|
return unless within_states?(NO_TRANSACTION_STATE)
|
|
659
1050
|
|
|
@@ -661,33 +1052,24 @@ module Mongo
|
|
|
661
1052
|
Mongo::Error::InvalidTransactionOperation::NO_TRANSACTION_STARTED)
|
|
662
1053
|
end
|
|
663
1054
|
|
|
664
|
-
def txn_read_concern
|
|
665
|
-
txn_options && txn_options[:read_concern] || @client.read_concern
|
|
666
|
-
end
|
|
667
|
-
|
|
668
1055
|
def txn_write_concern
|
|
669
|
-
|
|
1056
|
+
txn_options[:write_concern] ||
|
|
670
1057
|
(@client.write_concern && @client.write_concern.options)
|
|
671
1058
|
end
|
|
672
1059
|
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
mode = command['$readPreference']['mode'] || command['$readPreference'][:mode]
|
|
677
|
-
mode && mode != 'primary'
|
|
678
|
-
end
|
|
679
|
-
|
|
680
|
-
def causal_consistency_doc(read_concern)
|
|
1060
|
+
# Returns causal consistency document if the last operation time is
|
|
1061
|
+
# known and causal consistency is enabled, otherwise returns nil.
|
|
1062
|
+
def causal_consistency_doc
|
|
681
1063
|
if operation_time && causal_consistency?
|
|
682
|
-
|
|
1064
|
+
{:afterClusterTime => operation_time}
|
|
683
1065
|
else
|
|
684
|
-
|
|
1066
|
+
nil
|
|
685
1067
|
end
|
|
686
1068
|
end
|
|
687
1069
|
|
|
688
1070
|
def causal_consistency?
|
|
689
1071
|
@causal_consistency ||= (if @options.key?(:causal_consistency)
|
|
690
|
-
|
|
1072
|
+
!!@options[:causal_consistency]
|
|
691
1073
|
else
|
|
692
1074
|
true
|
|
693
1075
|
end)
|
|
@@ -699,22 +1081,12 @@ module Mongo
|
|
|
699
1081
|
end
|
|
700
1082
|
end
|
|
701
1083
|
|
|
702
|
-
def set_cluster_time(result)
|
|
703
|
-
if cluster_time_doc = result.cluster_time
|
|
704
|
-
if @cluster_time.nil?
|
|
705
|
-
@cluster_time = cluster_time_doc
|
|
706
|
-
elsif cluster_time_doc[Cluster::CLUSTER_TIME] > @cluster_time[Cluster::CLUSTER_TIME]
|
|
707
|
-
@cluster_time = cluster_time_doc
|
|
708
|
-
end
|
|
709
|
-
end
|
|
710
|
-
end
|
|
711
|
-
|
|
712
1084
|
def check_if_ended!
|
|
713
1085
|
raise Mongo::Error::InvalidSession.new(SESSION_ENDED_ERROR_MSG) if ended?
|
|
714
1086
|
end
|
|
715
1087
|
|
|
716
|
-
def check_matching_cluster!(
|
|
717
|
-
if @client.cluster != cluster
|
|
1088
|
+
def check_matching_cluster!(client)
|
|
1089
|
+
if @client.cluster != client.cluster
|
|
718
1090
|
raise Mongo::Error::InvalidSession.new(MISMATCHED_CLUSTER_ERROR_MSG)
|
|
719
1091
|
end
|
|
720
1092
|
end
|