From 212a8dbb47f07427dae194a9c75baec1d81d9259 Mon Sep 17 00:00:00 2001 From: Dan Larkin-York Date: Fri, 21 Jan 2022 22:56:53 +0000 Subject: SERVER-62618 Avoid quadratic behavior at startup with many collections --- src/mongo/db/storage/kv/storage_engine_test.cpp | 10 ++++++++-- src/mongo/db/storage/storage_engine_impl.cpp | 1 + 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/mongo/db/storage/kv/storage_engine_test.cpp b/src/mongo/db/storage/kv/storage_engine_test.cpp index 6d64c063ee7..59420db140a 100644 --- a/src/mongo/db/storage/kv/storage_engine_test.cpp +++ b/src/mongo/db/storage/kv/storage_engine_test.cpp @@ -389,7 +389,10 @@ TEST_F(StorageEngineRepairTest, LoadCatalogRecoversOrphansInCatalog) { ASSERT(!collectionExists(opCtx.get(), collNs)); // When in a repair context, loadCatalog() recreates catalog entries for orphaned idents. - _storageEngine->loadCatalog(opCtx.get(), StorageEngine::LastShutdownState::kClean); + { + Lock::GlobalWrite writeLock(opCtx.get(), Date_t::max(), Lock::InterruptBehavior::kThrow); + _storageEngine->loadCatalog(opCtx.get(), StorageEngine::LastShutdownState::kClean); + } auto identNs = swCollInfo.getValue().ident; std::replace(identNs.begin(), identNs.end(), '-', '_'); NamespaceString orphanNs = NamespaceString("local.orphan." + identNs); @@ -422,7 +425,10 @@ TEST_F(StorageEngineTest, LoadCatalogDropsOrphans) { // When in a normal startup context, loadCatalog() does not recreate catalog entries for // orphaned idents. - _storageEngine->loadCatalog(opCtx.get(), StorageEngine::LastShutdownState::kClean); + { + Lock::GlobalWrite writeLock(opCtx.get(), Date_t::max(), Lock::InterruptBehavior::kThrow); + _storageEngine->loadCatalog(opCtx.get(), StorageEngine::LastShutdownState::kClean); + } // reconcileCatalogAndIdents() drops orphaned idents. auto reconcileResult = unittest::assertGet(reconcile(opCtx.get())); ASSERT_EQUALS(0UL, reconcileResult.indexesToRebuild.size()); diff --git a/src/mongo/db/storage/storage_engine_impl.cpp b/src/mongo/db/storage/storage_engine_impl.cpp index e3b397337cd..6af5185e793 100644 --- a/src/mongo/db/storage/storage_engine_impl.cpp +++ b/src/mongo/db/storage/storage_engine_impl.cpp @@ -236,6 +236,7 @@ void StorageEngineImpl::loadCatalog(OperationContext* opCtx, LastShutdownState l } } + BatchedCollectionCatalogWriter catalogBatchWriter{opCtx}; for (DurableCatalog::Entry entry : catalogEntries) { if (loadingFromUncleanShutdownOrRepair) { // If we are loading the catalog after an unclean shutdown or during repair, it's -- cgit v1.2.1