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..0c44644ff 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,25 @@
*/
package org.apache.spark.sql.execution.ui
+import scala.util.control.NonFatal
+
import com.fasterxml.jackson.annotation.JsonIgnore
+import org.apache.spark.internal.Logging
import org.apache.spark.util.kvstore.{KVIndex, KVStore}
-class AuronSQLAppStatusStore(store: KVStore) {
+class AuronSQLAppStatusStore(store: KVStore) extends Logging {
- 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(e) =>
+ logWarning("Failed to read BuildInfo from KVStore", e)
+ 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