mongo 2.5.3 → 2.6.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 +5 -5
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/LICENSE +1 -1
- data/README.md +3 -2
- data/lib/mongo.rb +2 -2
- data/lib/mongo/address.rb +10 -2
- data/lib/mongo/address/ipv4.rb +1 -1
- data/lib/mongo/address/ipv6.rb +26 -5
- data/lib/mongo/address/unix.rb +1 -1
- data/lib/mongo/auth.rb +10 -3
- data/lib/mongo/auth/cr.rb +4 -1
- data/lib/mongo/auth/cr/conversation.rb +4 -1
- data/lib/mongo/auth/ldap.rb +1 -1
- data/lib/mongo/auth/ldap/conversation.rb +1 -1
- data/lib/mongo/auth/roles.rb +1 -1
- data/lib/mongo/auth/scram.rb +24 -7
- data/lib/mongo/auth/scram/conversation.rb +52 -19
- data/lib/mongo/auth/stringprep.rb +114 -0
- data/lib/mongo/auth/stringprep/profiles/sasl.rb +73 -0
- data/lib/mongo/auth/stringprep/tables.rb +3232 -0
- data/lib/mongo/auth/stringprep/unicode_normalize/normalize.rb +174 -0
- data/lib/mongo/auth/stringprep/unicode_normalize/tables.rb +1170 -0
- data/lib/mongo/auth/user.rb +14 -3
- data/lib/mongo/auth/user/view.rb +1 -1
- data/lib/mongo/auth/x509.rb +1 -1
- data/lib/mongo/auth/x509/conversation.rb +1 -1
- data/lib/mongo/bson.rb +1 -1
- data/lib/mongo/bulk_write.rb +8 -8
- data/lib/mongo/bulk_write/combineable.rb +1 -1
- data/lib/mongo/bulk_write/ordered_combiner.rb +1 -1
- data/lib/mongo/bulk_write/result.rb +1 -1
- data/lib/mongo/bulk_write/result_combiner.rb +4 -4
- data/lib/mongo/bulk_write/transformable.rb +1 -1
- data/lib/mongo/bulk_write/unordered_combiner.rb +1 -1
- data/lib/mongo/bulk_write/validatable.rb +1 -1
- data/lib/mongo/client.rb +115 -24
- data/lib/mongo/cluster.rb +17 -10
- data/lib/mongo/cluster/app_metadata.rb +7 -1
- data/lib/mongo/cluster/periodic_executor.rb +1 -1
- data/lib/mongo/cluster/reapers/socket_reaper.rb +1 -1
- data/lib/mongo/cluster/topology.rb +12 -2
- data/lib/mongo/cluster/topology/replica_set.rb +9 -1
- data/lib/mongo/cluster/topology/sharded.rb +1 -1
- data/lib/mongo/cluster/topology/single.rb +1 -1
- data/lib/mongo/cluster/topology/unknown.rb +1 -1
- data/lib/mongo/collection.rb +75 -19
- data/lib/mongo/collection/view.rb +1 -1
- data/lib/mongo/collection/view/aggregation.rb +1 -1
- data/lib/mongo/collection/view/builder.rb +1 -1
- data/lib/mongo/collection/view/builder/aggregation.rb +3 -3
- data/lib/mongo/collection/view/builder/find_command.rb +1 -1
- data/lib/mongo/collection/view/builder/flags.rb +1 -1
- data/lib/mongo/collection/view/builder/map_reduce.rb +1 -1
- data/lib/mongo/collection/view/builder/modifiers.rb +1 -1
- data/lib/mongo/collection/view/builder/op_query.rb +1 -1
- data/lib/mongo/collection/view/change_stream.rb +193 -17
- data/lib/mongo/collection/view/change_stream/retryable.rb +3 -20
- data/lib/mongo/collection/view/explainable.rb +1 -1
- data/lib/mongo/collection/view/immutable.rb +1 -1
- data/lib/mongo/collection/view/iterable.rb +2 -2
- data/lib/mongo/collection/view/map_reduce.rb +1 -1
- data/lib/mongo/collection/view/readable.rb +108 -29
- data/lib/mongo/collection/view/writable.rb +3 -3
- data/lib/mongo/cursor.rb +44 -4
- data/lib/mongo/cursor/builder.rb +1 -1
- data/lib/mongo/cursor/builder/get_more_command.rb +1 -1
- data/lib/mongo/cursor/builder/kill_cursors_command.rb +1 -1
- data/lib/mongo/cursor/builder/op_get_more.rb +1 -1
- data/lib/mongo/cursor/builder/op_kill_cursors.rb +1 -1
- data/lib/mongo/database.rb +46 -3
- data/lib/mongo/database/view.rb +11 -11
- data/lib/mongo/dbref.rb +1 -1
- data/lib/mongo/error.rb +57 -1
- data/lib/mongo/error/bulk_write_error.rb +2 -2
- data/lib/mongo/error/change_stream_resumable.rb +37 -0
- data/lib/mongo/error/closed_stream.rb +1 -1
- data/lib/mongo/error/extra_file_chunk.rb +1 -1
- data/lib/mongo/error/failed_stringprep_validation.rb +38 -0
- data/lib/mongo/error/file_not_found.rb +1 -1
- data/lib/mongo/error/insufficient_iteration_count.rb +38 -0
- data/lib/mongo/error/invalid_application_name.rb +1 -1
- data/lib/mongo/error/invalid_bulk_operation.rb +1 -1
- data/lib/mongo/error/invalid_bulk_operation_type.rb +1 -1
- data/lib/mongo/error/invalid_collection_name.rb +1 -1
- data/lib/mongo/error/invalid_database_name.rb +1 -1
- data/lib/mongo/error/invalid_document.rb +1 -1
- data/lib/mongo/error/invalid_file.rb +1 -1
- data/lib/mongo/error/invalid_file_revision.rb +1 -1
- data/lib/mongo/error/invalid_min_pool_size.rb +1 -1
- data/lib/mongo/error/invalid_nonce.rb +1 -1
- data/lib/mongo/error/invalid_read_option.rb +35 -0
- data/lib/mongo/error/invalid_replacement_document.rb +1 -1
- data/lib/mongo/error/invalid_server_preference.rb +1 -1
- data/lib/mongo/error/invalid_session.rb +1 -1
- data/lib/mongo/error/invalid_signature.rb +1 -1
- data/lib/mongo/error/invalid_transaction_operation.rb +82 -0
- data/lib/mongo/error/invalid_txt_record.rb +1 -1
- data/lib/mongo/error/invalid_update_document.rb +1 -1
- data/lib/mongo/error/invalid_uri.rb +1 -1
- data/lib/mongo/error/invalid_write_concern.rb +1 -1
- data/lib/mongo/error/max_bson_size.rb +1 -1
- data/lib/mongo/error/max_message_size.rb +1 -1
- data/lib/mongo/error/mismatched_domain.rb +1 -1
- data/lib/mongo/error/missing_file_chunk.rb +1 -1
- data/lib/mongo/error/missing_resume_token.rb +1 -1
- data/lib/mongo/error/multi_index_drop.rb +1 -1
- data/lib/mongo/error/need_primary_server.rb +1 -1
- data/lib/mongo/error/no_server_available.rb +1 -1
- data/lib/mongo/error/no_srv_records.rb +1 -1
- data/lib/mongo/error/operation_failure.rb +108 -14
- data/lib/mongo/error/parser.rb +50 -1
- data/lib/mongo/error/socket_error.rb +5 -2
- data/lib/mongo/error/socket_timeout_error.rb +5 -2
- data/lib/mongo/error/unchangeable_collection_option.rb +1 -1
- data/lib/mongo/error/unexpected_chunk_length.rb +1 -1
- data/lib/mongo/error/unexpected_response.rb +1 -1
- data/lib/mongo/error/unknown_payload_type.rb +1 -1
- data/lib/mongo/error/unsupported_array_filters.rb +1 -1
- data/lib/mongo/error/unsupported_collation.rb +1 -1
- data/lib/mongo/error/unsupported_features.rb +1 -1
- data/lib/mongo/error/unsupported_message_type.rb +1 -1
- data/lib/mongo/error/write_retryable.rb +27 -0
- data/lib/mongo/event.rb +10 -9
- data/lib/mongo/event/base.rb +33 -0
- data/lib/mongo/event/description_changed.rb +2 -2
- data/lib/mongo/event/listeners.rb +1 -1
- data/lib/mongo/event/member_discovered.rb +4 -2
- data/lib/mongo/event/primary_elected.rb +2 -2
- data/lib/mongo/event/publisher.rb +1 -1
- data/lib/mongo/event/standalone_discovered.rb +2 -2
- data/lib/mongo/event/subscriber.rb +1 -1
- data/lib/mongo/grid.rb +1 -1
- data/lib/mongo/grid/file.rb +1 -1
- data/lib/mongo/grid/file/chunk.rb +3 -3
- data/lib/mongo/grid/file/info.rb +26 -3
- data/lib/mongo/grid/fs_bucket.rb +1 -1
- data/lib/mongo/grid/stream.rb +1 -1
- data/lib/mongo/grid/stream/read.rb +1 -1
- data/lib/mongo/grid/stream/write.rb +1 -1
- data/lib/mongo/index.rb +1 -1
- data/lib/mongo/index/view.rb +1 -1
- data/lib/mongo/loggable.rb +1 -1
- data/lib/mongo/logger.rb +1 -1
- data/lib/mongo/monitoring.rb +99 -62
- data/lib/mongo/monitoring/command_log_subscriber.rb +2 -2
- data/lib/mongo/monitoring/event.rb +2 -1
- data/lib/mongo/monitoring/event/command_failed.rb +19 -6
- data/lib/mongo/monitoring/event/command_started.rb +14 -3
- data/lib/mongo/monitoring/event/command_succeeded.rb +5 -3
- data/lib/mongo/monitoring/event/secure.rb +1 -1
- data/lib/mongo/monitoring/event/server_closed.rb +2 -2
- data/lib/mongo/monitoring/event/server_description_changed.rb +2 -2
- data/lib/mongo/monitoring/event/server_opening.rb +11 -2
- data/lib/mongo/monitoring/event/topology_changed.rb +13 -2
- data/lib/mongo/monitoring/event/topology_closed.rb +2 -2
- data/lib/mongo/monitoring/event/topology_opening.rb +11 -2
- data/lib/mongo/monitoring/publishable.rb +10 -6
- data/lib/mongo/monitoring/sdam_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/server_closed_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/server_opening_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +1 -1
- data/lib/mongo/monitoring/topology_opening_log_subscriber.rb +1 -1
- data/lib/mongo/operation/aggregate/op_msg.rb +3 -0
- data/lib/mongo/operation/create/op_msg.rb +9 -0
- data/lib/mongo/operation/create_index/op_msg.rb +9 -0
- data/lib/mongo/operation/create_user/command.rb +1 -1
- data/lib/mongo/operation/create_user/op_msg.rb +10 -1
- data/lib/mongo/operation/delete/op_msg.rb +3 -0
- data/lib/mongo/operation/distinct/op_msg.rb +9 -0
- data/lib/mongo/operation/drop/op_msg.rb +9 -0
- data/lib/mongo/operation/drop_database/op_msg.rb +9 -0
- data/lib/mongo/operation/drop_index/op_msg.rb +9 -0
- data/lib/mongo/operation/explain/op_msg.rb +3 -0
- data/lib/mongo/operation/find/op_msg.rb +3 -0
- data/lib/mongo/operation/get_more.rb +1 -1
- data/lib/mongo/operation/get_more/command.rb +1 -1
- data/lib/mongo/operation/get_more/legacy.rb +1 -1
- data/lib/mongo/operation/get_more/op_msg.rb +3 -0
- data/lib/mongo/operation/indexes/op_msg.rb +3 -0
- data/lib/mongo/operation/indexes/result.rb +1 -1
- data/lib/mongo/operation/insert/bulk_result.rb +32 -2
- data/lib/mongo/operation/insert/op_msg.rb +3 -0
- data/lib/mongo/operation/insert/result.rb +1 -1
- data/lib/mongo/operation/kill_cursors/op_msg.rb +9 -0
- data/lib/mongo/operation/list_collections/op_msg.rb +3 -0
- data/lib/mongo/operation/list_collections/result.rb +5 -1
- data/lib/mongo/operation/map_reduce/op_msg.rb +3 -0
- data/lib/mongo/operation/map_reduce/result.rb +1 -1
- data/lib/mongo/operation/parallel_scan/op_msg.rb +3 -0
- data/lib/mongo/operation/remove_user/op_msg.rb +9 -0
- data/lib/mongo/operation/result.rb +27 -14
- data/lib/mongo/operation/shared/executable.rb +1 -0
- data/lib/mongo/operation/shared/sessions_supported.rb +78 -7
- data/lib/mongo/operation/shared/specifiable.rb +18 -2
- data/lib/mongo/operation/shared/write_concern_supported.rb +1 -1
- data/lib/mongo/operation/update/op_msg.rb +3 -0
- data/lib/mongo/operation/update_user/command.rb +1 -1
- data/lib/mongo/operation/update_user/op_msg.rb +10 -1
- data/lib/mongo/operation/users_info/op_msg.rb +3 -0
- data/lib/mongo/options.rb +1 -1
- data/lib/mongo/options/mapper.rb +1 -1
- data/lib/mongo/options/redacted.rb +1 -1
- data/lib/mongo/protocol/bit_vector.rb +1 -1
- data/lib/mongo/protocol/compressed.rb +1 -1
- data/lib/mongo/protocol/delete.rb +1 -1
- data/lib/mongo/protocol/get_more.rb +7 -7
- data/lib/mongo/protocol/insert.rb +1 -1
- data/lib/mongo/protocol/kill_cursors.rb +1 -1
- data/lib/mongo/protocol/message.rb +5 -5
- data/lib/mongo/protocol/msg.rb +9 -7
- data/lib/mongo/protocol/query.rb +1 -1
- data/lib/mongo/protocol/registry.rb +1 -1
- data/lib/mongo/protocol/reply.rb +10 -10
- data/lib/mongo/protocol/serializers.rb +1 -1
- data/lib/mongo/protocol/update.rb +1 -1
- data/lib/mongo/retryable.rb +22 -14
- data/lib/mongo/server.rb +1 -1
- data/lib/mongo/server/connectable.rb +1 -1
- data/lib/mongo/server/connection.rb +16 -4
- data/lib/mongo/server/connection_pool.rb +1 -1
- data/lib/mongo/server/connection_pool/queue.rb +1 -1
- data/lib/mongo/server/context.rb +1 -1
- data/lib/mongo/server/description.rb +14 -2
- data/lib/mongo/server/description/features.rb +10 -9
- data/lib/mongo/server/description/inspector.rb +1 -1
- data/lib/mongo/server/description/inspector/description_changed.rb +1 -1
- data/lib/mongo/server/description/inspector/member_discovered.rb +1 -1
- data/lib/mongo/server/description/inspector/primary_elected.rb +1 -1
- data/lib/mongo/server/description/inspector/standalone_discovered.rb +1 -1
- data/lib/mongo/server/monitor.rb +15 -3
- data/lib/mongo/server/monitor/connection.rb +1 -1
- data/lib/mongo/server_selector.rb +1 -1
- data/lib/mongo/server_selector/nearest.rb +1 -1
- data/lib/mongo/server_selector/primary.rb +1 -1
- data/lib/mongo/server_selector/primary_preferred.rb +1 -1
- data/lib/mongo/server_selector/secondary.rb +1 -1
- data/lib/mongo/server_selector/secondary_preferred.rb +1 -1
- data/lib/mongo/server_selector/selectable.rb +7 -2
- data/lib/mongo/session.rb +389 -12
- data/lib/mongo/session/server_session.rb +7 -2
- data/lib/mongo/session/session_pool.rb +1 -1
- data/lib/mongo/socket.rb +1 -1
- data/lib/mongo/socket/ssl.rb +1 -1
- data/lib/mongo/socket/tcp.rb +1 -1
- data/lib/mongo/socket/unix.rb +1 -1
- data/lib/mongo/uri.rb +6 -4
- data/lib/mongo/uri/srv_protocol.rb +1 -1
- data/lib/mongo/version.rb +2 -2
- data/lib/mongo/write_concern.rb +1 -1
- data/lib/mongo/write_concern/acknowledged.rb +1 -1
- data/lib/mongo/write_concern/normalizable.rb +1 -1
- data/lib/mongo/write_concern/unacknowledged.rb +1 -1
- data/mongo.gemspec +4 -1
- data/spec/atlas/atlas_connectivity_spec.rb +54 -0
- data/spec/integration/bulk_insert_spec.rb +78 -0
- data/spec/integration/change_stream_spec.rb +365 -0
- data/spec/integration/command_monitoring_spec.rb +92 -0
- data/spec/lite_spec_helper.rb +63 -0
- data/spec/mongo/address/ipv6_spec.rb +29 -1
- data/spec/mongo/address_spec.rb +34 -0
- data/spec/mongo/auth/scram/conversation_spec.rb +326 -120
- data/spec/mongo/auth/scram/negotiation_spec.rb +574 -0
- data/spec/mongo/auth/scram_spec.rb +107 -38
- data/spec/mongo/auth/stringprep/profiles/sasl_spec.rb +113 -0
- data/spec/mongo/auth/stringprep_spec.rb +188 -0
- data/spec/mongo/auth/user/view_spec.rb +5 -2
- data/spec/mongo/auth/user_spec.rb +1 -1
- data/spec/mongo/bulk_write/result_spec.rb +120 -0
- data/spec/mongo/bulk_write_spec.rb +42 -2
- data/spec/mongo/client_spec.rb +121 -9
- data/spec/mongo/cluster/app_metadata_spec.rb +14 -1
- data/spec/mongo/cluster/topology_spec.rb +1 -23
- data/spec/mongo/collection/view/change_stream_spec.rb +62 -180
- data/spec/mongo/collection_spec.rb +45 -12
- data/spec/mongo/cursor/builder/get_more_command_spec.rb +7 -7
- data/spec/mongo/cursor_spec.rb +2 -2
- data/spec/mongo/database_spec.rb +3 -3
- data/spec/mongo/docs_examples_spec.rb +194 -0
- data/spec/mongo/error/operation_failure_spec.rb +152 -0
- data/spec/mongo/error/parser_spec.rb +127 -0
- data/spec/mongo/grid/fs_bucket_spec.rb +32 -0
- data/spec/mongo/grid/stream/write_spec.rb +40 -1
- data/spec/mongo/monitoring/event/command_failed_spec.rb +30 -0
- data/spec/mongo/monitoring/event/command_started_spec.rb +26 -4
- data/spec/mongo/monitoring/event/command_succeeded_spec.rb +29 -7
- data/spec/mongo/monitoring_spec.rb +28 -3
- data/spec/mongo/protocol/get_more_spec.rb +2 -2
- data/spec/mongo/retryable_spec.rb +252 -34
- data/spec/mongo/retryable_writes_spec.rb +468 -544
- data/spec/mongo/server/connection_spec.rb +5 -5
- data/spec/mongo/server/description_spec.rb +23 -6
- data/spec/mongo/session/server_session_spec.rb +2 -2
- data/spec/mongo/session/session_pool_spec.rb +2 -2
- data/spec/mongo/transactions_examples_spec.rb +227 -0
- data/spec/mongo/transactions_spec.rb +44 -0
- data/spec/spec_helper.rb +135 -49
- data/spec/spec_tests/change_streams_spec.rb +42 -0
- data/spec/{mongo → spec_tests}/command_monitoring_spec.rb +8 -2
- data/spec/{mongo → spec_tests}/connection_string_spec.rb +1 -1
- data/spec/{mongo → spec_tests}/crud_spec.rb +5 -7
- data/spec/{mongo → spec_tests}/dns_seedlist_discovery_spec.rb +1 -1
- data/spec/{mongo → spec_tests}/gridfs_spec.rb +0 -0
- data/spec/{mongo → spec_tests}/max_staleness_spec.rb +0 -0
- data/spec/spec_tests/retryable_writes_spec.rb +78 -0
- data/spec/{mongo → spec_tests}/sdam_monitoring_spec.rb +4 -3
- data/spec/{mongo → spec_tests}/sdam_spec.rb +7 -7
- data/spec/{mongo → spec_tests}/server_selection_rtt_spec.rb +0 -0
- data/spec/{mongo → spec_tests}/server_selection_spec.rb +0 -0
- data/spec/support/authorization.rb +18 -6
- data/spec/support/change_streams.rb +265 -0
- data/spec/support/change_streams/operation.rb +62 -0
- data/spec/support/change_streams_tests/change-streams-errors.yml +53 -0
- data/spec/support/change_streams_tests/change-streams.yml +299 -0
- data/spec/support/command_monitoring.rb +1 -1
- data/spec/support/command_monitoring/bulkWrite.yml +4 -28
- data/spec/support/command_monitoring/command.yml +19 -0
- data/spec/support/command_monitoring/find.yml +17 -19
- data/spec/support/command_monitoring/insertMany.yml +2 -8
- data/spec/support/command_monitoring/unacknowledgedBulkWrite.yml +34 -0
- data/spec/support/connection_string.rb +1 -1
- data/spec/support/constraints.rb +56 -0
- data/spec/support/crud.rb +9 -4
- data/spec/support/crud/read.rb +24 -3
- data/spec/support/crud/write.rb +7 -2
- data/spec/support/crud_tests/read/count-collation.yml +12 -2
- data/spec/support/crud_tests/read/count.yml +43 -5
- data/spec/support/gridfs.rb +1 -1
- data/spec/support/primary_socket.rb +21 -0
- data/spec/support/retryable_writes_tests/bulkWrite-serverErrors.yml +90 -0
- data/spec/support/retryable_writes_tests/bulkWrite.yml +99 -1
- data/spec/support/retryable_writes_tests/deleteOne-serverErrors.yml +50 -0
- data/spec/support/retryable_writes_tests/deleteOne.yml +10 -1
- data/spec/support/retryable_writes_tests/findOneAndDelete-serverErrors.yml +50 -0
- data/spec/support/retryable_writes_tests/findOneAndDelete.yml +39 -30
- data/spec/support/retryable_writes_tests/findOneAndReplace-serverErrors.yml +54 -0
- data/spec/support/retryable_writes_tests/findOneAndReplace.yml +9 -0
- data/spec/support/retryable_writes_tests/findOneAndUpdate-serverErrors.yml +54 -0
- data/spec/support/retryable_writes_tests/findOneAndUpdate.yml +9 -0
- data/spec/support/retryable_writes_tests/insertMany-serverErrors.yml +59 -0
- data/spec/support/retryable_writes_tests/insertMany.yml +11 -6
- data/spec/support/retryable_writes_tests/insertOne-serverErrors.yml +471 -0
- data/spec/support/retryable_writes_tests/insertOne.yml +9 -0
- data/spec/support/retryable_writes_tests/replaceOne-serverErrors.yml +58 -0
- data/spec/support/retryable_writes_tests/replaceOne.yml +9 -0
- data/spec/support/retryable_writes_tests/updateOne-serverErrors.yml +58 -0
- data/spec/support/retryable_writes_tests/updateOne.yml +71 -53
- data/spec/support/sdam/rs/normalize_case_me.yml +100 -0
- data/spec/support/sdam/sharded/compatible.yml +38 -0
- data/spec/support/sdam/sharded/mongos_disconnect.yml +9 -3
- data/spec/support/sdam/sharded/multiple_mongoses.yml +6 -2
- data/spec/support/sdam/sharded/non_mongos_removed.yml +6 -2
- data/spec/support/sdam/sharded/too_new.yml +36 -0
- data/spec/support/sdam/sharded/too_old.yml +36 -0
- data/spec/support/sdam/single/compatible.yml +26 -0
- data/spec/support/sdam/single/direct_connection_external_ip.yml +3 -1
- data/spec/support/sdam/single/direct_connection_mongos.yml +3 -1
- data/spec/support/sdam/single/direct_connection_rsarbiter.yml +3 -1
- data/spec/support/sdam/single/direct_connection_rsprimary.yml +3 -1
- data/spec/support/sdam/single/direct_connection_rssecondary.yml +3 -1
- data/spec/support/sdam/single/direct_connection_slave.yml +3 -1
- data/spec/support/sdam/single/direct_connection_standalone.yml +3 -1
- data/spec/support/sdam/single/not_ok_response.yml +6 -2
- data/spec/support/sdam/single/standalone_removed.yml +3 -1
- data/spec/support/sdam/single/too_new.yml +26 -0
- data/spec/support/sdam/single/too_old.yml +24 -0
- data/spec/support/shared/session.rb +107 -0
- data/spec/support/transactions.rb +391 -0
- data/spec/support/transactions/operation.rb +373 -0
- data/spec/support/transactions_tests/abort.yml +403 -0
- data/spec/support/transactions_tests/bulk.yml +267 -0
- data/spec/support/transactions_tests/causal-consistency.yml +173 -0
- data/spec/support/transactions_tests/commit.yml +593 -0
- data/spec/support/transactions_tests/delete.yml +184 -0
- data/spec/support/transactions_tests/error-labels.yml +948 -0
- data/spec/support/transactions_tests/errors.yml +125 -0
- data/spec/support/transactions_tests/findOneAndDelete.yml +126 -0
- data/spec/support/transactions_tests/findOneAndReplace.yml +140 -0
- data/spec/support/transactions_tests/findOneAndUpdate.yml +228 -0
- data/spec/support/transactions_tests/insert.yml +264 -0
- data/spec/support/transactions_tests/isolation.yml +125 -0
- data/spec/support/transactions_tests/read-pref.yml +340 -0
- data/spec/support/transactions_tests/reads.yml +298 -0
- data/spec/support/transactions_tests/retryable-abort.yml +1292 -0
- data/spec/support/transactions_tests/retryable-commit.yml +1332 -0
- data/spec/support/transactions_tests/retryable-writes.yml +208 -0
- data/spec/support/transactions_tests/run-command.yml +189 -0
- data/spec/support/transactions_tests/transaction-options.yml +877 -0
- data/spec/support/transactions_tests/update.yml +246 -0
- data/spec/support/transactions_tests/write-concern.yml +236 -0
- metadata +494 -359
- metadata.gz.sig +0 -0
- data/lib/csasl/csasl.bundle +0 -0
@@ -0,0 +1,82 @@
|
|
1
|
+
# Copyright (C) 2014-2018 MongoDB, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module Mongo
|
16
|
+
class Error
|
17
|
+
|
18
|
+
# Exception raised if an invalid operation is attempted as part of a transaction.
|
19
|
+
#
|
20
|
+
# @since 2.6.0
|
21
|
+
class InvalidTransactionOperation < Error
|
22
|
+
|
23
|
+
# The error message for when a user attempts to commit or abort a transaction when none is in
|
24
|
+
# progress.
|
25
|
+
#
|
26
|
+
# @since 2.6.0
|
27
|
+
NO_TRANSACTION_STARTED = 'no transaction started'.freeze
|
28
|
+
|
29
|
+
# The error message for when a user attempts to start a transaction when one is already in
|
30
|
+
# progress.
|
31
|
+
#
|
32
|
+
# @since 2.6.0.
|
33
|
+
TRANSACTION_ALREADY_IN_PROGRESS = 'transaction already in progress'.freeze
|
34
|
+
|
35
|
+
# The error message for when a transaction read operation uses a non-primary read preference.
|
36
|
+
#
|
37
|
+
# @since 2.6.0
|
38
|
+
INVALID_READ_PREFERENCE = 'read preference in a transaction must be primary'.freeze
|
39
|
+
|
40
|
+
# The error message for when a transaction is started with an unacknowledged write concern.
|
41
|
+
#
|
42
|
+
# @since 2.6.0
|
43
|
+
UNACKNOWLEDGED_WRITE_CONCERN = 'transactions do not support unacknowledged write concern'.freeze
|
44
|
+
|
45
|
+
# Instantiate the new exception.
|
46
|
+
#
|
47
|
+
# @example Instantiate the exception.
|
48
|
+
# Mongo::Error::InvalidUpdateDocument.new(msg)
|
49
|
+
#
|
50
|
+
# @since 2.6.0
|
51
|
+
def initialize(msg)
|
52
|
+
super(msg)
|
53
|
+
end
|
54
|
+
|
55
|
+
# Create an error message for incorrectly running a transaction operation twice.
|
56
|
+
#
|
57
|
+
# @example Create the error message.
|
58
|
+
# InvalidTransactionOperation.cannot_call_twice(op)
|
59
|
+
#
|
60
|
+
# @param [ Symbol ] op The operation which was run twice.
|
61
|
+
#
|
62
|
+
# @since 2.6.0
|
63
|
+
def self.cannot_call_twice_msg(op)
|
64
|
+
"cannot call #{op} twice"
|
65
|
+
end
|
66
|
+
|
67
|
+
# Create an error message for incorrectly running a transaction operation that cannot be run
|
68
|
+
# after the previous one.
|
69
|
+
#
|
70
|
+
# @example Create the error message.
|
71
|
+
# InvalidTransactionOperation.cannot_call_after(last_op, current_op)
|
72
|
+
#
|
73
|
+
# @param [ Symbol ] last_op The operation which was run before.
|
74
|
+
# @param [ Symbol ] current_op The operation which cannot be run.
|
75
|
+
#
|
76
|
+
# @since 2.6.0
|
77
|
+
def self.cannot_call_after_msg(last_op, current_op)
|
78
|
+
"Cannot call #{current_op} after calling #{last_op}"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (C) 2015-
|
1
|
+
# Copyright (C) 2015-2018 MongoDB, Inc.
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -21,22 +21,39 @@ module Mongo
|
|
21
21
|
class OperationFailure < Error
|
22
22
|
extend Forwardable
|
23
23
|
|
24
|
+
# Error codes and code names that should result in a failing write
|
25
|
+
# being retried.
|
26
|
+
#
|
27
|
+
# @since 2.6.0
|
28
|
+
# @api private
|
29
|
+
WRITE_RETRY_ERRORS = [
|
30
|
+
{:code_name => 'InterruptedAtShutdown', :code => 11600},
|
31
|
+
{:code_name => 'InterruptedDueToReplStateChange', :code => 11602},
|
32
|
+
{:code_name => 'NotMaster', :code => 10107},
|
33
|
+
{:code_name => 'NotMasterNoSlaveOk', :code => 13435},
|
34
|
+
{:code_name => 'NotMasterOrSecondary', :code => 13436},
|
35
|
+
{:code_name => 'PrimarySteppedDown', :code => 189},
|
36
|
+
{:code_name => 'ShutdownInProgress', :code => 91},
|
37
|
+
{:code_name => 'HostNotFound', :code => 7},
|
38
|
+
{:code_name => 'HostUnreachable', :code => 6},
|
39
|
+
{:code_name => 'NetworkTimeout', :code => 89},
|
40
|
+
{:code_name => 'SocketException', :code => 9001},
|
41
|
+
].freeze
|
42
|
+
|
24
43
|
# These are magic error messages that could indicate a master change.
|
25
44
|
#
|
26
45
|
# @since 2.4.2
|
46
|
+
# @api private
|
27
47
|
WRITE_RETRY_MESSAGES = [
|
28
|
-
'no master',
|
29
48
|
'not master',
|
30
|
-
'
|
31
|
-
'Not primary'
|
49
|
+
'node is recovering',
|
32
50
|
].freeze
|
33
51
|
|
34
52
|
# These are magic error messages that could indicate a cluster
|
35
|
-
# reconfiguration behind a mongos.
|
36
|
-
# change between versions, for example 15988 which has 2 completely
|
37
|
-
# different meanings between 2.4 and 3.0.
|
53
|
+
# reconfiguration behind a mongos.
|
38
54
|
#
|
39
55
|
# @since 2.1.1
|
56
|
+
# @api private
|
40
57
|
RETRY_MESSAGES = WRITE_RETRY_MESSAGES + [
|
41
58
|
'transport error',
|
42
59
|
'socket exception',
|
@@ -52,12 +69,20 @@ module Mongo
|
|
52
69
|
|
53
70
|
def_delegators :@result, :operation_time
|
54
71
|
|
72
|
+
# @return [ Integer ] code The error code parsed from the document.
|
73
|
+
# @since 2.6.0
|
74
|
+
attr_reader :code
|
75
|
+
|
76
|
+
# @return [ String ] code_name The error code name parsed from the document.
|
77
|
+
# @since 2.6.0
|
78
|
+
attr_reader :code_name
|
79
|
+
|
55
80
|
# Can the read operation that caused the error be retried?
|
56
81
|
#
|
57
82
|
# @example Is the error retryable?
|
58
83
|
# error.retryable?
|
59
84
|
#
|
60
|
-
# @return [ true, false ]
|
85
|
+
# @return [ true, false ] Whether the error is retryable.
|
61
86
|
#
|
62
87
|
# @since 2.1.1
|
63
88
|
def retryable?
|
@@ -69,24 +94,93 @@ module Mongo
|
|
69
94
|
# @example Is the error retryable for writes?
|
70
95
|
# error.write_retryable?
|
71
96
|
#
|
72
|
-
# @return [ true, false ]
|
97
|
+
# @return [ true, false ] Whether the error is retryable.
|
73
98
|
#
|
74
99
|
# @since 2.4.2
|
75
100
|
def write_retryable?
|
76
|
-
WRITE_RETRY_MESSAGES.any? { |m| message.include?(m) }
|
101
|
+
WRITE_RETRY_MESSAGES.any? { |m| message.include?(m) } ||
|
102
|
+
write_retryable_code?
|
103
|
+
end
|
104
|
+
|
105
|
+
def write_retryable_code?
|
106
|
+
if code
|
107
|
+
WRITE_RETRY_ERRORS.any? { |e| e[:code] == code }
|
108
|
+
else
|
109
|
+
# return false rather than nil
|
110
|
+
false
|
111
|
+
end
|
77
112
|
end
|
113
|
+
private :write_retryable_code?
|
114
|
+
|
115
|
+
# Error codes and code names that should result in a failing getMore
|
116
|
+
# command on a change stream NOT being resumed.
|
117
|
+
#
|
118
|
+
# @since 2.6.0
|
119
|
+
# @api private
|
120
|
+
CHANGE_STREAM_NOT_RESUME_ERRORS = [
|
121
|
+
{:code_name => 'CappedPositionLost', :code => 136},
|
122
|
+
{:code_name => 'CursorKilled', :code => 237},
|
123
|
+
{:code_name => 'Interrupted', :code => 11601},
|
124
|
+
].freeze
|
125
|
+
|
126
|
+
# Change stream can be resumed when these error messages are encountered.
|
127
|
+
#
|
128
|
+
# @since 2.6.0
|
129
|
+
# @api private
|
130
|
+
CHANGE_STREAM_RESUME_MESSAGES = WRITE_RETRY_MESSAGES
|
131
|
+
|
132
|
+
# Can the change stream on which this error occurred be resumed,
|
133
|
+
# provided the operation that triggered this error was a getMore?
|
134
|
+
#
|
135
|
+
# @example Is the error resumable for the change stream?
|
136
|
+
# error.change_stream_resumable?
|
137
|
+
#
|
138
|
+
# @return [ true, false ] Whether the error is resumable.
|
139
|
+
#
|
140
|
+
# @since 2.6.0
|
141
|
+
def change_stream_resumable?
|
142
|
+
if @result && @result.is_a?(Mongo::Operation::GetMore::Result)
|
143
|
+
change_stream_resumable_message? ||
|
144
|
+
change_stream_resumable_code?
|
145
|
+
else
|
146
|
+
false
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
def change_stream_resumable_message?
|
151
|
+
CHANGE_STREAM_RESUME_MESSAGES.any? { |m| message.include?(m) }
|
152
|
+
end
|
153
|
+
private :change_stream_resumable_message?
|
154
|
+
|
155
|
+
def change_stream_resumable_code?
|
156
|
+
if code
|
157
|
+
!CHANGE_STREAM_NOT_RESUME_ERRORS.any? { |e| e[:code] == code }
|
158
|
+
else
|
159
|
+
true
|
160
|
+
end
|
161
|
+
end
|
162
|
+
private :change_stream_resumable_code?
|
78
163
|
|
79
164
|
# Create the operation failure.
|
80
165
|
#
|
81
166
|
# @example Create the error object
|
82
167
|
# OperationFailure.new(message, result)
|
83
168
|
#
|
84
|
-
#
|
85
|
-
#
|
169
|
+
# @example Create the error object with a code and a code name
|
170
|
+
# OperationFailure.new(message, result, :code => code, :code_name => code_name)
|
171
|
+
#
|
172
|
+
# @param [ String ] message The error message.
|
173
|
+
# @param [ Operation::Result ] result The result object.
|
174
|
+
# @param [ Hash ] options Additional parameters
|
175
|
+
#
|
176
|
+
# @option options [ Integer ] :code Error code
|
177
|
+
# @option options [ String ] :code_name Error code name
|
86
178
|
#
|
87
|
-
# @since 2.5.0
|
88
|
-
def initialize(message = nil, result = nil)
|
179
|
+
# @since 2.5.0, options added in 2.6.0
|
180
|
+
def initialize(message = nil, result = nil, options = {})
|
89
181
|
@result = result
|
182
|
+
@code = options[:code]
|
183
|
+
@code_name = options[:code_name]
|
90
184
|
super(message)
|
91
185
|
end
|
92
186
|
end
|
data/lib/mongo/error/parser.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (C) 2015-
|
1
|
+
# Copyright (C) 2015-2018 MongoDB, Inc.
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -12,6 +12,30 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
+
# Sample error - mongo 3.4:
|
16
|
+
# {
|
17
|
+
# "ok" : 0,
|
18
|
+
# "errmsg" : "not master",
|
19
|
+
# "code" : 10107,
|
20
|
+
# "codeName" : "NotMaster"
|
21
|
+
# }
|
22
|
+
#
|
23
|
+
# Sample response with a write concern error - mongo 3.4:
|
24
|
+
# {
|
25
|
+
# "n" : 1,
|
26
|
+
# "opTime" : {
|
27
|
+
# "ts" : Timestamp(1527728618, 1),
|
28
|
+
# "t" : NumberLong(4)
|
29
|
+
# },
|
30
|
+
# "electionId" : ObjectId("7fffffff0000000000000004"),
|
31
|
+
# "writeConcernError" : {
|
32
|
+
# "code" : 100,
|
33
|
+
# "codeName" : "CannotSatisfyWriteConcern",
|
34
|
+
# "errmsg" : "Not enough data-bearing nodes"
|
35
|
+
# },
|
36
|
+
# "ok" : 1
|
37
|
+
# }
|
38
|
+
|
15
39
|
module Mongo
|
16
40
|
class Error
|
17
41
|
|
@@ -30,6 +54,14 @@ module Mongo
|
|
30
54
|
# @return [ Array<Protocol::Message> ] replies The message replies.
|
31
55
|
attr_reader :replies
|
32
56
|
|
57
|
+
# @return [ Integer ] code The error code parsed from the document.
|
58
|
+
# @since 2.6.0
|
59
|
+
attr_reader :code
|
60
|
+
|
61
|
+
# @return [ String ] code_name The error code name parsed from the document.
|
62
|
+
# @since 2.6.0
|
63
|
+
attr_reader :code_name
|
64
|
+
|
33
65
|
# Create the new parser with the returned document.
|
34
66
|
#
|
35
67
|
# @example Create the new parser.
|
@@ -55,6 +87,7 @@ module Mongo
|
|
55
87
|
parse_single(@message, ERRMSG,
|
56
88
|
document[WRITE_CONCERN_ERROR]) if document[WRITE_CONCERN_ERROR]
|
57
89
|
parse_flag(@message)
|
90
|
+
parse_code
|
58
91
|
end
|
59
92
|
|
60
93
|
def parse_single(message, key, doc = document)
|
@@ -85,6 +118,22 @@ module Mongo
|
|
85
118
|
message.concat(error)
|
86
119
|
end
|
87
120
|
end
|
121
|
+
|
122
|
+
def parse_code
|
123
|
+
@code = document['code']
|
124
|
+
@code_name = document['codeName']
|
125
|
+
|
126
|
+
# Since there is only room for one code, do not replace
|
127
|
+
# codes of the top level response with write concern error codes.
|
128
|
+
# In practice this should never be an issue as a write concern
|
129
|
+
# can only fail after the operation succeeds on the primary.
|
130
|
+
if @code.nil? && @code_name.nil?
|
131
|
+
if subdoc = document[WRITE_CONCERN_ERROR]
|
132
|
+
@code = subdoc['code']
|
133
|
+
@code_name = subdoc['codeName']
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
88
137
|
end
|
89
138
|
end
|
90
139
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (C) 2015-
|
1
|
+
# Copyright (C) 2015-2018 MongoDB, Inc.
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -18,6 +18,9 @@ module Mongo
|
|
18
18
|
# Raised when a socket has an error.
|
19
19
|
#
|
20
20
|
# @since 2.0.0
|
21
|
-
class SocketError < Error
|
21
|
+
class SocketError < Error
|
22
|
+
include WriteRetryable
|
23
|
+
include ChangeStreamResumable
|
24
|
+
end
|
22
25
|
end
|
23
26
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (C) 2015-
|
1
|
+
# Copyright (C) 2015-2018 MongoDB, Inc.
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -18,6 +18,9 @@ module Mongo
|
|
18
18
|
# Raised when a socket connection times out.
|
19
19
|
#
|
20
20
|
# @since 2.0.0
|
21
|
-
class SocketTimeoutError < Error
|
21
|
+
class SocketTimeoutError < Error
|
22
|
+
include WriteRetryable
|
23
|
+
include ChangeStreamResumable
|
24
|
+
end
|
22
25
|
end
|
23
26
|
end
|