mirror of https://github.com/mongodb/mongo
83 lines
3.2 KiB
JavaScript
83 lines
3.2 KiB
JavaScript
/**
|
|
* Test dropping collections during initial sync, before using the 'find' and 'count'
|
|
* commands using UUIDs instead of namespaces. This verifies initial sync behavior in
|
|
* cases where using UUIDs results in NamespaceNotFound while using namespace strings
|
|
* results in an empty result or zero count.
|
|
*/
|
|
import {kDefaultWaitForFailPointTimeout} from "jstests/libs/fail_point_util.js";
|
|
import {ReplSetTest} from "jstests/libs/replsettest.js";
|
|
|
|
const basename = "initial_sync_rename_collection";
|
|
|
|
jsTestLog("Bring up set");
|
|
const rst = new ReplSetTest({name: basename, nodes: [{}, {rsConfig: {priority: 0}}, {rsConfig: {priority: 0}}]});
|
|
rst.startSet();
|
|
rst.initiate();
|
|
|
|
const primary = rst.getPrimary();
|
|
const primaryDB = primary.getDB("d");
|
|
const primaryColl = primaryDB.coll;
|
|
|
|
// The default WC is majority and this test can't satisfy majority writes.
|
|
assert.commandWorked(
|
|
primary.adminCommand({setDefaultRWConcern: 1, defaultWriteConcern: {w: 1}, writeConcern: {w: "majority"}}),
|
|
);
|
|
|
|
jsTestLog("Create a collection (with a UUID) and insert a document.");
|
|
assert.commandWorked(primaryColl.insert({_id: 0}));
|
|
|
|
const collInfo = primaryDB.getCollectionInfos({name: primaryColl.getName()})[0];
|
|
assert(collInfo.info.uuid, "newly created collection expected to have a UUID: " + tojson(collInfo));
|
|
|
|
jsTestLog("Make sure synced");
|
|
rst.awaitReplication();
|
|
|
|
jsTestLog("Resync the secondary enabling failpoint");
|
|
function ResyncWithFailpoint(failpointName, failpointData) {
|
|
let setParameter = {numInitialSyncAttempts: 1};
|
|
setParameter["failpoint." + failpointName] = tojson({mode: "alwaysOn", data: failpointData});
|
|
rst.restart(1, {startClean: true, setParameter});
|
|
const secondary = rst.nodes[1];
|
|
assert.eq(primary, rst.getPrimary(), "Primary changed after reconfig");
|
|
|
|
jsTestLog("Wait for new node to start cloning");
|
|
secondary.setSecondaryOk();
|
|
|
|
rst.reInitiate();
|
|
assert.commandWorked(
|
|
secondary.adminCommand({
|
|
waitForFailPoint: failpointName,
|
|
timesEntered: 1,
|
|
maxTimeMS: kDefaultWaitForFailPointTimeout,
|
|
}),
|
|
);
|
|
|
|
jsTestLog("Remove collection on the primary and insert a new document, recreating it.");
|
|
assert(primaryColl.drop());
|
|
assert.commandWorked(primaryColl.insert({_id: 0}, {writeConcern: {w: "majority"}}));
|
|
const newCollInfo = primaryDB.getCollectionInfos({name: primaryColl.getName()})[0];
|
|
assert(collInfo.info.uuid, "recreated collection expected to have a UUID: " + tojson(collInfo));
|
|
assert.neq(collInfo.info.uuid, newCollInfo.info.uuid, "recreated collection expected to have different UUID");
|
|
|
|
jsTestLog("Disable failpoint and resume initial sync");
|
|
assert.commandWorked(secondary.adminCommand({configureFailPoint: failpointName, mode: "off"}));
|
|
|
|
jsTestLog("Wait for both nodes to be up-to-date");
|
|
rst.awaitSecondaryNodes();
|
|
rst.awaitReplication();
|
|
|
|
jsTestLog("Check consistency and shut down replica-set");
|
|
rst.checkReplicatedDataHashes();
|
|
}
|
|
ResyncWithFailpoint("hangBeforeClonerStage", {
|
|
cloner: "CollectionCloner",
|
|
stage: "count",
|
|
namespace: primaryColl.getFullName(),
|
|
});
|
|
ResyncWithFailpoint("hangAfterClonerStage", {
|
|
cloner: "DatabaseCloner",
|
|
stage: "listCollections",
|
|
database: primaryDB.getName(),
|
|
});
|
|
rst.stopSet();
|