summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregory Noma <gregory.noma@gmail.com>2022-09-15 15:54:38 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-09-15 18:39:58 +0000
commit5457b4527960627071d26310111b29510105d42f (patch)
treebf1586c47f25a69ca52bb7b1d102ddf26e83f24f
parent881ad6801b77be9529baf34f421d05f5a7ccaca4 (diff)
downloadmongo-5457b4527960627071d26310111b29510105d42f.tar.gz
SERVER-69389 Populate shadow collection catalog on clean shutdown
-rw-r--r--src/mongo/db/catalog/catalog_control.cpp8
-rw-r--r--src/mongo/db/catalog/collection_catalog.cpp11
-rw-r--r--src/mongo/db/catalog/collection_catalog.h4
-rw-r--r--src/mongo/db/catalog/collection_catalog_test.cpp16
-rw-r--r--src/mongo/db/storage/storage_engine_impl.cpp1
5 files changed, 20 insertions, 20 deletions
diff --git a/src/mongo/db/catalog/catalog_control.cpp b/src/mongo/db/catalog/catalog_control.cpp
index 98219a55b95..79b3126d9ff 100644
--- a/src/mongo/db/catalog/catalog_control.cpp
+++ b/src/mongo/db/catalog/catalog_control.cpp
@@ -149,8 +149,7 @@ void reopenAllDatabasesAndReloadCollectionCatalog(OperationContext* opCtx,
// Opening CollectionCatalog: The collection catalog is now in sync with the storage engine
// catalog. Clear the pre-closing state.
- CollectionCatalog::write(opCtx,
- [&](CollectionCatalog& catalog) { catalog.onOpenCatalog(opCtx); });
+ CollectionCatalog::write(opCtx, [](CollectionCatalog& catalog) { catalog.onOpenCatalog(); });
opCtx->getServiceContext()->incrementCatalogGeneration();
LOGV2(20278, "openCatalog: finished reloading collection catalog");
}
@@ -210,14 +209,13 @@ PreviousCatalogState closeCatalog(OperationContext* opCtx) {
// Need to mark the CollectionCatalog as open if we our closeAll fails, dismissed if successful.
ScopeGuard reopenOnFailure([opCtx] {
CollectionCatalog::write(opCtx,
- [&](CollectionCatalog& catalog) { catalog.onOpenCatalog(opCtx); });
+ [](CollectionCatalog& catalog) { catalog.onOpenCatalog(); });
});
// Closing CollectionCatalog: only lookupNSSByUUID will fall back to using pre-closing state to
// allow authorization for currently unknown UUIDs. This is needed because authorization needs
// to work before acquiring locks, and might otherwise spuriously regard a UUID as unknown
// while reloading the catalog.
- CollectionCatalog::write(opCtx,
- [&](CollectionCatalog& catalog) { catalog.onCloseCatalog(opCtx); });
+ CollectionCatalog::write(opCtx, [](CollectionCatalog& catalog) { catalog.onCloseCatalog(); });
LOGV2_DEBUG(20270, 1, "closeCatalog: closing collection catalog");
diff --git a/src/mongo/db/catalog/collection_catalog.cpp b/src/mongo/db/catalog/collection_catalog.cpp
index 29bb7c6093c..676fd875853 100644
--- a/src/mongo/db/catalog/collection_catalog.cpp
+++ b/src/mongo/db/catalog/collection_catalog.cpp
@@ -835,16 +835,17 @@ void CollectionCatalog::onCloseDatabase(OperationContext* opCtx, DatabaseName db
_viewsForDatabase.erase(dbName);
}
-void CollectionCatalog::onCloseCatalog(OperationContext* opCtx) {
- invariant(opCtx->lockState()->isW());
- invariant(!_shadowCatalog);
+void CollectionCatalog::onCloseCatalog() {
+ if (_shadowCatalog) {
+ return;
+ }
+
_shadowCatalog.emplace();
for (auto& entry : _catalog)
_shadowCatalog->insert({entry.first, entry.second->ns()});
}
-void CollectionCatalog::onOpenCatalog(OperationContext* opCtx) {
- invariant(opCtx->lockState()->isW());
+void CollectionCatalog::onOpenCatalog() {
invariant(_shadowCatalog);
_shadowCatalog.reset();
++_epoch;
diff --git a/src/mongo/db/catalog/collection_catalog.h b/src/mongo/db/catalog/collection_catalog.h
index e5d2845a527..276891234ef 100644
--- a/src/mongo/db/catalog/collection_catalog.h
+++ b/src/mongo/db/catalog/collection_catalog.h
@@ -546,14 +546,14 @@ public:
*
* Must be called with the global lock acquired in exclusive mode.
*/
- void onCloseCatalog(OperationContext* opCtx);
+ void onCloseCatalog();
/**
* Puts the catalog back in open state, removing the pre-close state. See onCloseCatalog.
*
* Must be called with the global lock acquired in exclusive mode.
*/
- void onOpenCatalog(OperationContext* opCtx);
+ void onOpenCatalog();
/**
* The epoch is incremented whenever the catalog is closed and re-opened.
diff --git a/src/mongo/db/catalog/collection_catalog_test.cpp b/src/mongo/db/catalog/collection_catalog_test.cpp
index 43a089fea2b..107336b19f3 100644
--- a/src/mongo/db/catalog/collection_catalog_test.cpp
+++ b/src/mongo/db/catalog/collection_catalog_test.cpp
@@ -526,7 +526,7 @@ TEST_F(CollectionCatalogTest, RenameCollection) {
TEST_F(CollectionCatalogTest, LookupNSSByUUIDForClosedCatalogReturnsOldNSSIfDropped) {
{
Lock::GlobalLock globalLk(opCtx.get(), MODE_X);
- catalog.onCloseCatalog(opCtx.get());
+ catalog.onCloseCatalog();
}
catalog.deregisterCollection(opCtx.get(), colUUID, /*isDropPending=*/false);
@@ -535,7 +535,7 @@ TEST_F(CollectionCatalogTest, LookupNSSByUUIDForClosedCatalogReturnsOldNSSIfDrop
{
Lock::GlobalLock globalLk(opCtx.get(), MODE_X);
- catalog.onOpenCatalog(opCtx.get());
+ catalog.onOpenCatalog();
}
ASSERT_EQUALS(catalog.lookupNSSByUUID(opCtx.get(), colUUID), boost::none);
@@ -550,7 +550,7 @@ TEST_F(CollectionCatalogTest, LookupNSSByUUIDForClosedCatalogReturnsNewlyCreated
// Ensure that looking up non-existing UUIDs doesn't affect later registration of those UUIDs.
{
Lock::GlobalLock globalLk(opCtx.get(), MODE_X);
- catalog.onCloseCatalog(opCtx.get());
+ catalog.onCloseCatalog();
}
ASSERT(catalog.lookupCollectionByUUID(opCtx.get(), newUUID) == nullptr);
@@ -562,7 +562,7 @@ TEST_F(CollectionCatalogTest, LookupNSSByUUIDForClosedCatalogReturnsNewlyCreated
// Ensure that collection still exists after opening the catalog again.
{
Lock::GlobalLock globalLk(opCtx.get(), MODE_X);
- catalog.onOpenCatalog(opCtx.get());
+ catalog.onOpenCatalog();
}
ASSERT_EQUALS(catalog.lookupCollectionByUUID(opCtx.get(), newUUID), newCol);
@@ -576,7 +576,7 @@ TEST_F(CollectionCatalogTest, LookupNSSByUUIDForClosedCatalogReturnsFreshestNSS)
{
Lock::GlobalLock globalLk(opCtx.get(), MODE_X);
- catalog.onCloseCatalog(opCtx.get());
+ catalog.onCloseCatalog();
}
catalog.deregisterCollection(opCtx.get(), colUUID, /*isDropPending=*/false);
@@ -589,7 +589,7 @@ TEST_F(CollectionCatalogTest, LookupNSSByUUIDForClosedCatalogReturnsFreshestNSS)
// Ensure that collection still exists after opening the catalog again.
{
Lock::GlobalLock globalLk(opCtx.get(), MODE_X);
- catalog.onOpenCatalog(opCtx.get());
+ catalog.onOpenCatalog();
}
ASSERT_EQUALS(catalog.lookupCollectionByUUID(opCtx.get(), colUUID), newCol);
@@ -602,8 +602,8 @@ TEST_F(CollectionCatalogTest, CollectionCatalogEpoch) {
{
Lock::GlobalLock globalLk(opCtx.get(), MODE_X);
- catalog.onCloseCatalog(opCtx.get());
- catalog.onOpenCatalog(opCtx.get());
+ catalog.onCloseCatalog();
+ catalog.onOpenCatalog();
}
auto incrementedEpoch = catalog.getEpoch();
diff --git a/src/mongo/db/storage/storage_engine_impl.cpp b/src/mongo/db/storage/storage_engine_impl.cpp
index d3a968725f4..78daf7f6e1b 100644
--- a/src/mongo/db/storage/storage_engine_impl.cpp
+++ b/src/mongo/db/storage/storage_engine_impl.cpp
@@ -789,6 +789,7 @@ void StorageEngineImpl::cleanShutdown() {
}
CollectionCatalog::write(getGlobalServiceContext(), [](CollectionCatalog& catalog) {
+ catalog.onCloseCatalog();
catalog.deregisterAllCollectionsAndViews();
});