diff options
author | A. Jesse Jiryu Davis <jesse@mongodb.com> | 2021-05-04 15:21:10 -0400 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-05-04 21:50:07 +0000 |
commit | 4aa27885874b90e098c1225fccb10f4daa3b3d38 (patch) | |
tree | 6bc40bf2aaa6e275c1644114c2c80c7b09c7d257 /jstests/core/txns | |
parent | 882fa82e21f412e6c5743e99d2d97861b28bd935 (diff) | |
download | mongo-4aa27885874b90e098c1225fccb10f4daa3b3d38.tar.gz |
SERVER-55614 Make API params optional for cmds in txns
Diffstat (limited to 'jstests/core/txns')
-rw-r--r-- | jstests/core/txns/api_params_transaction.js | 88 | ||||
-rw-r--r-- | jstests/core/txns/transaction_continuing_cmds_refuse_api_params.js | 68 |
2 files changed, 88 insertions, 68 deletions
diff --git a/jstests/core/txns/api_params_transaction.js b/jstests/core/txns/api_params_transaction.js new file mode 100644 index 00000000000..a809f8a701c --- /dev/null +++ b/jstests/core/txns/api_params_transaction.js @@ -0,0 +1,88 @@ +/** + * Tests passing API parameters into transaction-continuing commands. + * @tags: [uses_transactions, requires_fcv_47] + */ + +(function() { +"use strict"; + +load("jstests/libs/fixture_helpers.js"); // For FixtureHelpers.isMongos(). + +const dbName = jsTestName(); +const collName = "test"; + +const testDB = db.getSiblingDB(dbName); +const testColl = testDB.getCollection(collName); + +testColl.drop({writeConcern: {w: "majority"}}); +assert.commandWorked( + testDB.runCommand({create: testColl.getName(), writeConcern: {w: "majority"}})); + +const apiParamCombos = [ + {}, + {apiVersion: "1"}, + {apiVersion: "1", apiDeprecationErrors: true}, + {apiVersion: "1", apiDeprecationErrors: false}, + {apiVersion: "1", apiStrict: true}, + {apiVersion: "1", apiStrict: true, apiDeprecationErrors: true}, + {apiVersion: "1", apiStrict: true, apiDeprecationErrors: false}, + {apiVersion: "1", apiStrict: false}, + {apiVersion: "1", apiStrict: false, apiDeprecationErrors: true}, + {apiVersion: "1", apiStrict: false, apiDeprecationErrors: false} +]; + +function addApiParams(obj, params) { + return Object.assign(Object.assign({}, obj), params); +} + +for (const txnInitiatingParams of apiParamCombos) { + for (const txnContinuingParams of apiParamCombos) { + for (const txnEndingCmdName of ["commitTransaction", "abortTransaction"]) { + // TODO (SERVER-56550): Remove "!txnContinuingParams.apiVersion". + const compatibleParams = + !txnContinuingParams.apiVersion || txnContinuingParams === txnInitiatingParams; + const session = db.getMongo().startSession(); + const sessionDb = session.getDatabase(dbName); + + session.startTransaction(); + assert.commandWorked(sessionDb.runCommand( + addApiParams({insert: collName, documents: [{}, {}, {}]}, txnInitiatingParams))); + + function checkCommand(db, command) { + const commandWithParams = addApiParams(command, txnContinuingParams); + jsTestLog(`Session ${session.getSessionId().id}, ` + + `initial params: ${tojson(txnInitiatingParams)}, ` + + `continuing params: ${tojson(txnContinuingParams)}, ` + + `compatible: ${tojson(compatibleParams)}`); + jsTestLog(`Command: ${tojson(commandWithParams)}`); + const reply = db.runCommand(commandWithParams); + jsTestLog(`Reply: ${tojson(reply)}`); + + if (compatibleParams) { + assert.commandWorked(reply); + } else { + assert.commandFailedWithCode(reply, ErrorCodes.APIMismatchError); + } + } + + /* + * Check "insert" with API params in a transaction. + */ + checkCommand(sessionDb, {insert: collName, documents: [{}]}); + + /* + * Check "commitTransaction" or "abortTransaction". + */ + let txnEndingCmd = {}; + txnEndingCmd[txnEndingCmdName] = 1; + Object.assign(txnEndingCmd, + {txnNumber: session.getTxnNumber_forTesting(), autocommit: false}); + + checkCommand(session.getDatabase("admin"), txnEndingCmd); + + // Clean up. + session.abortTransaction(); + } + } +} +})(); diff --git a/jstests/core/txns/transaction_continuing_cmds_refuse_api_params.js b/jstests/core/txns/transaction_continuing_cmds_refuse_api_params.js deleted file mode 100644 index 2eb11d1f4c3..00000000000 --- a/jstests/core/txns/transaction_continuing_cmds_refuse_api_params.js +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Tests that passing API parameters into transaction-continuing commands should fail. - * @tags: [uses_transactions, requires_fcv_47] - */ - -(function() { -"use strict"; - -load("jstests/libs/fixture_helpers.js"); // For FixtureHelpers.isMongos(). - -const errorCode = FixtureHelpers.isMongos(db) ? 4937701 : 4937700; -const commitTxnWithApiVersionErrorCode = FixtureHelpers.isMongos(db) ? 4937702 : 4937700; - -const dbName = jsTestName(); -const collName = "test"; - -const testDB = db.getSiblingDB(dbName); -const testColl = testDB.getCollection(collName); - -testColl.drop({writeConcern: {w: "majority"}}); -assert.commandWorked( - testDB.runCommand({create: testColl.getName(), writeConcern: {w: "majority"}})); - -const session = db.getMongo().startSession(); -const sessionAdminDB = session.getDatabase("admin"); -const sessionDB = session.getDatabase(dbName); -const sessionColl = sessionDB.getCollection(collName); - -const doc = { - x: 1 -}; - -session.startTransaction(); - -// Verify that the transaction-initiating command is allowed to specify an apiVersion. -assert.commandWorked(sessionColl.runCommand({insert: collName, documents: [doc], apiVersion: "1"})); - -// Verify that any transaction-continuing commands cannot specify API parameters. -assert.commandFailedWithCode( - sessionColl.runCommand({insert: collName, documents: [doc], apiVersion: "1"}), errorCode); -assert.commandFailedWithCode( - sessionColl.runCommand({insert: collName, documents: [doc], apiVersion: "1", apiStrict: false}), - errorCode); -assert.commandFailedWithCode( - sessionColl.runCommand( - {insert: collName, documents: [doc], apiVersion: "1", apiDeprecationErrors: false}), - errorCode); -let reply = sessionAdminDB.runCommand({ - commitTransaction: 1, - txnNumber: session.getTxnNumber_forTesting(), - autocommit: false, - apiVersion: "1" -}); -assert.commandFailedWithCode(reply, commitTxnWithApiVersionErrorCode); -reply = sessionAdminDB.runCommand({ - abortTransaction: 1, - txnNumber: session.getTxnNumber_forTesting(), - autocommit: false, - apiVersion: "1" -}); -assert.commandFailedWithCode(reply, errorCode); - -// Transaction-continuing commands without API parameters are allowed. -assert.commandWorked(sessionColl.runCommand({insert: collName, documents: [doc]})); - -assert.commandWorked(session.abortTransaction_forTesting()); -session.endSession(); -})(); |