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-10-17 18:03:04 +0000
commit1ff0f181d863dc3c27c8c4ae1bc9a6b174f09a15 (patch)
treec631e469a8d9c7a6ba27474649b7170a981d7626
parent5124386a7b4d5ec77ef1f7442499cde9efb8bd6e (diff)
downloadmongo-1ff0f181d863dc3c27c8c4ae1bc9a6b174f09a15.tar.gz
SERVER-69389 Populate shadow collection catalog on clean shutdown
(cherry picked from commit 5457b4527960627071d26310111b29510105d42f)
-rw-r--r--src/mongo/db/catalog/catalog_control.cpp7
-rw-r--r--src/mongo/db/catalog/collection_catalog.cpp12
-rw-r--r--src/mongo/db/catalog/collection_catalog.h4
-rw-r--r--src/mongo/db/catalog/collection_catalog_test.cpp12
-rw-r--r--src/mongo/db/catalog_raii.cpp4
-rw-r--r--src/mongo/db/storage/storage_engine_impl.cpp1
6 files changed, 21 insertions, 19 deletions
diff --git a/src/mongo/db/catalog/catalog_control.cpp b/src/mongo/db/catalog/catalog_control.cpp
index e08cc9f4a63..2e18a7a9155 100644
--- a/src/mongo/db/catalog/catalog_control.cpp
+++ b/src/mongo/db/catalog/catalog_control.cpp
@@ -85,13 +85,12 @@ MinVisibleTimestampMap closeCatalog(OperationContext* opCtx) {
}
// Need to mark the CollectionCatalog as open if we our closeAll fails, dismissed if successful.
- auto reopenOnFailure =
- makeGuard([opCtx] { CollectionCatalog::get(opCtx).onOpenCatalog(opCtx); });
+ auto reopenOnFailure = makeGuard([opCtx] { CollectionCatalog::get(opCtx).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::get(opCtx).onCloseCatalog(opCtx);
+ CollectionCatalog::get(opCtx).onCloseCatalog();
LOGV2_DEBUG(20270, 1, "closeCatalog: closing collection catalog");
// Close all databases.
@@ -206,7 +205,7 @@ void openCatalog(OperationContext* opCtx, const MinVisibleTimestampMap& minVisib
// Opening CollectionCatalog: The collection catalog is now in sync with the storage engine
// catalog. Clear the pre-closing state.
- CollectionCatalog::get(opCtx).onOpenCatalog(opCtx);
+ CollectionCatalog::get(opCtx).onOpenCatalog();
opCtx->getServiceContext()->incrementCatalogGeneration();
LOGV2(20278, "openCatalog: finished reloading collection catalog");
}
diff --git a/src/mongo/db/catalog/collection_catalog.cpp b/src/mongo/db/catalog/collection_catalog.cpp
index dbf5ec70b49..6b647a7523e 100644
--- a/src/mongo/db/catalog/collection_catalog.cpp
+++ b/src/mongo/db/catalog/collection_catalog.cpp
@@ -236,17 +236,19 @@ void CollectionCatalog::onCloseDatabase(OperationContext* opCtx, std::string dbN
removeResource(rid, dbName);
}
-void CollectionCatalog::onCloseCatalog(OperationContext* opCtx) {
- invariant(opCtx->lockState()->isW());
+void CollectionCatalog::onCloseCatalog() {
stdx::lock_guard<Latch> lock(_catalogLock);
- invariant(!_shadowCatalog);
+
+ 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() {
stdx::lock_guard<Latch> lock(_catalogLock);
invariant(_shadowCatalog);
_shadowCatalog.reset();
diff --git a/src/mongo/db/catalog/collection_catalog.h b/src/mongo/db/catalog/collection_catalog.h
index dce1a22b4d9..7bb15d6bae4 100644
--- a/src/mongo/db/catalog/collection_catalog.h
+++ b/src/mongo/db/catalog/collection_catalog.h
@@ -288,14 +288,14 @@ public:
*
* Must be called with the global lock acquired in exclusive mode.
*/
- void onCloseCatalog(OperationContext* opCtx);
+ void onCloseCatalog();
/**
* Puts the catatlog 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();
iterator begin(StringData db) const;
iterator end() const;
diff --git a/src/mongo/db/catalog/collection_catalog_test.cpp b/src/mongo/db/catalog/collection_catalog_test.cpp
index 58534df9008..2b022cc8320 100644
--- a/src/mongo/db/catalog/collection_catalog_test.cpp
+++ b/src/mongo/db/catalog/collection_catalog_test.cpp
@@ -528,11 +528,11 @@ TEST_F(CollectionCatalogTest, RenameCollection) {
}
TEST_F(CollectionCatalogTest, LookupNSSByUUIDForClosedCatalogReturnsOldNSSIfDropped) {
- catalog.onCloseCatalog(&opCtx);
+ catalog.onCloseCatalog();
catalog.deregisterCollection(colUUID);
ASSERT(catalog.lookupCollectionByUUID(&opCtx, colUUID) == nullptr);
ASSERT_EQUALS(*catalog.lookupNSSByUUID(&opCtx, colUUID), nss);
- catalog.onOpenCatalog(&opCtx);
+ catalog.onOpenCatalog();
ASSERT_EQUALS(catalog.lookupNSSByUUID(&opCtx, colUUID), boost::none);
}
@@ -543,7 +543,7 @@ TEST_F(CollectionCatalogTest, LookupNSSByUUIDForClosedCatalogReturnsNewlyCreated
auto newCol = newCollUnique.get();
// Ensure that looking up non-existing UUIDs doesn't affect later registration of those UUIDs.
- catalog.onCloseCatalog(&opCtx);
+ catalog.onCloseCatalog();
ASSERT(catalog.lookupCollectionByUUID(&opCtx, newUUID) == nullptr);
ASSERT_EQUALS(catalog.lookupNSSByUUID(&opCtx, newUUID), boost::none);
catalog.registerCollection(newUUID, &newCollUnique);
@@ -551,7 +551,7 @@ TEST_F(CollectionCatalogTest, LookupNSSByUUIDForClosedCatalogReturnsNewlyCreated
ASSERT_EQUALS(*catalog.lookupNSSByUUID(&opCtx, colUUID), nss);
// Ensure that collection still exists after opening the catalog again.
- catalog.onOpenCatalog(&opCtx);
+ catalog.onOpenCatalog();
ASSERT_EQUALS(catalog.lookupCollectionByUUID(&opCtx, newUUID), newCol);
ASSERT_EQUALS(*catalog.lookupNSSByUUID(&opCtx, colUUID), nss);
}
@@ -561,7 +561,7 @@ TEST_F(CollectionCatalogTest, LookupNSSByUUIDForClosedCatalogReturnsFreshestNSS)
std::unique_ptr<Collection> newCollUnique = std::make_unique<CollectionMock>(newNss);
auto newCol = newCollUnique.get();
- catalog.onCloseCatalog(&opCtx);
+ catalog.onCloseCatalog();
catalog.deregisterCollection(colUUID);
ASSERT(catalog.lookupCollectionByUUID(&opCtx, colUUID) == nullptr);
ASSERT_EQUALS(*catalog.lookupNSSByUUID(&opCtx, colUUID), nss);
@@ -570,7 +570,7 @@ TEST_F(CollectionCatalogTest, LookupNSSByUUIDForClosedCatalogReturnsFreshestNSS)
ASSERT_EQUALS(*catalog.lookupNSSByUUID(&opCtx, colUUID), newNss);
// Ensure that collection still exists after opening the catalog again.
- catalog.onOpenCatalog(&opCtx);
+ catalog.onOpenCatalog();
ASSERT_EQUALS(catalog.lookupCollectionByUUID(&opCtx, colUUID), newCol);
ASSERT_EQUALS(*catalog.lookupNSSByUUID(&opCtx, colUUID), newNss);
}
diff --git a/src/mongo/db/catalog_raii.cpp b/src/mongo/db/catalog_raii.cpp
index 20fec3ab116..481eae8d513 100644
--- a/src/mongo/db/catalog_raii.cpp
+++ b/src/mongo/db/catalog_raii.cpp
@@ -161,12 +161,12 @@ AutoGetOrCreateDb::AutoGetOrCreateDb(OperationContext* opCtx,
ConcealCollectionCatalogChangesBlock::ConcealCollectionCatalogChangesBlock(OperationContext* opCtx)
: _opCtx(opCtx) {
- CollectionCatalog::get(_opCtx).onCloseCatalog(_opCtx);
+ CollectionCatalog::get(_opCtx).onCloseCatalog();
}
ConcealCollectionCatalogChangesBlock::~ConcealCollectionCatalogChangesBlock() {
invariant(_opCtx);
- CollectionCatalog::get(_opCtx).onOpenCatalog(_opCtx);
+ CollectionCatalog::get(_opCtx).onOpenCatalog();
}
ReadSourceScope::ReadSourceScope(OperationContext* opCtx,
diff --git a/src/mongo/db/storage/storage_engine_impl.cpp b/src/mongo/db/storage/storage_engine_impl.cpp
index 1ea521e8392..59e4bf3cfc9 100644
--- a/src/mongo/db/storage/storage_engine_impl.cpp
+++ b/src/mongo/db/storage/storage_engine_impl.cpp
@@ -591,6 +591,7 @@ void StorageEngineImpl::cleanShutdown() {
_timestampMonitor->removeListener(&_minOfCheckpointAndOldestTimestampListener);
}
+ CollectionCatalog::get(getGlobalServiceContext()).onCloseCatalog();
CollectionCatalog::get(getGlobalServiceContext()).deregisterAllCollections();
_catalog.reset();