summaryrefslogtreecommitdiff
path: root/jstests/multiVersion
diff options
context:
space:
mode:
authorCheahuychou Mao <mao.cheahuychou@gmail.com>2022-03-28 20:59:36 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-03-28 22:17:46 +0000
commit18eb70e70613854d240b3c0f6e5fa52de01fe141 (patch)
tree11033177b7b62e9d1a885fb6f11dee3b60689f58 /jstests/multiVersion
parent6712215aa513ddb3fe3ab181a7683ef4132f097c (diff)
downloadmongo-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.js77
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();
+}
+})();