diff --git a/common/workflow-core/src/main/scala/org/apache/texera/amber/core/storage/IcebergCatalogInstance.scala b/common/workflow-core/src/main/scala/org/apache/texera/amber/core/storage/IcebergCatalogInstance.scala index 313772b0fcb..bd63785d44d 100644 --- a/common/workflow-core/src/main/scala/org/apache/texera/amber/core/storage/IcebergCatalogInstance.scala +++ b/common/workflow-core/src/main/scala/org/apache/texera/amber/core/storage/IcebergCatalogInstance.scala @@ -70,9 +70,14 @@ object IcebergCatalogInstance { */ def getInstance(warehouse: Option[String] = None): Catalog = { val name = warehouse.getOrElse(defaultWarehouse) - synchronized { - catalogs.getOrElseUpdate(cacheKey(name), createCatalog(name)) + val key = cacheKey(name) + // Read the cache outside the lock: building a catalog can block on the + // REST endpoint, and holding the monitor for that long stalls every other + // warehouse's first access. + if (!catalogs.contains(key)) { + catalogs.put(key, createCatalog(name)) } + catalogs(key) } private def createCatalog(warehouse: String): Catalog =