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 =
-
-
- 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 =
-
-
- 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)
+
+ 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