(function() {
|
"use strict";
|
|
load("jstests/libs/parallelTester.js"); // for ScopedThread and CountDownLatch
|
|
const rst = new ReplSetTest({nodes: 2});
|
rst.startSet();
|
rst.initiate();
|
|
function setFCV(host, version, barrier) {
|
const conn = new Mongo(host);
|
|
barrier.countDown();
|
barrier.await();
|
|
try {
|
assert.commandWorked(conn.adminCommand({setFeatureCompatibilityVersion: version}));
|
return {ok: 1};
|
} catch (e) {
|
return {ok: 0, error: e.toString(), stack: e.stack};
|
}
|
}
|
|
const primary = rst.getPrimary();
|
const secondary = rst.getSecondary();
|
|
const primaryDB = primary.getDB("test");
|
const secondaryDB = secondary.getDB("test");
|
|
while (true) {
|
// We create two threads: one to set the server's featureCompatibilityVersion to "3.4" and
|
// another to set the server's featureCompatibilityVersion to "3.6".
|
{
|
const barrier = new CountDownLatch(2);
|
const thread34 = new ScopedThread(setFCV, primary.host, "3.4", barrier);
|
const thread36 = new ScopedThread(setFCV, primary.host, "3.6", barrier);
|
|
thread34.start();
|
thread36.start();
|
|
thread34.join();
|
thread36.join();
|
|
assert.commandWorked(thread34.returnData());
|
assert.commandWorked(thread36.returnData());
|
}
|
|
// If the thread that sets the server's featureCompatibilityVersion to "3.4" did its update
|
// to the featureCompatibilityVersion document last, then we reset the server's
|
// featureCompatibilityVersion to "3.6" and try again.
|
{
|
const res = assert.commandWorked(
|
primaryDB.adminCommand({getParameter: 1, featureCompatibilityVersion: 1}));
|
|
if (res.featureCompatibilityVersion === "3.4") {
|
assert.commandWorked(
|
primaryDB.adminCommand({setFeatureCompatibilityVersion: "3.6"}));
|
continue;
|
}
|
}
|
|
// Otherwise, we implicitly create a collection via an insert operation and verify that the
|
// collection has identical metadata on the primary and the secondary.
|
{
|
primaryDB.mycoll.drop();
|
assert.writeOK(primaryDB.mycoll.insert({}, {writeConcern: {w: 2}}));
|
|
const primaryCollectionInfos = primaryDB.getCollectionInfos({name: "mycoll"});
|
assert.eq(1, primaryCollectionInfos.length, tojson(primaryCollectionInfos));
|
|
const secondaryCollectionInfos = secondaryDB.getCollectionInfos({name: "mycoll"});
|
assert.eq(1, secondaryCollectionInfos.length, tojson(secondaryCollectionInfos));
|
|
assert.eq(primaryCollectionInfos[0],
|
secondaryCollectionInfos[0],
|
"Expected primary and secondary to have the same collection metadata");
|
}
|
}
|
|
rst.stopSet();
|
})();
|