diff options
Diffstat (limited to 'src/mongo')
-rw-r--r-- | src/mongo/db/catalog/catalog_control.cpp | 7 | ||||
-rw-r--r-- | src/mongo/db/catalog/collection_catalog.cpp | 12 | ||||
-rw-r--r-- | src/mongo/db/catalog/collection_catalog.h | 4 | ||||
-rw-r--r-- | src/mongo/db/catalog/collection_catalog_test.cpp | 12 | ||||
-rw-r--r-- | src/mongo/db/catalog_raii.cpp | 4 | ||||
-rw-r--r-- | src/mongo/db/storage/storage_engine_impl.cpp | 1 |
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(); |