0
0
mirror of https://github.com/mongodb/mongo.git synced 2024-12-01 09:32:32 +01:00

SERVER-42300 Retry, not skip, renamed ns in forEachCollectionFromDb

This commit is contained in:
Geert Bosch 2019-07-23 15:48:19 -04:00
parent eea8602c1d
commit 917d338c4b
2 changed files with 38 additions and 14 deletions

View File

@ -9,7 +9,6 @@
*/
var $config = (function() {
var data = {
// Use the workload name as a prefix for the collection name,
// since the workload name is assumed to be unique.
@ -17,7 +16,6 @@ var $config = (function() {
};
var states = (function() {
function uniqueCollectionName(prefix, tid, num) {
return prefix + tid + '_' + num;
}
@ -35,11 +33,30 @@ var $config = (function() {
this.fromCollName = toCollName;
}
return {init: init, rename: rename};
function listCollections(db, collName) {
const collectionInfos = db.getCollectionInfos();
if (!this.allCollectionsInitialized) {
if (collectionInfos.length === this.threadCount) {
this.allCollectionsInitialized = true;
jsTestLog(`All collections visible to thread ${this.tid}: ${
tojsononeline(collectionInfos)}`);
}
} else {
const numColls =
collectionInfos.filter((collInfo) => collInfo.name.startsWith(this.prefix))
.length;
assertAlways.eq(numColls, this.threadCount, () => tojson(collectionInfos));
}
}
return {init: init, rename: rename, listCollections: listCollections};
})();
var transitions = {init: {rename: 1}, rename: {rename: 1}};
var transitions = {
init: {rename: 1},
rename: {rename: 0.9, listCollections: 0.1},
listCollections: {rename: 1},
};
return {
threadCount: 10,
@ -48,5 +65,4 @@ var $config = (function() {
states: states,
transitions: transitions,
};
})();

View File

@ -51,18 +51,26 @@ void forEachCollectionFromDb(OperationContext* opCtx,
continue;
}
auto nss = catalog.lookupNSSByUUID(uuid);
boost::optional<Lock::CollectionLock> clk;
Collection* collection = nullptr;
// If the NamespaceString can't be resolved from the uuid, then the collection was dropped.
if (!nss) {
continue;
while (auto nss = catalog.lookupNSSByUUID(uuid)) {
// Get a fresh snapshot for each locked collection to see any catalog changes.
clk.emplace(opCtx, *nss, collLockMode);
opCtx->recoveryUnit()->abandonSnapshot();
if (catalog.lookupNSSByUUID(uuid) == nss) {
// Success: locked the namespace and the UUID still maps to it.
collection = catalog.lookupCollectionByUUID(uuid);
invariant(collection);
break;
}
// Failed: collection got renamed before locking it, so unlock and try again.
clk.reset();
}
Lock::CollectionLock clk(opCtx, *nss, collLockMode);
opCtx->recoveryUnit()->abandonSnapshot();
auto collection = catalog.lookupCollectionByUUID(uuid);
if (!collection || collection->ns() != *nss)
// The NamespaceString couldn't be resolved from the uuid, so the collection was dropped.
if (!collection)
continue;
if (!callback(collection))