runOn: - minServerVersion: "4.0" topology: ["replicaset"] - minServerVersion: "4.1.8" topology: ["sharded"] database_name: &database_name "withTransaction-tests" collection_name: &collection_name "test" data: [] tests: - description: callback succeeds after multiple connection errors failPoint: configureFailPoint: failCommand mode: { times: 2 } data: failCommands: ["insert"] closeConnection: true operations: - name: withTransaction object: session0 arguments: callback: operations: - # We do not assert the result here, as insertOne will fail for # the first two executions of the callback before ultimately # succeeding and returning a result. Asserting the state of the # output collection after the test is sufficient. name: insertOne object: collection arguments: session: session0 document: { _id: 1 } expectations: - command_started_event: command: insert: *collection_name documents: - { _id: 1 } ordered: true lsid: session0 txnNumber: { $numberLong: "1" } startTransaction: true autocommit: false # omitted fields readConcern: ~ writeConcern: ~ command_name: insert database_name: *database_name - command_started_event: command: abortTransaction: 1 lsid: session0 txnNumber: { $numberLong: "1" } autocommit: false # omitted fields readConcern: ~ startTransaction: ~ writeConcern: ~ command_name: abortTransaction database_name: admin - command_started_event: command: insert: *collection_name documents: - { _id: 1 } ordered: true lsid: session0 # second transaction will be causally consistent with the first readConcern: { afterClusterTime: 42 } # txnNumber is incremented when retrying the transaction txnNumber: { $numberLong: "2" } startTransaction: true autocommit: false # omitted fields writeConcern: ~ command_name: insert database_name: *database_name - command_started_event: command: abortTransaction: 1 lsid: session0 txnNumber: { $numberLong: "2" } autocommit: false # omitted fields readConcern: ~ startTransaction: ~ writeConcern: ~ command_name: abortTransaction database_name: admin - command_started_event: command: insert: *collection_name documents: - { _id: 1 } ordered: true lsid: session0 # third transaction will be causally consistent with the second readConcern: { afterClusterTime: 42 } # txnNumber is incremented when retrying the transaction txnNumber: { $numberLong: "3" } startTransaction: true autocommit: false # omitted fields writeConcern: ~ command_name: insert database_name: *database_name - command_started_event: command: commitTransaction: 1 lsid: session0 txnNumber: { $numberLong: "3" } autocommit: false # omitted fields readConcern: ~ startTransaction: ~ writeConcern: ~ command_name: commitTransaction database_name: admin outcome: collection: data: - { _id: 1 } - description: callback is not retried after non-transient error (DuplicateKeyError) useMultipleMongoses: true operations: - name: withTransaction object: session0 arguments: callback: operations: - name: insertOne object: collection arguments: session: session0 document: { _id: 1 } result: insertedId: 1 - name: insertOne object: collection arguments: session: session0 document: { _id: 1 } result: errorLabelsOmit: ["TransientTransactionError", "UnknownTransactionCommitResult"] result: # Don't assert on errorCodeName because (after SERVER-38583) the # DuplicateKey is reported in writeErrors, not as a top-level # command error. errorLabelsOmit: ["TransientTransactionError", "UnknownTransactionCommitResult"] expectations: - command_started_event: command: insert: *collection_name documents: - { _id: 1 } ordered: true lsid: session0 txnNumber: { $numberLong: "1" } startTransaction: true autocommit: false # omitted fields readConcern: ~ writeConcern: ~ command_name: insert database_name: *database_name - command_started_event: command: insert: *collection_name documents: - { _id: 1 } ordered: true lsid: session0 txnNumber: { $numberLong: "1" } autocommit: false # omitted fields readConcern: ~ startTransaction: ~ writeConcern: ~ command_name: insert database_name: *database_name - command_started_event: command: abortTransaction: 1 lsid: session0 txnNumber: { $numberLong: "1" } autocommit: false # omitted fields readConcern: ~ startTransaction: ~ writeConcern: ~ command_name: abortTransaction database_name: admin outcome: collection: data: []