75 lines
3.4 KiB
JavaScript
75 lines
3.4 KiB
JavaScript
// Contains helper for checking format version of unique indexes.
|
|
|
|
/**
|
|
* Verifies that all unique indexes belonging to all collections on all databases on the server
|
|
* are in correct data format version.
|
|
*
|
|
* TODO: SERVER-36547: Once we are past 4.2 release, make this script FCV independent.
|
|
* After 4.2 we can just assert if we do not see the correct index versions.
|
|
*/
|
|
function checkUniqueIndexFormatVersion(adminDB) {
|
|
// Data format version is WiredTiger specific and not required to be tested for other
|
|
// storage engines.
|
|
const isWiredTiger =
|
|
assert.commandWorked(adminDB.serverStatus()).storageEngine.name === "wiredTiger";
|
|
if (!isWiredTiger)
|
|
return;
|
|
|
|
// Unique indexes got an upgrade in 4.2, their WiredTiger specific internal version has changed
|
|
// since then
|
|
const newUniqIdxFCV = "4.2";
|
|
|
|
// Obtain the current FCV version
|
|
let res =
|
|
assert.commandWorked(adminDB.runCommand({getParameter: 1, featureCompatibilityVersion: 1}));
|
|
let currentFCV = res["featureCompatibilityVersion"]["version"];
|
|
|
|
res = assert.commandWorked(adminDB.runCommand({"listDatabases": 1}));
|
|
let databaseList = res.databases;
|
|
|
|
databaseList.forEach(function(database) {
|
|
let currentDatabase = adminDB.getSiblingDB(database.name);
|
|
// Get the list of collections including collections that are pending drop. This is to
|
|
// ensure that every unique index has the correct format version.
|
|
let collectionsWithPending =
|
|
currentDatabase.runCommand("listCollections", {includePendingDrops: true})
|
|
.cursor.firstBatch;
|
|
collectionsWithPending.forEach(function(c) {
|
|
let currentCollection = currentDatabase.getCollection(c.name);
|
|
currentCollection.getIndexes().forEach(function(index) {
|
|
if (index.unique) {
|
|
let ifv = currentCollection.aggregate({$collStats: {storageStats: {}}})
|
|
.next()
|
|
.storageStats.indexDetails[index.name]
|
|
.metadata.formatVersion;
|
|
// Unique indexes are expected to have new format version only post
|
|
// newUniqIdxFCV
|
|
if (index.v === 2) {
|
|
if (currentFCV === newUniqIdxFCV)
|
|
assert.eq(ifv,
|
|
12,
|
|
"Expected index format version 12 for unique index: " +
|
|
tojson(index));
|
|
else
|
|
assert.eq(ifv,
|
|
8,
|
|
"Expected index format version 8 for unique index: " +
|
|
tojson(index));
|
|
} else {
|
|
if (currentFCV === newUniqIdxFCV)
|
|
assert.eq(ifv,
|
|
11,
|
|
"Expected index format version 11 for unique index: " +
|
|
tojson(index));
|
|
else
|
|
assert.eq(ifv,
|
|
6,
|
|
"Expected index format version 6 for unique index: " +
|
|
tojson(index));
|
|
}
|
|
}
|
|
});
|
|
});
|
|
});
|
|
}
|