diff options
author | Dan Larkin-York <dan.larkin-york@mongodb.com> | 2022-01-21 16:40:30 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-01-21 17:03:42 +0000 |
commit | 304234ec32b5bfea937126602d76f8a2cc2a301e (patch) | |
tree | 77522fe64ecccbc26b05c1aac7c1971448fc6aad | |
parent | e1edb466aaacbe0c9f62846765349d7d69ea8c8c (diff) | |
download | mongo-304234ec32b5bfea937126602d76f8a2cc2a301e.tar.gz |
SERVER-62618 Avoid quadratic behavior at startup with many collections
-rw-r--r-- | src/mongo/db/storage/kv/storage_engine_test.cpp | 10 | ||||
-rw-r--r-- | 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 b45272f1b48..f5708022f39 100644 --- a/src/mongo/db/storage/kv/storage_engine_test.cpp +++ b/src/mongo/db/storage/kv/storage_engine_test.cpp @@ -453,7 +453,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); @@ -486,7 +489,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 f362fed42b1..4f15fe054bd 100644 --- a/src/mongo/db/storage/storage_engine_impl.cpp +++ b/src/mongo/db/storage/storage_engine_impl.cpp @@ -230,6 +230,7 @@ void StorageEngineImpl::loadCatalog(OperationContext* opCtx, LastShutdownState l const auto loadingFromUncleanShutdownOrRepair = lastShutdownState == LastShutdownState::kUnclean || _options.forRepair; + 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 |