diff --git a/auron-spark-ui/src/main/scala/org/apache/spark/sql/execution/ui/AuronAllExecutionsPage.scala b/auron-spark-ui/src/main/scala/org/apache/spark/sql/execution/ui/AuronAllExecutionsPage.scala index 56f96d959..840abca67 100644 --- a/auron-spark-ui/src/main/scala/org/apache/spark/sql/execution/ui/AuronAllExecutionsPage.scala +++ b/auron-spark-ui/src/main/scala/org/apache/spark/sql/execution/ui/AuronAllExecutionsPage.scala @@ -29,52 +29,12 @@ private[ui] class AuronAllExecutionsPage(parent: AuronSQLTab) extends WebUIPage( @sparkver("3.0 / 3.1 / 3.2 / 3.3 / 3.4 / 3.5") override def render(request: javax.servlet.http.HttpServletRequest): Seq[Node] = { - val buildInfo = sqlStore.buildInfo() - val infos = - UIUtils.listingTable(propertyHeader, propertyRow, buildInfo.info, fixedWidth = true) - val summary: NodeSeq = -
-
- -

- - Auron Build Information -

-
-
- {infos} -
-
-
-
- - UIUtils.headerSparkPage(request, "Auron", summary, parent) + UIUtils.headerSparkPage(request, "Auron", buildInfoSummary(sqlStore.buildInfo()), parent) } @sparkver("4.0 / 4.1") override def render(request: jakarta.servlet.http.HttpServletRequest): Seq[Node] = { - val buildInfo = sqlStore.buildInfo() - val infos = - UIUtils.listingTable(propertyHeader, propertyRow, buildInfo.info, fixedWidth = true) - val summary: NodeSeq = -
-
- -

- - Auron Build Information -

-
-
- {infos} -
-
-
-
- - UIUtils.headerSparkPage(request, "Auron", summary, parent) + UIUtils.headerSparkPage(request, "Auron", buildInfoSummary(sqlStore.buildInfo()), parent) } private def propertyHeader = Seq("Name", "Value") @@ -87,4 +47,34 @@ private[ui] class AuronAllExecutionsPage(parent: AuronSQLTab) extends WebUIPage( + private def buildInfoSummary(buildInfoOpt: Option[AuronBuildInfoUIData]): NodeSeq = { + buildInfoOpt match { + case Some(buildInfo) => + val infos = + UIUtils.listingTable(propertyHeader, propertyRow, buildInfo.info, fixedWidth = true) +
+
+ +

+ + Auron Build Information +

+
+
+ {infos} +
+
+
+
+ case None => + // Show a friendly empty state instead of failing or rendering a blank page. +
+
+ Auron build information is not available for this application. +
+
+ } + } + } diff --git a/auron-spark-ui/src/main/scala/org/apache/spark/sql/execution/ui/AuronSQLAppStatusStore.scala b/auron-spark-ui/src/main/scala/org/apache/spark/sql/execution/ui/AuronSQLAppStatusStore.scala index 3fc4beb69..c37423e1a 100644 --- a/auron-spark-ui/src/main/scala/org/apache/spark/sql/execution/ui/AuronSQLAppStatusStore.scala +++ b/auron-spark-ui/src/main/scala/org/apache/spark/sql/execution/ui/AuronSQLAppStatusStore.scala @@ -16,14 +16,22 @@ */ package org.apache.spark.sql.execution.ui +import scala.util.control.NonFatal + import com.fasterxml.jackson.annotation.JsonIgnore import org.apache.spark.util.kvstore.{KVIndex, KVStore} class AuronSQLAppStatusStore(store: KVStore) { - def buildInfo(): AuronBuildInfoUIData = { + def buildInfo(): Option[AuronBuildInfoUIData] = { val kClass = classOf[AuronBuildInfoUIData] - store.read(kClass, kClass.getName) + // KVStore throws when the record doesn't exist; treat missing data as "no build info". + try { + Option(store.read(kClass, kClass.getName)) + } catch { + case _: NoSuchElementException => None + case NonFatal(_) => None + } } } diff --git a/auron-spark-ui/src/main/scala/org/apache/spark/sql/execution/ui/AuronSQLHistoryServerPlugin.scala b/auron-spark-ui/src/main/scala/org/apache/spark/sql/execution/ui/AuronSQLHistoryServerPlugin.scala index 3ea7b5ad3..5628d9c4b 100644 --- a/auron-spark-ui/src/main/scala/org/apache/spark/sql/execution/ui/AuronSQLHistoryServerPlugin.scala +++ b/auron-spark-ui/src/main/scala/org/apache/spark/sql/execution/ui/AuronSQLHistoryServerPlugin.scala @@ -31,9 +31,7 @@ class AuronSQLHistoryServerPlugin extends AppHistoryServerPlugin { override def setupUI(ui: SparkUI): Unit = { val sqlStatusStore = new AuronSQLAppStatusStore(ui.store.store) - if (sqlStatusStore.buildInfo() != null) { - new AuronSQLTab(sqlStatusStore, ui) - } + new AuronSQLTab(sqlStatusStore, ui) } override def displayOrder: Int = 0