(function() {
|
"use strict";
|
|
const verbositySettings = tojson({
|
verbosity: 1,
|
replication: 2,
|
storage: 2,
|
});
|
|
const rst = new ReplSetTest({
|
nodes: 1,
|
nodeOptions: {
|
setParameter: {logComponentVerbosity: verbositySettings},
|
}
|
});
|
|
rst.startSet();
|
rst.initiate();
|
|
const primaryDB = rst.getPrimary().getDB("test");
|
|
rst.add({
|
setParameter: {
|
"failpoint.initialSyncHangBeforeCopyingDatabases": tojson({mode: "alwaysOn"}),
|
logComponentVerbosity: verbositySettings
|
}
|
});
|
|
// We disallow the secondary node from voting so that the primary's featureCompatibilityVersion
|
// can be modified while the secondary node is still waiting to complete its initial sync.
|
{
|
const replSetConfig = rst.getReplSetConfigFromNode(0);
|
replSetConfig.members = rst.getReplSetConfig().members;
|
replSetConfig.members[1].priority = 0;
|
replSetConfig.members[1].votes = 0;
|
++replSetConfig.version;
|
assert.commandWorked(primaryDB.adminCommand({replSetReconfig: replSetConfig}));
|
}
|
|
// We set the primary's featureCompatibilityVersion to "3.4" and implicitly create a collection
|
// without a UUID via an insert operation.
|
{
|
assert.commandWorked(primaryDB.adminCommand({setFeatureCompatibilityVersion: "3.4"}));
|
|
primaryDB.mycoll.drop();
|
assert.writeOK(primaryDB.mycoll.insert({_id: "while in fCV=3.4"}));
|
}
|
|
// Next, we set the primary's featureCompatibilityVersion to "3.6" and drop the collection that
|
// was previously created. We then implicitly create another collection of the same name (but
|
// with a UUID this time) via an insert operation.
|
{
|
assert.commandWorked(primaryDB.adminCommand({setFeatureCompatibilityVersion: "3.6"}));
|
|
primaryDB.mycoll.drop();
|
assert.writeOK(primaryDB.mycoll.insert({_id: "while in fCV=3.6"}));
|
}
|
|
// Finally, we allow the secondary node to proceed with its initial sync. It should end up with
|
// only the document that was inserted into the collection when the primary's
|
// featureCompatibilityVersion was "3.6".
|
const secondaryDB = rst.getSecondary().getDB("test");
|
assert.commandWorked(secondaryDB.adminCommand({
|
configureFailPoint: "initialSyncHangBeforeCopyingDatabases",
|
mode: "off",
|
}));
|
|
rst.checkReplicatedDataHashes();
|
rst.stopSet();
|
})();
|