/*
* Tests that a standalone succeeds when passed the 'recoverFromOplogAsStandalone' parameter.
*
* This test only makes sense for storage engines that support recover to stable timestamp.
* @tags: [requires_wiredtiger, requires_persistence, requires_journaling, requires_replication,
* requires_majority_read_concern]
*/
(function() {
"use strict";
load("jstests/replsets/rslib.js");
load("jstests/libs/write_concern_util.js");
load("jstests/core/txns/libs/prepare_helpers.js");
const name = 'standalone_replication_recovery';
const dbName = name;
const collName = 'srr_coll';
const logLevel = tojson({storage: {recovery: 3}});
const rst = new ReplSetTest({
nodes: 2,
});
function getColl(conn) {
return conn.getDB(dbName)[collName];
}
function assertDocsInColl(node, nums) {
let results = getColl(node).find().sort({_id: 1}).toArray();
let expected = nums.map((i) => ({_id: i}));
if (!friendlyEqual(results, expected)) {
rst.dumpOplog(node, {}, 100);
}
assert.eq(results, expected, "actual (left) != expected (right)");
}
jsTestLog("Initiating as a replica set.");
let nodes = rst.startSet({setParameter: {logComponentVerbosity: logLevel}});
let node = nodes[0];
let secondary = nodes[1];
rst.initiate({
_id: name,
members: [{_id: 0, host: node.host}, {_id: 2, host: secondary.host, priority: 0}]
});
assert.commandWorked(node.getDB(dbName).runCommand({
create: collName,
writeConcern: {w: "majority", wtimeout: ReplSetTest.kDefaultTimeoutMS}
}));
assertDocsInColl(node, []);
node = rst.restart(node, {"noReplSet": false});
reconnect(node);
assert.eq(rst.getPrimary(), node);
const session = node.startSession();
const sessionDb = session.getDatabase(dbName);
const sessionColl = sessionDb.getCollection(collName + "2");
assert.commandWorked(sessionColl.insert({_id: 1}));
session.startTransaction({readConcern: {level: "snapshot"}, writeConcern: {w: 1, j: 1}});
assert.commandWorked(sessionColl.insert({_id: 123457}));
assert.commandWorked(sessionColl.insert({_id: 123458}));
let prepareTimestamp = PrepareHelpers.prepareTransaction(session);
stopServerReplication(secondary);
assert.commandWorked(getColl(node).insert({_id: 3}, {writeConcern: {w: 1, j: 1}}));
assert.commandWorked(getColl(node).insert({_id: 4}, {writeConcern: {w: 1, j: 1}}));
assert.commandWorked(getColl(node).insert({_id: 5}, {writeConcern: {w: 1, j: 1}}));
assertDocsInColl(node, [3, 4, 5]);
assert.commandWorked(PrepareHelpers.commitTransaction(session, prepareTimestamp));
jsTestLog("Test that on restart with the flag set we play recovery.");
node = rst.restart(node, {
noReplSet: true,
setParameter: {recoverFromOplogAsStandalone: true, logComponentVerbosity: logLevel}
});
reconnect(node);
assertDocsInColl(node, [3, 4, 5]);
restartServerReplication(secondary);
TestData.skipCheckDBHashes = true;
rst.stopSet();
})();