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:
parent
eea8602c1d
commit
917d338c4b
@ -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,
|
||||
};
|
||||
|
||||
})();
|
||||
|
@ -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))
|
||||
|
Loading…
Reference in New Issue
Block a user