diff options
author | Cheahuychou Mao <mao.cheahuychou@gmail.com> | 2022-03-28 20:59:36 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-03-28 22:17:46 +0000 |
commit | 18eb70e70613854d240b3c0f6e5fa52de01fe141 (patch) | |
tree | 11033177b7b62e9d1a885fb6f11dee3b60689f58 /jstests/multiVersion | |
parent | 6712215aa513ddb3fe3ab181a7683ef4132f097c (diff) | |
download | mongo-18eb70e70613854d240b3c0f6e5fa52de01fe141.tar.gz |
SERVER-64329 Make TransactionParticipant check internal transactions feature flag after the transaction transitions to the in-progress state
Diffstat (limited to 'jstests/multiVersion')
-rw-r--r-- | jstests/multiVersion/internal_transactions_during_downgrade.js | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/jstests/multiVersion/internal_transactions_during_downgrade.js b/jstests/multiVersion/internal_transactions_during_downgrade.js new file mode 100644 index 00000000000..e3b46b5f572 --- /dev/null +++ b/jstests/multiVersion/internal_transactions_during_downgrade.js @@ -0,0 +1,77 @@ +/* + * Tests the setFCV command kills internal sessions with unprepared transactions that start + * immediately before the FCV change and abort those transactions. + * + * @tags: [requires_fcv_53, featureFlagInternalTransactions] + */ +(function() { +'use strict'; + +load("jstests/libs/fail_point_util.js"); +load("jstests/libs/parallelTester.js"); + +function runInternalTxn(primaryHost, isStandaloneRst) { + load("jstests/sharding/libs/sharded_transactions_helpers.js"); + + const primary = new Mongo(primaryHost); + + const kDbName = "testDb"; + const kCollName = "testColl"; + let testDB = primary.getDB(kDbName); + + const sessionUUID = UUID(); + const parentLsid = {id: sessionUUID}; + const parentTxnNumber = NumberLong(35); + const childLsid = {id: parentLsid.id, txnNumber: parentTxnNumber, txnUUID: UUID()}; + const childTxnNumber = NumberLong(0); + const stmtId = NumberInt(1); + + const findAndModifyCmdObj = { + findAndModify: kCollName, + query: {_id: 0, x: 0}, + update: {$inc: {x: 1}}, + upsert: true, + lsid: childLsid, + txnNumber: childTxnNumber, + startTransaction: true, + autocommit: false, + stmtId: stmtId, + }; + const commitCmdObj = makeCommitTransactionCmdObj(childLsid, childTxnNumber); + + assert.commandFailedWithCode(testDB.runCommand(findAndModifyCmdObj), ErrorCodes.Interrupted); + assert.commandFailedWithCode(testDB.adminCommand(commitCmdObj), ErrorCodes.NoSuchTransaction); +} + +function runTest(rst, isStandaloneRst) { + const primary = rst.getPrimary(); + let fp = configureFailPoint(primary, "hangAfterCheckingInternalTransactionsFeatureFlag"); + + const internalTxnThread = new Thread(runInternalTxn, primary.host, isStandaloneRst); + internalTxnThread.start(); + fp.wait(); + + jsTest.log("Starting setFCV"); + assert.commandWorked(primary.adminCommand({setFeatureCompatibilityVersion: lastLTSFCV})); + jsTest.log("Finished setFCV"); + + fp.off(); + internalTxnThread.join(); + + assert.eq(null, primary.getCollection("config.transactions").findOne()); +} + +{ + const st = new ShardingTest({shards: 1}); + runTest(st.rs0, false /* isStandaloneRst */); + st.stop(); +} + +{ + const rst = new ReplSetTest({nodes: 1}); + rst.startSet(); + rst.initiate(); + runTest(rst, true /* isStandaloneRst */); + rst.stopSet(); +} +})(); |