From c45a62c24761110505161ce4ecc263f4bfce9c59 Mon Sep 17 00:00:00 2001 From: Geert Bosch Date: Mon, 16 Apr 2018 16:19:13 -0400 Subject: SERVER-33632 UUIDCatalog queries fall back to pre-close state While the UUIDCatalog is closed for reloading during rollback and catalog reload, queries by UUID may need to resolve the NSS for authorization purposes before taking locks. Use a shadow catalog to allow such name resolution. --- src/mongo/db/catalog/catalog_control.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'src/mongo/db/catalog/catalog_control.cpp') diff --git a/src/mongo/db/catalog/catalog_control.cpp b/src/mongo/db/catalog/catalog_control.cpp index ea06eb9df67..684862b6a9f 100644 --- a/src/mongo/db/catalog/catalog_control.cpp +++ b/src/mongo/db/catalog/catalog_control.cpp @@ -46,6 +46,13 @@ namespace catalog { void closeCatalog(OperationContext* opCtx) { invariant(opCtx->lockState()->isW()); + // Closing UUID Catalog: 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. + UUIDCatalog::get(opCtx).onCloseCatalog(); + LOG(1) << "closeCatalog: closing UUID catalog"; + // Close all databases. log() << "closeCatalog: closing all databases"; constexpr auto reason = "closing databases for closeCatalog"; @@ -166,6 +173,10 @@ void openCatalog(OperationContext* opCtx) { } } } + // Opening UUID Catalog: The UUID catalog is now in sync with the storage engine catalog. Clear + // the pre-closing state. + UUIDCatalog::get(opCtx).onOpenCatalog(); + LOG(1) << "openCatalog: finished reloading UUID catalog"; } } // namespace catalog } // namespace mongo -- cgit v1.2.1