diff --git a/src/client/auth/sasl.rs b/src/client/auth/sasl.rs index cd68da899..c6f99ba55 100644 --- a/src/client/auth/sasl.rs +++ b/src/client/auth/sasl.rs @@ -4,6 +4,7 @@ use crate::{ client::{auth::AuthMechanism, options::ServerApi}, cmap::Command, error::{Error, Result}, + operation::{CommandErrorBody, CommandResponse}, }; /// Encapsulates the command building of a `saslStart` command. @@ -98,12 +99,20 @@ fn validate_command_success(auth_mechanism: &str, response: &Document) -> Result match bson_util::get_int(ok) { Some(1) => Ok(()), - Some(_) => Err(Error::authentication_error( - auth_mechanism, - response - .get_str("errmsg") - .unwrap_or("Authentication failure"), - )), + Some(_) => { + let source = bson::from_bson::>(Bson::Document( + response.clone(), + )) + .map(|cmd_resp| cmd_resp.body.into()) + .ok(); + Err(Error::authentication_error( + auth_mechanism, + response + .get_str("errmsg") + .unwrap_or("Authentication failure"), + ) + .with_source(source)) + } _ => Err(Error::invalid_authentication_response(auth_mechanism)), } } diff --git a/src/client/executor.rs b/src/client/executor.rs index 7f99d69fe..3e73aa4fe 100644 --- a/src/client/executor.rs +++ b/src/client/executor.rs @@ -332,8 +332,16 @@ impl Client { Ok(c) => c, Err(mut err) => { err.add_labels_and_update_pin(None, &mut session, None)?; + if err.is_read_retryable() && self.inner.options.retry_writes != Some(false) { + err.add_label(RETRYABLE_WRITE_ERROR); + } - if err.is_pool_cleared() { + let op_retry = match self.get_op_retryability(&op, &session) { + Retryability::Read => err.is_read_retryable(), + Retryability::Write => err.is_write_retryable(), + _ => false, + }; + if err.is_pool_cleared() || op_retry { return self.execute_retry(&mut op, &mut session, None, err).await; } else { return Err(err); @@ -341,7 +349,7 @@ impl Client { } }; - let retryability = self.get_retryability(&conn, &op, &session).await?; + let retryability = self.get_retryability(&conn, &op, &session)?; let txn_number = match session { Some(ref mut session) => { @@ -433,7 +441,7 @@ impl Client { Err(_) => return Err(first_error), }; - let retryability = self.get_retryability(&conn, op, session).await?; + let retryability = self.get_retryability(&conn, op, session)?; if retryability == Retryability::None { return Err(first_error); } @@ -825,35 +833,49 @@ impl Client { } /// Returns the retryability level for the execution of this operation. - async fn get_retryability( + fn get_op_retryability( &self, - conn: &Connection, op: &T, session: &Option<&mut ClientSession>, - ) -> Result { - if !session + ) -> Retryability { + if session .as_ref() .map(|session| session.in_transaction()) .unwrap_or(false) { - match op.retryability() { - Retryability::Read if self.inner.options.retry_reads != Some(false) => { - return Ok(Retryability::Read); - } - Retryability::Write if conn.stream_description()?.supports_retryable_writes() => { - // commitTransaction and abortTransaction should be retried regardless of the - // value for retry_writes set on the Client - if op.name() == CommitTransaction::NAME - || op.name() == AbortTransaction::NAME - || self.inner.options.retry_writes != Some(false) - { - return Ok(Retryability::Write); - } - } - _ => {} + return Retryability::None; + } + match op.retryability() { + Retryability::Read if self.inner.options.retry_reads != Some(false) => { + Retryability::Read + } + // commitTransaction and abortTransaction should be retried regardless of the + // value for retry_writes set on the Client + Retryability::Write + if op.name() == CommitTransaction::NAME + || op.name() == AbortTransaction::NAME + || self.inner.options.retry_writes != Some(false) => + { + Retryability::Write + } + _ => Retryability::None, + } + } + + /// Returns the retryability level for the execution of this operation on this connection. + fn get_retryability( + &self, + conn: &Connection, + op: &T, + session: &Option<&mut ClientSession>, + ) -> Result { + match self.get_op_retryability(op, session) { + Retryability::Read => Ok(Retryability::Read), + Retryability::Write if conn.stream_description()?.supports_retryable_writes() => { + Ok(Retryability::Write) } + _ => Ok(Retryability::None), } - Ok(Retryability::None) } async fn update_cluster_time( diff --git a/src/error.rs b/src/error.rs index db68f84ce..aac5f94d0 100644 --- a/src/error.rs +++ b/src/error.rs @@ -47,6 +47,8 @@ pub struct Error { pub kind: Box, labels: HashSet, pub(crate) wire_version: Option, + #[source] + pub(crate) source: Option>, } impl Error { @@ -61,6 +63,7 @@ impl Error { kind: Box::new(kind), labels, wire_version: None, + source: None, } } @@ -237,6 +240,7 @@ impl Error { ErrorKind::Write(WriteFailure::WriteConcernError(wc_error)) => Some(wc_error.code), _ => None, } + .or_else(|| self.source.as_ref().and_then(|s| s.code())) } /// Gets the message for this error, if applicable, for use in testing. @@ -345,6 +349,11 @@ impl Error { } false } + + pub(crate) fn with_source>>(mut self, source: E) -> Self { + self.source = source.into().map(Box::new); + self + } } impl From for Error diff --git a/src/test/spec/json/retryable-reads/README.rst b/src/test/spec/json/retryable-reads/README.rst index 0661bcaa1..06c9bb788 100644 --- a/src/test/spec/json/retryable-reads/README.rst +++ b/src/test/spec/json/retryable-reads/README.rst @@ -9,8 +9,10 @@ Retryable Reads Tests Introduction ============ -The YAML and JSON files in this directory tree are platform-independent tests -that drivers can use to prove their conformance to the Retryable Reads spec. +The YAML and JSON files in the ``legacy`` and ``unified`` sub-directories are platform-independent tests +that drivers can use to prove their conformance to the Retryable Reads spec. Tests in the +``unified`` directory are written using the `Unified Test Format <../../unified-test-format/unified-test-format.rst>`_. +Tests in the ``legacy`` directory are written using the format described below. Prose tests, which are not easily expressed in YAML, are also presented in this file. Those tests will need to be manually implemented by each driver. @@ -93,7 +95,7 @@ Each YAML file has the following keys: - ``database_name`` and ``collection_name``: Optional. The database and collection to use for testing. - + - ``bucket_name``: Optional. The GridFS bucket name to use for testing. - ``data``: The data that should exist in the collection(s) under test before @@ -101,12 +103,12 @@ Each YAML file has the following keys: into the collection under test (i.e. ``collection_name``); however, this field may also be an object mapping collection names to arrays of documents to be inserted into the specified collection. - + - ``tests``: An array of tests that are to be run independently of each other. Each test will have some or all of the following fields: - ``description``: The name of the test. - + - ``clientOptions``: Optional, parameters to pass to MongoClient(). - ``useMultipleMongoses`` (optional): If ``true``, and the topology type is @@ -121,7 +123,7 @@ Each YAML file has the following keys: server. ``useMultipleMongoses`` only affects ``Sharded`` and ``LoadBalanced`` topologies. - + - ``skipReason``: Optional, string describing why this test should be skipped. - ``failPoint``: Optional, a server fail point to enable, expressed as the @@ -140,10 +142,10 @@ Each YAML file has the following keys: - ``result``: Optional. The return value from the operation, if any. This field may be a scalar (e.g. in the case of a count), a single document, or an array of documents in the case of a multi-document read. - + - ``error``: Optional. If ``true``, the test should expect an error or exception. - + - ``expectations``: Optional list of command-started events. GridFS Tests @@ -167,7 +169,7 @@ data. .. _GridFSBucket spec: https://github.com/mongodb/specifications/blob/master/source/gridfs/gridfs-spec.rst#configurable-gridfsbucket-class - + Speeding Up Tests ----------------- @@ -229,6 +231,8 @@ This test requires MongoDB 4.2.9+ for ``blockConnection`` support in the failpoi Changelog ========= +:2022-01-10: Create legacy and unified subdirectories for new unified tests + :2021-08-27: Clarify behavior of ``useMultipleMongoses`` for ``LoadBalanced`` topologies. :2019-03-19: Add top-level ``runOn`` field to denote server version and/or diff --git a/src/test/spec/json/retryable-reads/aggregate-merge.json b/src/test/spec/json/retryable-reads/legacy/aggregate-merge.json similarity index 100% rename from src/test/spec/json/retryable-reads/aggregate-merge.json rename to src/test/spec/json/retryable-reads/legacy/aggregate-merge.json diff --git a/src/test/spec/json/retryable-reads/aggregate-merge.yml b/src/test/spec/json/retryable-reads/legacy/aggregate-merge.yml similarity index 100% rename from src/test/spec/json/retryable-reads/aggregate-merge.yml rename to src/test/spec/json/retryable-reads/legacy/aggregate-merge.yml diff --git a/src/test/spec/json/retryable-reads/aggregate-serverErrors.json b/src/test/spec/json/retryable-reads/legacy/aggregate-serverErrors.json similarity index 100% rename from src/test/spec/json/retryable-reads/aggregate-serverErrors.json rename to src/test/spec/json/retryable-reads/legacy/aggregate-serverErrors.json diff --git a/src/test/spec/json/retryable-reads/aggregate-serverErrors.yml b/src/test/spec/json/retryable-reads/legacy/aggregate-serverErrors.yml similarity index 100% rename from src/test/spec/json/retryable-reads/aggregate-serverErrors.yml rename to src/test/spec/json/retryable-reads/legacy/aggregate-serverErrors.yml diff --git a/src/test/spec/json/retryable-reads/aggregate.json b/src/test/spec/json/retryable-reads/legacy/aggregate.json similarity index 100% rename from src/test/spec/json/retryable-reads/aggregate.json rename to src/test/spec/json/retryable-reads/legacy/aggregate.json diff --git a/src/test/spec/json/retryable-reads/aggregate.yml b/src/test/spec/json/retryable-reads/legacy/aggregate.yml similarity index 100% rename from src/test/spec/json/retryable-reads/aggregate.yml rename to src/test/spec/json/retryable-reads/legacy/aggregate.yml diff --git a/src/test/spec/json/retryable-reads/changeStreams-client.watch-serverErrors.json b/src/test/spec/json/retryable-reads/legacy/changeStreams-client.watch-serverErrors.json similarity index 100% rename from src/test/spec/json/retryable-reads/changeStreams-client.watch-serverErrors.json rename to src/test/spec/json/retryable-reads/legacy/changeStreams-client.watch-serverErrors.json diff --git a/src/test/spec/json/retryable-reads/changeStreams-client.watch-serverErrors.yml b/src/test/spec/json/retryable-reads/legacy/changeStreams-client.watch-serverErrors.yml similarity index 100% rename from src/test/spec/json/retryable-reads/changeStreams-client.watch-serverErrors.yml rename to src/test/spec/json/retryable-reads/legacy/changeStreams-client.watch-serverErrors.yml diff --git a/src/test/spec/json/retryable-reads/changeStreams-client.watch.json b/src/test/spec/json/retryable-reads/legacy/changeStreams-client.watch.json similarity index 100% rename from src/test/spec/json/retryable-reads/changeStreams-client.watch.json rename to src/test/spec/json/retryable-reads/legacy/changeStreams-client.watch.json diff --git a/src/test/spec/json/retryable-reads/changeStreams-client.watch.yml b/src/test/spec/json/retryable-reads/legacy/changeStreams-client.watch.yml similarity index 100% rename from src/test/spec/json/retryable-reads/changeStreams-client.watch.yml rename to src/test/spec/json/retryable-reads/legacy/changeStreams-client.watch.yml diff --git a/src/test/spec/json/retryable-reads/changeStreams-db.coll.watch-serverErrors.json b/src/test/spec/json/retryable-reads/legacy/changeStreams-db.coll.watch-serverErrors.json similarity index 100% rename from src/test/spec/json/retryable-reads/changeStreams-db.coll.watch-serverErrors.json rename to src/test/spec/json/retryable-reads/legacy/changeStreams-db.coll.watch-serverErrors.json diff --git a/src/test/spec/json/retryable-reads/changeStreams-db.coll.watch-serverErrors.yml b/src/test/spec/json/retryable-reads/legacy/changeStreams-db.coll.watch-serverErrors.yml similarity index 100% rename from src/test/spec/json/retryable-reads/changeStreams-db.coll.watch-serverErrors.yml rename to src/test/spec/json/retryable-reads/legacy/changeStreams-db.coll.watch-serverErrors.yml diff --git a/src/test/spec/json/retryable-reads/changeStreams-db.coll.watch.json b/src/test/spec/json/retryable-reads/legacy/changeStreams-db.coll.watch.json similarity index 100% rename from src/test/spec/json/retryable-reads/changeStreams-db.coll.watch.json rename to src/test/spec/json/retryable-reads/legacy/changeStreams-db.coll.watch.json diff --git a/src/test/spec/json/retryable-reads/changeStreams-db.coll.watch.yml b/src/test/spec/json/retryable-reads/legacy/changeStreams-db.coll.watch.yml similarity index 100% rename from src/test/spec/json/retryable-reads/changeStreams-db.coll.watch.yml rename to src/test/spec/json/retryable-reads/legacy/changeStreams-db.coll.watch.yml diff --git a/src/test/spec/json/retryable-reads/changeStreams-db.watch-serverErrors.json b/src/test/spec/json/retryable-reads/legacy/changeStreams-db.watch-serverErrors.json similarity index 100% rename from src/test/spec/json/retryable-reads/changeStreams-db.watch-serverErrors.json rename to src/test/spec/json/retryable-reads/legacy/changeStreams-db.watch-serverErrors.json diff --git a/src/test/spec/json/retryable-reads/changeStreams-db.watch-serverErrors.yml b/src/test/spec/json/retryable-reads/legacy/changeStreams-db.watch-serverErrors.yml similarity index 100% rename from src/test/spec/json/retryable-reads/changeStreams-db.watch-serverErrors.yml rename to src/test/spec/json/retryable-reads/legacy/changeStreams-db.watch-serverErrors.yml diff --git a/src/test/spec/json/retryable-reads/changeStreams-db.watch.json b/src/test/spec/json/retryable-reads/legacy/changeStreams-db.watch.json similarity index 100% rename from src/test/spec/json/retryable-reads/changeStreams-db.watch.json rename to src/test/spec/json/retryable-reads/legacy/changeStreams-db.watch.json diff --git a/src/test/spec/json/retryable-reads/changeStreams-db.watch.yml b/src/test/spec/json/retryable-reads/legacy/changeStreams-db.watch.yml similarity index 100% rename from src/test/spec/json/retryable-reads/changeStreams-db.watch.yml rename to src/test/spec/json/retryable-reads/legacy/changeStreams-db.watch.yml diff --git a/src/test/spec/json/retryable-reads/count-serverErrors.json b/src/test/spec/json/retryable-reads/legacy/count-serverErrors.json similarity index 100% rename from src/test/spec/json/retryable-reads/count-serverErrors.json rename to src/test/spec/json/retryable-reads/legacy/count-serverErrors.json diff --git a/src/test/spec/json/retryable-reads/count-serverErrors.yml b/src/test/spec/json/retryable-reads/legacy/count-serverErrors.yml similarity index 100% rename from src/test/spec/json/retryable-reads/count-serverErrors.yml rename to src/test/spec/json/retryable-reads/legacy/count-serverErrors.yml diff --git a/src/test/spec/json/retryable-reads/count.json b/src/test/spec/json/retryable-reads/legacy/count.json similarity index 100% rename from src/test/spec/json/retryable-reads/count.json rename to src/test/spec/json/retryable-reads/legacy/count.json diff --git a/src/test/spec/json/retryable-reads/count.yml b/src/test/spec/json/retryable-reads/legacy/count.yml similarity index 100% rename from src/test/spec/json/retryable-reads/count.yml rename to src/test/spec/json/retryable-reads/legacy/count.yml diff --git a/src/test/spec/json/retryable-reads/countDocuments-serverErrors.json b/src/test/spec/json/retryable-reads/legacy/countDocuments-serverErrors.json similarity index 100% rename from src/test/spec/json/retryable-reads/countDocuments-serverErrors.json rename to src/test/spec/json/retryable-reads/legacy/countDocuments-serverErrors.json diff --git a/src/test/spec/json/retryable-reads/countDocuments-serverErrors.yml b/src/test/spec/json/retryable-reads/legacy/countDocuments-serverErrors.yml similarity index 100% rename from src/test/spec/json/retryable-reads/countDocuments-serverErrors.yml rename to src/test/spec/json/retryable-reads/legacy/countDocuments-serverErrors.yml diff --git a/src/test/spec/json/retryable-reads/countDocuments.json b/src/test/spec/json/retryable-reads/legacy/countDocuments.json similarity index 100% rename from src/test/spec/json/retryable-reads/countDocuments.json rename to src/test/spec/json/retryable-reads/legacy/countDocuments.json diff --git a/src/test/spec/json/retryable-reads/countDocuments.yml b/src/test/spec/json/retryable-reads/legacy/countDocuments.yml similarity index 100% rename from src/test/spec/json/retryable-reads/countDocuments.yml rename to src/test/spec/json/retryable-reads/legacy/countDocuments.yml diff --git a/src/test/spec/json/retryable-reads/distinct-serverErrors.json b/src/test/spec/json/retryable-reads/legacy/distinct-serverErrors.json similarity index 100% rename from src/test/spec/json/retryable-reads/distinct-serverErrors.json rename to src/test/spec/json/retryable-reads/legacy/distinct-serverErrors.json diff --git a/src/test/spec/json/retryable-reads/distinct-serverErrors.yml b/src/test/spec/json/retryable-reads/legacy/distinct-serverErrors.yml similarity index 100% rename from src/test/spec/json/retryable-reads/distinct-serverErrors.yml rename to src/test/spec/json/retryable-reads/legacy/distinct-serverErrors.yml diff --git a/src/test/spec/json/retryable-reads/distinct.json b/src/test/spec/json/retryable-reads/legacy/distinct.json similarity index 100% rename from src/test/spec/json/retryable-reads/distinct.json rename to src/test/spec/json/retryable-reads/legacy/distinct.json diff --git a/src/test/spec/json/retryable-reads/distinct.yml b/src/test/spec/json/retryable-reads/legacy/distinct.yml similarity index 100% rename from src/test/spec/json/retryable-reads/distinct.yml rename to src/test/spec/json/retryable-reads/legacy/distinct.yml diff --git a/src/test/spec/json/retryable-reads/estimatedDocumentCount-4.9.json b/src/test/spec/json/retryable-reads/legacy/estimatedDocumentCount-4.9.json similarity index 100% rename from src/test/spec/json/retryable-reads/estimatedDocumentCount-4.9.json rename to src/test/spec/json/retryable-reads/legacy/estimatedDocumentCount-4.9.json diff --git a/src/test/spec/json/retryable-reads/estimatedDocumentCount-4.9.yml b/src/test/spec/json/retryable-reads/legacy/estimatedDocumentCount-4.9.yml similarity index 100% rename from src/test/spec/json/retryable-reads/estimatedDocumentCount-4.9.yml rename to src/test/spec/json/retryable-reads/legacy/estimatedDocumentCount-4.9.yml diff --git a/src/test/spec/json/retryable-reads/estimatedDocumentCount-pre4.9.json b/src/test/spec/json/retryable-reads/legacy/estimatedDocumentCount-pre4.9.json similarity index 100% rename from src/test/spec/json/retryable-reads/estimatedDocumentCount-pre4.9.json rename to src/test/spec/json/retryable-reads/legacy/estimatedDocumentCount-pre4.9.json diff --git a/src/test/spec/json/retryable-reads/estimatedDocumentCount-pre4.9.yml b/src/test/spec/json/retryable-reads/legacy/estimatedDocumentCount-pre4.9.yml similarity index 100% rename from src/test/spec/json/retryable-reads/estimatedDocumentCount-pre4.9.yml rename to src/test/spec/json/retryable-reads/legacy/estimatedDocumentCount-pre4.9.yml diff --git a/src/test/spec/json/retryable-reads/estimatedDocumentCount-serverErrors-4.9.json b/src/test/spec/json/retryable-reads/legacy/estimatedDocumentCount-serverErrors-4.9.json similarity index 98% rename from src/test/spec/json/retryable-reads/estimatedDocumentCount-serverErrors-4.9.json rename to src/test/spec/json/retryable-reads/legacy/estimatedDocumentCount-serverErrors-4.9.json index af4dc52ea..756b02b3a 100644 --- a/src/test/spec/json/retryable-reads/estimatedDocumentCount-serverErrors-4.9.json +++ b/src/test/spec/json/retryable-reads/legacy/estimatedDocumentCount-serverErrors-4.9.json @@ -158,7 +158,7 @@ ] }, { - "description": "EstimatedDocumentCount succeeds after NotMaster", + "description": "EstimatedDocumentCount succeeds after NotWritablePrimary", "failPoint": { "configureFailPoint": "failCommand", "mode": { @@ -228,7 +228,7 @@ ] }, { - "description": "EstimatedDocumentCount succeeds after NotMasterNoSlaveOk", + "description": "EstimatedDocumentCount succeeds after NotPrimaryNoSecondaryOk", "failPoint": { "configureFailPoint": "failCommand", "mode": { @@ -298,7 +298,7 @@ ] }, { - "description": "EstimatedDocumentCount succeeds after NotMasterOrSecondary", + "description": "EstimatedDocumentCount succeeds after NotPrimaryOrSecondary", "failPoint": { "configureFailPoint": "failCommand", "mode": { @@ -788,7 +788,7 @@ ] }, { - "description": "EstimatedDocumentCount fails after two NotMaster errors", + "description": "EstimatedDocumentCount fails after two NotWritablePrimary errors", "failPoint": { "configureFailPoint": "failCommand", "mode": { @@ -858,7 +858,7 @@ ] }, { - "description": "EstimatedDocumentCount fails after NotMaster when retryReads is false", + "description": "EstimatedDocumentCount fails after NotWritablePrimary when retryReads is false", "clientOptions": { "retryReads": false }, diff --git a/src/test/spec/json/retryable-reads/estimatedDocumentCount-serverErrors-4.9.yml b/src/test/spec/json/retryable-reads/legacy/estimatedDocumentCount-serverErrors-4.9.yml similarity index 93% rename from src/test/spec/json/retryable-reads/estimatedDocumentCount-serverErrors-4.9.yml rename to src/test/spec/json/retryable-reads/legacy/estimatedDocumentCount-serverErrors-4.9.yml index f08e740da..1a73d5431 100644 --- a/src/test/spec/json/retryable-reads/estimatedDocumentCount-serverErrors-4.9.yml +++ b/src/test/spec/json/retryable-reads/legacy/estimatedDocumentCount-serverErrors-4.9.yml @@ -41,7 +41,7 @@ tests: - *retryable_command_started_event - *retryable_command_started_event - - description: "EstimatedDocumentCount succeeds after NotMaster" + description: "EstimatedDocumentCount succeeds after NotWritablePrimary" failPoint: <<: *failCommand_failPoint data: { failCommands: [aggregate], errorCode: 10107 } @@ -50,7 +50,7 @@ tests: - *retryable_command_started_event - *retryable_command_started_event - - description: "EstimatedDocumentCount succeeds after NotMasterNoSlaveOk" + description: "EstimatedDocumentCount succeeds after NotPrimaryNoSecondaryOk" failPoint: <<: *failCommand_failPoint data: { failCommands: [aggregate], errorCode: 13435 } @@ -59,7 +59,7 @@ tests: - *retryable_command_started_event - *retryable_command_started_event - - description: "EstimatedDocumentCount succeeds after NotMasterOrSecondary" + description: "EstimatedDocumentCount succeeds after NotPrimaryOrSecondary" failPoint: <<: *failCommand_failPoint data: { failCommands: [aggregate], errorCode: 13436 } @@ -122,7 +122,7 @@ tests: - *retryable_command_started_event - *retryable_command_started_event - - description: "EstimatedDocumentCount fails after two NotMaster errors" + description: "EstimatedDocumentCount fails after two NotWritablePrimary errors" failPoint: <<: *failCommand_failPoint mode: { times: 2 } @@ -135,7 +135,7 @@ tests: - *retryable_command_started_event - *retryable_command_started_event - - description: "EstimatedDocumentCount fails after NotMaster when retryReads is false" + description: "EstimatedDocumentCount fails after NotWritablePrimary when retryReads is false" clientOptions: retryReads: false failPoint: diff --git a/src/test/spec/json/retryable-reads/estimatedDocumentCount-serverErrors-pre4.9.json b/src/test/spec/json/retryable-reads/legacy/estimatedDocumentCount-serverErrors-pre4.9.json similarity index 96% rename from src/test/spec/json/retryable-reads/estimatedDocumentCount-serverErrors-pre4.9.json rename to src/test/spec/json/retryable-reads/legacy/estimatedDocumentCount-serverErrors-pre4.9.json index c11e609cd..0b9a2615d 100644 --- a/src/test/spec/json/retryable-reads/estimatedDocumentCount-serverErrors-pre4.9.json +++ b/src/test/spec/json/retryable-reads/legacy/estimatedDocumentCount-serverErrors-pre4.9.json @@ -110,7 +110,7 @@ ] }, { - "description": "EstimatedDocumentCount succeeds after NotMaster", + "description": "EstimatedDocumentCount succeeds after NotWritablePrimary", "failPoint": { "configureFailPoint": "failCommand", "mode": { @@ -150,7 +150,7 @@ ] }, { - "description": "EstimatedDocumentCount succeeds after NotMasterNoSlaveOk", + "description": "EstimatedDocumentCount succeeds after NotPrimaryNoSecondaryOk", "failPoint": { "configureFailPoint": "failCommand", "mode": { @@ -190,7 +190,7 @@ ] }, { - "description": "EstimatedDocumentCount succeeds after NotMasterOrSecondary", + "description": "EstimatedDocumentCount succeeds after NotPrimaryOrSecondary", "failPoint": { "configureFailPoint": "failCommand", "mode": { @@ -470,7 +470,7 @@ ] }, { - "description": "EstimatedDocumentCount fails after two NotMaster errors", + "description": "EstimatedDocumentCount fails after two NotWritablePrimary errors", "failPoint": { "configureFailPoint": "failCommand", "mode": { @@ -510,7 +510,7 @@ ] }, { - "description": "EstimatedDocumentCount fails after NotMaster when retryReads is false", + "description": "EstimatedDocumentCount fails after NotWritablePrimary when retryReads is false", "clientOptions": { "retryReads": false }, diff --git a/src/test/spec/json/retryable-reads/estimatedDocumentCount-serverErrors-pre4.9.yml b/src/test/spec/json/retryable-reads/legacy/estimatedDocumentCount-serverErrors-pre4.9.yml similarity index 93% rename from src/test/spec/json/retryable-reads/estimatedDocumentCount-serverErrors-pre4.9.yml rename to src/test/spec/json/retryable-reads/legacy/estimatedDocumentCount-serverErrors-pre4.9.yml index 0f0dcc656..99c343b88 100644 --- a/src/test/spec/json/retryable-reads/estimatedDocumentCount-serverErrors-pre4.9.yml +++ b/src/test/spec/json/retryable-reads/legacy/estimatedDocumentCount-serverErrors-pre4.9.yml @@ -45,7 +45,7 @@ tests: - *retryable_command_started_event - *retryable_command_started_event - - description: "EstimatedDocumentCount succeeds after NotMaster" + description: "EstimatedDocumentCount succeeds after NotWritablePrimary" failPoint: <<: *failCommand_failPoint data: { failCommands: [count], errorCode: 10107 } @@ -54,7 +54,7 @@ tests: - *retryable_command_started_event - *retryable_command_started_event - - description: "EstimatedDocumentCount succeeds after NotMasterNoSlaveOk" + description: "EstimatedDocumentCount succeeds after NotPrimaryNoSecondaryOk" failPoint: <<: *failCommand_failPoint data: { failCommands: [count], errorCode: 13435 } @@ -63,7 +63,7 @@ tests: - *retryable_command_started_event - *retryable_command_started_event - - description: "EstimatedDocumentCount succeeds after NotMasterOrSecondary" + description: "EstimatedDocumentCount succeeds after NotPrimaryOrSecondary" failPoint: <<: *failCommand_failPoint data: { failCommands: [count], errorCode: 13436 } @@ -126,7 +126,7 @@ tests: - *retryable_command_started_event - *retryable_command_started_event - - description: "EstimatedDocumentCount fails after two NotMaster errors" + description: "EstimatedDocumentCount fails after two NotWritablePrimary errors" failPoint: <<: *failCommand_failPoint mode: { times: 2 } @@ -139,7 +139,7 @@ tests: - *retryable_command_started_event - *retryable_command_started_event - - description: "EstimatedDocumentCount fails after NotMaster when retryReads is false" + description: "EstimatedDocumentCount fails after NotWritablePrimary when retryReads is false" clientOptions: retryReads: false failPoint: diff --git a/src/test/spec/json/retryable-reads/find-serverErrors.json b/src/test/spec/json/retryable-reads/legacy/find-serverErrors.json similarity index 100% rename from src/test/spec/json/retryable-reads/find-serverErrors.json rename to src/test/spec/json/retryable-reads/legacy/find-serverErrors.json diff --git a/src/test/spec/json/retryable-reads/find-serverErrors.yml b/src/test/spec/json/retryable-reads/legacy/find-serverErrors.yml similarity index 100% rename from src/test/spec/json/retryable-reads/find-serverErrors.yml rename to src/test/spec/json/retryable-reads/legacy/find-serverErrors.yml diff --git a/src/test/spec/json/retryable-reads/find.json b/src/test/spec/json/retryable-reads/legacy/find.json similarity index 100% rename from src/test/spec/json/retryable-reads/find.json rename to src/test/spec/json/retryable-reads/legacy/find.json diff --git a/src/test/spec/json/retryable-reads/find.yml b/src/test/spec/json/retryable-reads/legacy/find.yml similarity index 100% rename from src/test/spec/json/retryable-reads/find.yml rename to src/test/spec/json/retryable-reads/legacy/find.yml diff --git a/src/test/spec/json/retryable-reads/findOne-serverErrors.json b/src/test/spec/json/retryable-reads/legacy/findOne-serverErrors.json similarity index 100% rename from src/test/spec/json/retryable-reads/findOne-serverErrors.json rename to src/test/spec/json/retryable-reads/legacy/findOne-serverErrors.json diff --git a/src/test/spec/json/retryable-reads/findOne-serverErrors.yml b/src/test/spec/json/retryable-reads/legacy/findOne-serverErrors.yml similarity index 100% rename from src/test/spec/json/retryable-reads/findOne-serverErrors.yml rename to src/test/spec/json/retryable-reads/legacy/findOne-serverErrors.yml diff --git a/src/test/spec/json/retryable-reads/findOne.json b/src/test/spec/json/retryable-reads/legacy/findOne.json similarity index 100% rename from src/test/spec/json/retryable-reads/findOne.json rename to src/test/spec/json/retryable-reads/legacy/findOne.json diff --git a/src/test/spec/json/retryable-reads/findOne.yml b/src/test/spec/json/retryable-reads/legacy/findOne.yml similarity index 100% rename from src/test/spec/json/retryable-reads/findOne.yml rename to src/test/spec/json/retryable-reads/legacy/findOne.yml diff --git a/src/test/spec/json/retryable-reads/gridfs-download-serverErrors.json b/src/test/spec/json/retryable-reads/legacy/gridfs-download-serverErrors.json similarity index 100% rename from src/test/spec/json/retryable-reads/gridfs-download-serverErrors.json rename to src/test/spec/json/retryable-reads/legacy/gridfs-download-serverErrors.json diff --git a/src/test/spec/json/retryable-reads/gridfs-download-serverErrors.yml b/src/test/spec/json/retryable-reads/legacy/gridfs-download-serverErrors.yml similarity index 100% rename from src/test/spec/json/retryable-reads/gridfs-download-serverErrors.yml rename to src/test/spec/json/retryable-reads/legacy/gridfs-download-serverErrors.yml diff --git a/src/test/spec/json/retryable-reads/gridfs-download.json b/src/test/spec/json/retryable-reads/legacy/gridfs-download.json similarity index 100% rename from src/test/spec/json/retryable-reads/gridfs-download.json rename to src/test/spec/json/retryable-reads/legacy/gridfs-download.json diff --git a/src/test/spec/json/retryable-reads/gridfs-download.yml b/src/test/spec/json/retryable-reads/legacy/gridfs-download.yml similarity index 100% rename from src/test/spec/json/retryable-reads/gridfs-download.yml rename to src/test/spec/json/retryable-reads/legacy/gridfs-download.yml diff --git a/src/test/spec/json/retryable-reads/gridfs-downloadByName-serverErrors.json b/src/test/spec/json/retryable-reads/legacy/gridfs-downloadByName-serverErrors.json similarity index 100% rename from src/test/spec/json/retryable-reads/gridfs-downloadByName-serverErrors.json rename to src/test/spec/json/retryable-reads/legacy/gridfs-downloadByName-serverErrors.json diff --git a/src/test/spec/json/retryable-reads/gridfs-downloadByName-serverErrors.yml b/src/test/spec/json/retryable-reads/legacy/gridfs-downloadByName-serverErrors.yml similarity index 100% rename from src/test/spec/json/retryable-reads/gridfs-downloadByName-serverErrors.yml rename to src/test/spec/json/retryable-reads/legacy/gridfs-downloadByName-serverErrors.yml diff --git a/src/test/spec/json/retryable-reads/gridfs-downloadByName.json b/src/test/spec/json/retryable-reads/legacy/gridfs-downloadByName.json similarity index 100% rename from src/test/spec/json/retryable-reads/gridfs-downloadByName.json rename to src/test/spec/json/retryable-reads/legacy/gridfs-downloadByName.json diff --git a/src/test/spec/json/retryable-reads/gridfs-downloadByName.yml b/src/test/spec/json/retryable-reads/legacy/gridfs-downloadByName.yml similarity index 100% rename from src/test/spec/json/retryable-reads/gridfs-downloadByName.yml rename to src/test/spec/json/retryable-reads/legacy/gridfs-downloadByName.yml diff --git a/src/test/spec/json/retryable-reads/listCollectionNames-serverErrors.json b/src/test/spec/json/retryable-reads/legacy/listCollectionNames-serverErrors.json similarity index 100% rename from src/test/spec/json/retryable-reads/listCollectionNames-serverErrors.json rename to src/test/spec/json/retryable-reads/legacy/listCollectionNames-serverErrors.json diff --git a/src/test/spec/json/retryable-reads/listCollectionNames-serverErrors.yml b/src/test/spec/json/retryable-reads/legacy/listCollectionNames-serverErrors.yml similarity index 100% rename from src/test/spec/json/retryable-reads/listCollectionNames-serverErrors.yml rename to src/test/spec/json/retryable-reads/legacy/listCollectionNames-serverErrors.yml diff --git a/src/test/spec/json/retryable-reads/listCollectionNames.json b/src/test/spec/json/retryable-reads/legacy/listCollectionNames.json similarity index 100% rename from src/test/spec/json/retryable-reads/listCollectionNames.json rename to src/test/spec/json/retryable-reads/legacy/listCollectionNames.json diff --git a/src/test/spec/json/retryable-reads/listCollectionNames.yml b/src/test/spec/json/retryable-reads/legacy/listCollectionNames.yml similarity index 100% rename from src/test/spec/json/retryable-reads/listCollectionNames.yml rename to src/test/spec/json/retryable-reads/legacy/listCollectionNames.yml diff --git a/src/test/spec/json/retryable-reads/listCollectionObjects-serverErrors.json b/src/test/spec/json/retryable-reads/legacy/listCollectionObjects-serverErrors.json similarity index 100% rename from src/test/spec/json/retryable-reads/listCollectionObjects-serverErrors.json rename to src/test/spec/json/retryable-reads/legacy/listCollectionObjects-serverErrors.json diff --git a/src/test/spec/json/retryable-reads/listCollectionObjects-serverErrors.yml b/src/test/spec/json/retryable-reads/legacy/listCollectionObjects-serverErrors.yml similarity index 100% rename from src/test/spec/json/retryable-reads/listCollectionObjects-serverErrors.yml rename to src/test/spec/json/retryable-reads/legacy/listCollectionObjects-serverErrors.yml diff --git a/src/test/spec/json/retryable-reads/listCollectionObjects.json b/src/test/spec/json/retryable-reads/legacy/listCollectionObjects.json similarity index 100% rename from src/test/spec/json/retryable-reads/listCollectionObjects.json rename to src/test/spec/json/retryable-reads/legacy/listCollectionObjects.json diff --git a/src/test/spec/json/retryable-reads/listCollectionObjects.yml b/src/test/spec/json/retryable-reads/legacy/listCollectionObjects.yml similarity index 100% rename from src/test/spec/json/retryable-reads/listCollectionObjects.yml rename to src/test/spec/json/retryable-reads/legacy/listCollectionObjects.yml diff --git a/src/test/spec/json/retryable-reads/listCollections-serverErrors.json b/src/test/spec/json/retryable-reads/legacy/listCollections-serverErrors.json similarity index 100% rename from src/test/spec/json/retryable-reads/listCollections-serverErrors.json rename to src/test/spec/json/retryable-reads/legacy/listCollections-serverErrors.json diff --git a/src/test/spec/json/retryable-reads/listCollections-serverErrors.yml b/src/test/spec/json/retryable-reads/legacy/listCollections-serverErrors.yml similarity index 100% rename from src/test/spec/json/retryable-reads/listCollections-serverErrors.yml rename to src/test/spec/json/retryable-reads/legacy/listCollections-serverErrors.yml diff --git a/src/test/spec/json/retryable-reads/listCollections.json b/src/test/spec/json/retryable-reads/legacy/listCollections.json similarity index 100% rename from src/test/spec/json/retryable-reads/listCollections.json rename to src/test/spec/json/retryable-reads/legacy/listCollections.json diff --git a/src/test/spec/json/retryable-reads/listCollections.yml b/src/test/spec/json/retryable-reads/legacy/listCollections.yml similarity index 100% rename from src/test/spec/json/retryable-reads/listCollections.yml rename to src/test/spec/json/retryable-reads/legacy/listCollections.yml diff --git a/src/test/spec/json/retryable-reads/listDatabaseNames-serverErrors.json b/src/test/spec/json/retryable-reads/legacy/listDatabaseNames-serverErrors.json similarity index 100% rename from src/test/spec/json/retryable-reads/listDatabaseNames-serverErrors.json rename to src/test/spec/json/retryable-reads/legacy/listDatabaseNames-serverErrors.json diff --git a/src/test/spec/json/retryable-reads/listDatabaseNames-serverErrors.yml b/src/test/spec/json/retryable-reads/legacy/listDatabaseNames-serverErrors.yml similarity index 100% rename from src/test/spec/json/retryable-reads/listDatabaseNames-serverErrors.yml rename to src/test/spec/json/retryable-reads/legacy/listDatabaseNames-serverErrors.yml diff --git a/src/test/spec/json/retryable-reads/listDatabaseNames.json b/src/test/spec/json/retryable-reads/legacy/listDatabaseNames.json similarity index 100% rename from src/test/spec/json/retryable-reads/listDatabaseNames.json rename to src/test/spec/json/retryable-reads/legacy/listDatabaseNames.json diff --git a/src/test/spec/json/retryable-reads/listDatabaseNames.yml b/src/test/spec/json/retryable-reads/legacy/listDatabaseNames.yml similarity index 100% rename from src/test/spec/json/retryable-reads/listDatabaseNames.yml rename to src/test/spec/json/retryable-reads/legacy/listDatabaseNames.yml diff --git a/src/test/spec/json/retryable-reads/listDatabaseObjects-serverErrors.json b/src/test/spec/json/retryable-reads/legacy/listDatabaseObjects-serverErrors.json similarity index 100% rename from src/test/spec/json/retryable-reads/listDatabaseObjects-serverErrors.json rename to src/test/spec/json/retryable-reads/legacy/listDatabaseObjects-serverErrors.json diff --git a/src/test/spec/json/retryable-reads/listDatabaseObjects-serverErrors.yml b/src/test/spec/json/retryable-reads/legacy/listDatabaseObjects-serverErrors.yml similarity index 100% rename from src/test/spec/json/retryable-reads/listDatabaseObjects-serverErrors.yml rename to src/test/spec/json/retryable-reads/legacy/listDatabaseObjects-serverErrors.yml diff --git a/src/test/spec/json/retryable-reads/listDatabaseObjects.json b/src/test/spec/json/retryable-reads/legacy/listDatabaseObjects.json similarity index 100% rename from src/test/spec/json/retryable-reads/listDatabaseObjects.json rename to src/test/spec/json/retryable-reads/legacy/listDatabaseObjects.json diff --git a/src/test/spec/json/retryable-reads/listDatabaseObjects.yml b/src/test/spec/json/retryable-reads/legacy/listDatabaseObjects.yml similarity index 100% rename from src/test/spec/json/retryable-reads/listDatabaseObjects.yml rename to src/test/spec/json/retryable-reads/legacy/listDatabaseObjects.yml diff --git a/src/test/spec/json/retryable-reads/listDatabases-serverErrors.json b/src/test/spec/json/retryable-reads/legacy/listDatabases-serverErrors.json similarity index 100% rename from src/test/spec/json/retryable-reads/listDatabases-serverErrors.json rename to src/test/spec/json/retryable-reads/legacy/listDatabases-serverErrors.json diff --git a/src/test/spec/json/retryable-reads/listDatabases-serverErrors.yml b/src/test/spec/json/retryable-reads/legacy/listDatabases-serverErrors.yml similarity index 100% rename from src/test/spec/json/retryable-reads/listDatabases-serverErrors.yml rename to src/test/spec/json/retryable-reads/legacy/listDatabases-serverErrors.yml diff --git a/src/test/spec/json/retryable-reads/listDatabases.json b/src/test/spec/json/retryable-reads/legacy/listDatabases.json similarity index 100% rename from src/test/spec/json/retryable-reads/listDatabases.json rename to src/test/spec/json/retryable-reads/legacy/listDatabases.json diff --git a/src/test/spec/json/retryable-reads/listDatabases.yml b/src/test/spec/json/retryable-reads/legacy/listDatabases.yml similarity index 100% rename from src/test/spec/json/retryable-reads/listDatabases.yml rename to src/test/spec/json/retryable-reads/legacy/listDatabases.yml diff --git a/src/test/spec/json/retryable-reads/listIndexNames-serverErrors.json b/src/test/spec/json/retryable-reads/legacy/listIndexNames-serverErrors.json similarity index 100% rename from src/test/spec/json/retryable-reads/listIndexNames-serverErrors.json rename to src/test/spec/json/retryable-reads/legacy/listIndexNames-serverErrors.json diff --git a/src/test/spec/json/retryable-reads/listIndexNames-serverErrors.yml b/src/test/spec/json/retryable-reads/legacy/listIndexNames-serverErrors.yml similarity index 100% rename from src/test/spec/json/retryable-reads/listIndexNames-serverErrors.yml rename to src/test/spec/json/retryable-reads/legacy/listIndexNames-serverErrors.yml diff --git a/src/test/spec/json/retryable-reads/listIndexNames.json b/src/test/spec/json/retryable-reads/legacy/listIndexNames.json similarity index 100% rename from src/test/spec/json/retryable-reads/listIndexNames.json rename to src/test/spec/json/retryable-reads/legacy/listIndexNames.json diff --git a/src/test/spec/json/retryable-reads/listIndexNames.yml b/src/test/spec/json/retryable-reads/legacy/listIndexNames.yml similarity index 100% rename from src/test/spec/json/retryable-reads/listIndexNames.yml rename to src/test/spec/json/retryable-reads/legacy/listIndexNames.yml diff --git a/src/test/spec/json/retryable-reads/listIndexes-serverErrors.json b/src/test/spec/json/retryable-reads/legacy/listIndexes-serverErrors.json similarity index 100% rename from src/test/spec/json/retryable-reads/listIndexes-serverErrors.json rename to src/test/spec/json/retryable-reads/legacy/listIndexes-serverErrors.json diff --git a/src/test/spec/json/retryable-reads/listIndexes-serverErrors.yml b/src/test/spec/json/retryable-reads/legacy/listIndexes-serverErrors.yml similarity index 100% rename from src/test/spec/json/retryable-reads/listIndexes-serverErrors.yml rename to src/test/spec/json/retryable-reads/legacy/listIndexes-serverErrors.yml diff --git a/src/test/spec/json/retryable-reads/listIndexes.json b/src/test/spec/json/retryable-reads/legacy/listIndexes.json similarity index 100% rename from src/test/spec/json/retryable-reads/listIndexes.json rename to src/test/spec/json/retryable-reads/legacy/listIndexes.json diff --git a/src/test/spec/json/retryable-reads/listIndexes.yml b/src/test/spec/json/retryable-reads/legacy/listIndexes.yml similarity index 100% rename from src/test/spec/json/retryable-reads/listIndexes.yml rename to src/test/spec/json/retryable-reads/legacy/listIndexes.yml diff --git a/src/test/spec/json/retryable-reads/mapReduce.json b/src/test/spec/json/retryable-reads/legacy/mapReduce.json similarity index 100% rename from src/test/spec/json/retryable-reads/mapReduce.json rename to src/test/spec/json/retryable-reads/legacy/mapReduce.json diff --git a/src/test/spec/json/retryable-reads/mapReduce.yml b/src/test/spec/json/retryable-reads/legacy/mapReduce.yml similarity index 100% rename from src/test/spec/json/retryable-reads/mapReduce.yml rename to src/test/spec/json/retryable-reads/legacy/mapReduce.yml diff --git a/src/test/spec/json/retryable-reads/unified/handshakeError.json b/src/test/spec/json/retryable-reads/unified/handshakeError.json new file mode 100644 index 000000000..2cf1d173f --- /dev/null +++ b/src/test/spec/json/retryable-reads/unified/handshakeError.json @@ -0,0 +1,257 @@ +{ + "description": "retryable reads handshake failures", + "schemaVersion": "1.3", + "runOnRequirements": [ + { + "minServerVersion": "4.2", + "topologies": [ + "replicaset", + "sharded", + "load-balanced" + ], + "auth": true + } + ], + "createEntities": [ + { + "client": { + "id": "client0", + "useMultipleMongoses": false, + "observeEvents": [ + "commandStartedEvent", + "connectionCheckOutStartedEvent" + ] + } + }, + { + "database": { + "id": "database0", + "client": "client0", + "databaseName": "retryable-handshake-tests" + } + }, + { + "collection": { + "id": "collection0", + "database": "database0", + "collectionName": "coll" + } + } + ], + "initialData": [ + { + "collectionName": "coll", + "databaseName": "retryable-handshake-tests", + "documents": [ + { + "_id": 1, + "x": 11 + }, + { + "_id": 2, + "x": 22 + }, + { + "_id": 3, + "x": 33 + } + ] + } + ], + "tests": [ + { + "description": "find succeeds after retryable handshake network error", + "operations": [ + { + "name": "failPoint", + "object": "testRunner", + "arguments": { + "client": "client0", + "failPoint": { + "configureFailPoint": "failCommand", + "mode": { + "times": 2 + }, + "data": { + "failCommands": [ + "saslContinue", + "ping" + ], + "closeConnection": true + } + } + } + }, + { + "name": "runCommand", + "object": "database0", + "arguments": { + "commandName": "ping", + "command": { + "ping": 1 + } + }, + "expectError": { + "isError": true + } + }, + { + "name": "find", + "object": "collection0", + "arguments": { + "filter": { + "_id": 2 + } + }, + "expectResult": [ + { + "_id": 2, + "x": 22 + } + ] + } + ], + "expectEvents": [ + { + "client": "client0", + "eventType": "cmap", + "events": [ + { + "connectionCheckOutStartedEvent": {} + }, + { + "connectionCheckOutStartedEvent": {} + }, + { + "connectionCheckOutStartedEvent": {} + }, + { + "connectionCheckOutStartedEvent": {} + } + ] + }, + { + "client": "client0", + "events": [ + { + "commandStartedEvent": { + "command": { + "ping": 1 + }, + "databaseName": "retryable-handshake-tests" + } + }, + { + "commandStartedEvent": { + "command": { + "find": "coll", + "filter": { + "_id": 2 + } + }, + "databaseName": "retryable-handshake-tests" + } + } + ] + } + ] + }, + { + "description": "find succeeds after retryable handshake network error (ShutdownInProgress)", + "operations": [ + { + "name": "failPoint", + "object": "testRunner", + "arguments": { + "client": "client0", + "failPoint": { + "configureFailPoint": "failCommand", + "mode": { + "times": 2 + }, + "data": { + "failCommands": [ + "saslContinue", + "ping" + ], + "errorCode": 91 + } + } + } + }, + { + "name": "runCommand", + "object": "database0", + "arguments": { + "commandName": "ping", + "command": { + "ping": 1 + } + }, + "expectError": { + "isError": true + } + }, + { + "name": "find", + "object": "collection0", + "arguments": { + "filter": { + "_id": 2 + } + }, + "expectResult": [ + { + "_id": 2, + "x": 22 + } + ] + } + ], + "expectEvents": [ + { + "client": "client0", + "eventType": "cmap", + "events": [ + { + "connectionCheckOutStartedEvent": {} + }, + { + "connectionCheckOutStartedEvent": {} + }, + { + "connectionCheckOutStartedEvent": {} + }, + { + "connectionCheckOutStartedEvent": {} + } + ] + }, + { + "client": "client0", + "events": [ + { + "commandStartedEvent": { + "command": { + "ping": 1 + }, + "databaseName": "retryable-handshake-tests" + } + }, + { + "commandStartedEvent": { + "command": { + "find": "coll", + "filter": { + "_id": 2 + } + }, + "databaseName": "retryable-handshake-tests" + } + } + ] + } + ] + } + ] +} diff --git a/src/test/spec/json/retryable-reads/unified/handshakeError.yml b/src/test/spec/json/retryable-reads/unified/handshakeError.yml new file mode 100644 index 000000000..90e6947dd --- /dev/null +++ b/src/test/spec/json/retryable-reads/unified/handshakeError.yml @@ -0,0 +1,129 @@ +description: "retryable reads handshake failures" + +schemaVersion: "1.3" + +runOnRequirements: + - minServerVersion: "4.2" + topologies: [replicaset, sharded, load-balanced] + auth: true + +createEntities: + - client: + id: &client0 client0 + useMultipleMongoses: false + observeEvents: [commandStartedEvent, connectionCheckOutStartedEvent] + - database: + id: &database0 database0 + client: *client0 + databaseName: &databaseName retryable-handshake-tests + - collection: + id: &collection0 collection0 + database: *database0 + collectionName: &collectionName coll + +initialData: + - collectionName: *collectionName + databaseName: *databaseName + documents: + - { _id: 1, x: 11 } + - { _id: 2, x: 22 } + - { _id: 3, x: 33 } + +tests: + - description: "find succeeds after retryable handshake network error" + operations: + - name: failPoint # fail the next connection establishment + object: testRunner + arguments: + client: *client0 + failPoint: + configureFailPoint: failCommand + mode: { times: 2 } + data: + # use saslContinue here to avoid SDAM errors + # this failPoint itself will create a usable connection in the connection pool + # so we run a ping (that also fails) in order to discard the connection + # before testing our read operation "find" + failCommands: [saslContinue, ping] + closeConnection: true + + - name: runCommand + object: *database0 + arguments: + commandName: ping + command: { ping: 1 } + expectError: + isError: true + + - name: find + object: *collection0 + arguments: + filter: { _id: 2 } + expectResult: [{ _id: 2, x: 22 }] + + expectEvents: + - client: *client0 + eventType: cmap + events: + - { connectionCheckOutStartedEvent: {} } + - { connectionCheckOutStartedEvent: {} } + - { connectionCheckOutStartedEvent: {} } + - { connectionCheckOutStartedEvent: {} } + - client: *client0 + events: + - commandStartedEvent: + command: + ping: 1 + databaseName: *databaseName + - commandStartedEvent: + command: + find: *collectionName + filter: { _id: 2 } + databaseName: *databaseName + + - description: "find succeeds after retryable handshake network error (ShutdownInProgress)" + operations: + - name: failPoint # fail the next connection establishment + object: testRunner + arguments: + client: *client0 + failPoint: + configureFailPoint: failCommand + mode: { times: 2 } + data: + failCommands: [saslContinue, ping] + errorCode: 91 # ShutdownInProgress + + - name: runCommand + object: *database0 + arguments: + commandName: ping + command: { ping: 1 } + expectError: + isError: true + + - name: find + object: *collection0 + arguments: + filter: { _id: 2 } + expectResult: [{ _id: 2, x: 22 }] + + expectEvents: + - client: *client0 + eventType: cmap + events: + - { connectionCheckOutStartedEvent: {} } + - { connectionCheckOutStartedEvent: {} } + - { connectionCheckOutStartedEvent: {} } + - { connectionCheckOutStartedEvent: {} } + - client: *client0 + events: + - commandStartedEvent: + command: + ping: 1 + databaseName: *databaseName + - commandStartedEvent: + command: + find: *collectionName + filter: { _id: 2 } + databaseName: *databaseName diff --git a/src/test/spec/json/retryable-writes/unified/handshakeError.json b/src/test/spec/json/retryable-writes/unified/handshakeError.json new file mode 100644 index 000000000..6d6b4ac49 --- /dev/null +++ b/src/test/spec/json/retryable-writes/unified/handshakeError.json @@ -0,0 +1,279 @@ +{ + "description": "retryable writes handshake failures", + "schemaVersion": "1.3", + "runOnRequirements": [ + { + "minServerVersion": "4.2", + "topologies": [ + "replicaset", + "sharded", + "load-balanced" + ], + "auth": true + } + ], + "createEntities": [ + { + "client": { + "id": "client0", + "useMultipleMongoses": false, + "observeEvents": [ + "commandStartedEvent", + "connectionCheckOutStartedEvent" + ] + } + }, + { + "database": { + "id": "database0", + "client": "client0", + "databaseName": "retryable-handshake-tests" + } + }, + { + "collection": { + "id": "collection0", + "database": "database0", + "collectionName": "coll" + } + } + ], + "initialData": [ + { + "collectionName": "coll", + "databaseName": "retryable-handshake-tests", + "documents": [ + { + "_id": 1, + "x": 11 + } + ] + } + ], + "tests": [ + { + "description": "InsertOne succeeds after retryable handshake error", + "operations": [ + { + "name": "failPoint", + "object": "testRunner", + "arguments": { + "client": "client0", + "failPoint": { + "configureFailPoint": "failCommand", + "mode": { + "times": 2 + }, + "data": { + "failCommands": [ + "saslContinue", + "ping" + ], + "closeConnection": true + } + } + } + }, + { + "name": "runCommand", + "object": "database0", + "arguments": { + "commandName": "ping", + "command": { + "ping": 1 + } + }, + "expectError": { + "isError": true + } + }, + { + "name": "insertOne", + "object": "collection0", + "arguments": { + "document": { + "_id": 2, + "x": 22 + } + } + } + ], + "expectEvents": [ + { + "client": "client0", + "eventType": "cmap", + "events": [ + { + "connectionCheckOutStartedEvent": {} + }, + { + "connectionCheckOutStartedEvent": {} + }, + { + "connectionCheckOutStartedEvent": {} + }, + { + "connectionCheckOutStartedEvent": {} + } + ] + }, + { + "client": "client0", + "events": [ + { + "commandStartedEvent": { + "command": { + "ping": 1 + }, + "databaseName": "retryable-handshake-tests" + } + }, + { + "commandStartedEvent": { + "command": { + "insert": "coll", + "documents": [ + { + "_id": 2, + "x": 22 + } + ] + }, + "commandName": "insert", + "databaseName": "retryable-handshake-tests" + } + } + ] + } + ], + "outcome": [ + { + "collectionName": "coll", + "databaseName": "retryable-handshake-tests", + "documents": [ + { + "_id": 1, + "x": 11 + }, + { + "_id": 2, + "x": 22 + } + ] + } + ] + }, + { + "description": "InsertOne succeeds after retryable handshake error ShutdownInProgress", + "operations": [ + { + "name": "failPoint", + "object": "testRunner", + "arguments": { + "client": "client0", + "failPoint": { + "configureFailPoint": "failCommand", + "mode": { + "times": 2 + }, + "data": { + "failCommands": [ + "saslContinue", + "ping" + ], + "errorCode": 91 + } + } + } + }, + { + "name": "runCommand", + "object": "database0", + "arguments": { + "commandName": "ping", + "command": { + "ping": 1 + } + }, + "expectError": { + "isError": true + } + }, + { + "name": "insertOne", + "object": "collection0", + "arguments": { + "document": { + "_id": 2, + "x": 22 + } + } + } + ], + "expectEvents": [ + { + "client": "client0", + "eventType": "cmap", + "events": [ + { + "connectionCheckOutStartedEvent": {} + }, + { + "connectionCheckOutStartedEvent": {} + }, + { + "connectionCheckOutStartedEvent": {} + }, + { + "connectionCheckOutStartedEvent": {} + } + ] + }, + { + "client": "client0", + "events": [ + { + "commandStartedEvent": { + "command": { + "ping": 1 + }, + "databaseName": "retryable-handshake-tests" + } + }, + { + "commandStartedEvent": { + "command": { + "insert": "coll", + "documents": [ + { + "_id": 2, + "x": 22 + } + ] + }, + "commandName": "insert", + "databaseName": "retryable-handshake-tests" + } + } + ] + } + ], + "outcome": [ + { + "collectionName": "coll", + "databaseName": "retryable-handshake-tests", + "documents": [ + { + "_id": 1, + "x": 11 + }, + { + "_id": 2, + "x": 22 + } + ] + } + ] + } + ] +} diff --git a/src/test/spec/json/retryable-writes/unified/handshakeError.yml b/src/test/spec/json/retryable-writes/unified/handshakeError.yml new file mode 100644 index 000000000..bac3a7dba --- /dev/null +++ b/src/test/spec/json/retryable-writes/unified/handshakeError.yml @@ -0,0 +1,137 @@ +description: "retryable writes handshake failures" + +schemaVersion: "1.3" + +runOnRequirements: + - minServerVersion: "4.2" + topologies: [replicaset, sharded, load-balanced] + auth: true + +createEntities: + - client: + id: &client0 client0 + useMultipleMongoses: false + observeEvents: [commandStartedEvent, connectionCheckOutStartedEvent] + - database: + id: &database0 database0 + client: *client0 + databaseName: &databaseName retryable-handshake-tests + - collection: + id: &collection0 collection0 + database: *database0 + collectionName: &collectionName coll + +initialData: + - collectionName: *collectionName + databaseName: *databaseName + documents: + - { _id: 1, x: 11 } + +tests: + - description: "InsertOne succeeds after retryable handshake error" + operations: + - name: failPoint # fail the next connection establishment + object: testRunner + arguments: + client: *client0 + failPoint: + configureFailPoint: failCommand + mode: { times: 2 } + data: + failCommands: [saslContinue, ping] + closeConnection: true + + - name: runCommand + object: *database0 + arguments: + commandName: ping + command: { ping: 1 } + expectError: + isError: true + + - name: insertOne + object: *collection0 + arguments: + document: { _id: 2, x: 22 } + + expectEvents: + - client: *client0 + eventType: cmap + events: + - { connectionCheckOutStartedEvent: {} } + - { connectionCheckOutStartedEvent: {} } + - { connectionCheckOutStartedEvent: {} } + - { connectionCheckOutStartedEvent: {} } + - client: *client0 + events: + - commandStartedEvent: + command: + ping: 1 + databaseName: *databaseName + - commandStartedEvent: + command: + insert: *collectionName + documents: [{ _id: 2, x: 22 }] + commandName: insert + databaseName: *databaseName + + outcome: + - collectionName: *collectionName + databaseName: *databaseName + documents: + - { _id: 1, x: 11 } + - { _id: 2, x: 22 } # The write was still applied + + - description: "InsertOne succeeds after retryable handshake error ShutdownInProgress" + operations: + - name: failPoint # fail the next connection establishment + object: testRunner + arguments: + client: *client0 + failPoint: + configureFailPoint: failCommand + mode: { times: 2 } + data: + failCommands: [saslContinue, ping] + errorCode: 91 # ShutdownInProgress + + - name: runCommand + object: *database0 + arguments: + commandName: ping + command: { ping: 1 } + expectError: + isError: true + + - name: insertOne + object: *collection0 + arguments: + document: { _id: 2, x: 22 } + + expectEvents: + - client: *client0 + eventType: cmap + events: + - { connectionCheckOutStartedEvent: {} } + - { connectionCheckOutStartedEvent: {} } + - { connectionCheckOutStartedEvent: {} } + - { connectionCheckOutStartedEvent: {} } + - client: *client0 + events: + - commandStartedEvent: + command: + ping: 1 + databaseName: *databaseName + - commandStartedEvent: + command: + insert: *collectionName + documents: [{ _id: 2, x: 22 }] + commandName: insert + databaseName: *databaseName + + outcome: + - collectionName: *collectionName + databaseName: *databaseName + documents: + - { _id: 1, x: 11 } + - { _id: 2, x: 22 } # The write was still applied diff --git a/src/test/spec/retryable_reads.rs b/src/test/spec/retryable_reads.rs index f0b9a9f46..2ae370d53 100644 --- a/src/test/spec/retryable_reads.rs +++ b/src/test/spec/retryable_reads.rs @@ -26,13 +26,20 @@ use crate::{ }, }; -use super::run_v2_test; +use super::{run_unified_format_test, run_v2_test}; #[cfg_attr(feature = "tokio-runtime", tokio::test(flavor = "multi_thread"))] #[cfg_attr(feature = "async-std-runtime", async_std::test)] -async fn run() { +async fn run_legacy() { let _guard: RwLockWriteGuard<()> = LOCK.run_exclusively().await; - run_spec_test(&["retryable-reads"], run_v2_test).await; + run_spec_test(&["retryable-reads", "legacy"], run_v2_test).await; +} + +#[cfg_attr(feature = "tokio-runtime", tokio::test(flavor = "multi_thread"))] +#[cfg_attr(feature = "async-std-runtime", async_std::test)] +async fn run_unified() { + let _guard: RwLockWriteGuard<()> = LOCK.run_exclusively().await; + run_spec_test(&["retryable-reads", "unified"], run_unified_format_test).await; } /// Test ensures that the connection used in the first attempt of a retry is released back into the diff --git a/src/test/spec/v2_runner/mod.rs b/src/test/spec/v2_runner/mod.rs index 52bef507c..ab4b190df 100644 --- a/src/test/spec/v2_runner/mod.rs +++ b/src/test/spec/v2_runner/mod.rs @@ -53,7 +53,7 @@ pub async fn run_v2_test(test_file: TestFile) { } for test in test_file.tests { - println!("Running {}", &test.description); + log_uncaptured(format!("Running {}", &test.description)); if test .operations