mirror of https://github.com/mongodb/mongo
60 lines
2.1 KiB
JavaScript
60 lines
2.1 KiB
JavaScript
/**
|
|
* Tests that an unprepared transaction can be rolled back.
|
|
* @tags: [
|
|
* requires_replication,
|
|
* ]
|
|
*/
|
|
import {getUUIDFromListCollections} from "jstests/libs/uuid_util.js";
|
|
import {checkRollbackFiles} from "jstests/replsets/libs/rollback_files.js";
|
|
import {RollbackTest} from "jstests/replsets/libs/rollback_test.js";
|
|
|
|
// Operations that will be present on both nodes, before the common point.
|
|
const dbName = "test";
|
|
const collName = "test.t";
|
|
const collNameShort = "t";
|
|
let CommonOps = (node) => {
|
|
const coll = node.getCollection(collName);
|
|
assert.commandWorked(coll.insert({_id: 0}));
|
|
};
|
|
|
|
// Operations that will be performed on the rollback node past the common point.
|
|
let RollbackOps = (node) => {
|
|
const session = node.startSession();
|
|
const sessionDB = session.getDatabase(dbName);
|
|
const sessionColl = sessionDB.getCollection(collNameShort);
|
|
session.startTransaction();
|
|
assert.commandWorked(sessionColl.insert({_id: "a"}));
|
|
assert.commandWorked(sessionColl.insert({_id: "b"}));
|
|
assert.commandWorked(sessionColl.insert({_id: "c"}));
|
|
assert.commandWorked(session.commitTransaction_forTesting());
|
|
session.endSession();
|
|
};
|
|
|
|
// Set up Rollback Test.
|
|
const rollbackTest = new RollbackTest();
|
|
|
|
CommonOps(rollbackTest.getPrimary());
|
|
|
|
const rollbackNode = rollbackTest.transitionToRollbackOperations();
|
|
RollbackOps(rollbackNode);
|
|
|
|
// Wait for rollback to finish.
|
|
rollbackTest.transitionToSyncSourceOperationsBeforeRollback();
|
|
rollbackTest.transitionToSyncSourceOperationsDuringRollback();
|
|
rollbackTest.transitionToSteadyStateOperations();
|
|
|
|
// Check collection count.
|
|
const primary = rollbackTest.getPrimary();
|
|
const coll = primary.getCollection(collName);
|
|
assert.eq(1, coll.find().itcount());
|
|
assert.eq(1, coll.count());
|
|
|
|
// Confirm that the rollback wrote deleted documents to a file.
|
|
const replTest = rollbackTest.getTestFixture();
|
|
const expectedDocs = [{_id: "a"}, {_id: "b"}, {_id: "c"}];
|
|
|
|
const uuid = getUUIDFromListCollections(rollbackTest.getPrimary().getDB(dbName), collNameShort);
|
|
checkRollbackFiles(replTest.getDbPath(rollbackNode), collName, uuid, expectedDocs);
|
|
|
|
rollbackTest.stop();
|