mirror of https://github.com/mongodb/mongo
61 lines
2.6 KiB
JavaScript
61 lines
2.6 KiB
JavaScript
/**
|
|
* Tests that a rollback directory is created for oplog entries during replica set rollback, and
|
|
* verifies that the rolled back oplogs are written to that directory.
|
|
*
|
|
* @tags: [requires_persistence, requires_fcv_81]
|
|
*/
|
|
|
|
import {RollbackTest} from "jstests/replsets/libs/rollback_test.js";
|
|
|
|
function runRollbackOplogsTest(shouldCreateRollbackFiles) {
|
|
jsTestLog("Testing createRollbackDataFiles = " + shouldCreateRollbackFiles);
|
|
const rollbackTest = new RollbackTest(jsTestName());
|
|
const rollbackNode = rollbackTest.getPrimary();
|
|
const secondTermPrimary = rollbackTest.getSecondary();
|
|
assert.commandWorked(
|
|
rollbackNode.getDB("admin").adminCommand({setParameter: 1, createRollbackDataFiles: shouldCreateRollbackFiles}),
|
|
);
|
|
assert.commandWorked(
|
|
secondTermPrimary
|
|
.getDB("admin")
|
|
.adminCommand({setParameter: 1, createRollbackDataFiles: shouldCreateRollbackFiles}),
|
|
);
|
|
|
|
const dbName = "test";
|
|
const collName = "rollbackColl";
|
|
|
|
// Isolate the rollbackNode (current primary node) and insert documents (which will be rolled
|
|
// back).
|
|
rollbackTest.transitionToRollbackOperations();
|
|
assert.commandWorked(rollbackNode.getDB(dbName)[collName].insert({"a": 1}));
|
|
assert.commandWorked(rollbackNode.getDB(dbName)[collName].insert({"a": 2}));
|
|
const rst = rollbackTest.getTestFixture();
|
|
const oplogsToRollback = rst.findOplog(rollbackNode, {}).toArray();
|
|
|
|
// Elect the previous secondary as the new primary.
|
|
rollbackTest.transitionToSyncSourceOperationsBeforeRollback();
|
|
assert.commandWorked(secondTermPrimary.getDB(dbName)[collName].insert({"b": 1}));
|
|
|
|
// Reconnect the isolated node and rollback should start.
|
|
rollbackTest.transitionToSyncSourceOperationsDuringRollback();
|
|
// Transition back to steady state.
|
|
rollbackTest.transitionToSteadyStateOperations();
|
|
|
|
// Check for rollback files.
|
|
const rollbackNodePath = rst.getDbPath(rollbackNode);
|
|
const oplogRollbackDir = rollbackNodePath + "/rollback/local.oplog.rs";
|
|
assert.eq(pathExists(oplogRollbackDir), shouldCreateRollbackFiles, oplogRollbackDir);
|
|
if (shouldCreateRollbackFiles) {
|
|
const listRollbackFiles = listFiles(oplogRollbackDir);
|
|
let oplogsRolledBack = [];
|
|
for (let i = 0; i < listRollbackFiles.length; i++) {
|
|
oplogsRolledBack = oplogsRolledBack.concat(_readDumpFile(listRollbackFiles[i].name));
|
|
}
|
|
assert.contains(oplogsToRollback[0], oplogsRolledBack);
|
|
assert.contains(oplogsToRollback[1], oplogsRolledBack);
|
|
}
|
|
rst.stopSet();
|
|
}
|
|
runRollbackOplogsTest(true);
|
|
runRollbackOplogsTest(false);
|