Skip to content

Commit 252c566

Browse files
committed
Merge pull request apache#8 from andrewor14/ui-refactor
Address Patrick's comments
2 parents 89dae36 + 125a054 commit 252c566

File tree

21 files changed

+36
-36
lines changed

21 files changed

+36
-36
lines changed

core/src/main/scala/org/apache/spark/deploy/history/HistoryPage.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import org.apache.spark.ui.{WebUIPage, UIUtils}
2525

2626
private[spark] class IndexPage(parent: HistoryServer) extends WebUIPage("") {
2727

28-
override def render(request: HttpServletRequest): Seq[Node] = {
28+
def render(request: HttpServletRequest): Seq[Node] = {
2929
val appRows = parent.appIdToInfo.values.toSeq.sortBy { app => -app.lastUpdated }
3030
val appTable = UIUtils.listingTable(appHeader, appRow, appRows)
3131
val content =

core/src/main/scala/org/apache/spark/deploy/history/HistoryServer.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ class HistoryServer(
131131
// Remove any applications that should no longer be retained
132132
appIdToInfo.foreach { case (appId, info) =>
133133
if (!retainedAppIds.contains(appId)) {
134-
detachUI(info.ui)
134+
detachSparkUI(info.ui)
135135
appIdToInfo.remove(appId)
136136
}
137137
}
@@ -173,7 +173,7 @@ class HistoryServer(
173173
// Do not call ui.bind() to avoid creating a new server for each application
174174
replayBus.replay()
175175
if (appListener.applicationStarted) {
176-
attachUI(ui)
176+
attachSparkUI(ui)
177177
val appName = appListener.appName
178178
val sparkUser = appListener.sparkUser
179179
val startTime = appListener.startTime
@@ -193,13 +193,13 @@ class HistoryServer(
193193
}
194194

195195
/** Attach a reconstructed UI to this server. Only valid after bind(). */
196-
private def attachUI(ui: SparkUI) {
196+
private def attachSparkUI(ui: SparkUI) {
197197
assert(serverInfo.isDefined, "HistoryServer must be bound before attaching SparkUIs")
198198
ui.getHandlers.foreach(attachHandler)
199199
}
200200

201201
/** Detach a reconstructed UI from this server. Only valid after bind(). */
202-
private def detachUI(ui: SparkUI) {
202+
private def detachSparkUI(ui: SparkUI) {
203203
assert(serverInfo.isDefined, "HistoryServer must be bound before detaching SparkUIs")
204204
ui.getHandlers.foreach(detachHandler)
205205
}

core/src/main/scala/org/apache/spark/deploy/master/Master.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -625,7 +625,7 @@ private[spark] class Master(
625625
if (completedApps.size >= RETAINED_APPLICATIONS) {
626626
val toRemove = math.max(RETAINED_APPLICATIONS / 10, 1)
627627
completedApps.take(toRemove).foreach( a => {
628-
appIdToUI.remove(a.id).foreach { ui => webUi.detachUI(ui) }
628+
appIdToUI.remove(a.id).foreach { ui => webUi.detachSparkUI(ui) }
629629
applicationMetricsSystem.removeSource(a.appSource)
630630
})
631631
completedApps.trimStart(toRemove)
@@ -672,7 +672,7 @@ private[spark] class Master(
672672
replayBus.replay()
673673
app.desc.appUiUrl = ui.basePath
674674
appIdToUI(app.id) = ui
675-
webUi.attachUI(ui)
675+
webUi.attachSparkUI(ui)
676676
return true
677677
} catch {
678678
case t: Throwable =>

core/src/main/scala/org/apache/spark/deploy/master/ui/ApplicationPage.scala

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,7 @@ import org.apache.spark.deploy.master.ExecutorInfo
3131
import org.apache.spark.ui.{WebUIPage, UIUtils}
3232
import org.apache.spark.util.Utils
3333

34-
private[spark] class ApplicationPage(parent: MasterWebUI)
35-
extends WebUIPage("app", includeJson = true) {
34+
private[spark] class ApplicationPage(parent: MasterWebUI) extends WebUIPage("app") {
3635

3736
private val master = parent.masterActorRef
3837
private val timeout = parent.timeout
@@ -49,7 +48,7 @@ private[spark] class ApplicationPage(parent: MasterWebUI)
4948
}
5049

5150
/** Executor details for a particular application */
52-
override def render(request: HttpServletRequest): Seq[Node] = {
51+
def render(request: HttpServletRequest): Seq[Node] = {
5352
val appId = request.getParameter("appId")
5453
val stateFuture = (master ? RequestMasterState)(timeout).mapTo[MasterStateResponse]
5554
val state = Await.result(stateFuture, timeout)

core/src/main/scala/org/apache/spark/deploy/master/ui/MasterPage.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import org.apache.spark.deploy.master.{ApplicationInfo, DriverInfo, WorkerInfo}
3131
import org.apache.spark.ui.{WebUIPage, UIUtils}
3232
import org.apache.spark.util.Utils
3333

34-
private[spark] class IndexPage(parent: MasterWebUI) extends WebUIPage("", includeJson = true) {
34+
private[spark] class IndexPage(parent: MasterWebUI) extends WebUIPage("") {
3535
private val master = parent.masterActorRef
3636
private val timeout = parent.timeout
3737

@@ -42,7 +42,7 @@ private[spark] class IndexPage(parent: MasterWebUI) extends WebUIPage("", includ
4242
}
4343

4444
/** Index view listing applications and executors */
45-
override def render(request: HttpServletRequest): Seq[Node] = {
45+
def render(request: HttpServletRequest): Seq[Node] = {
4646
val stateFuture = (master ? RequestMasterState)(timeout).mapTo[MasterStateResponse]
4747
val state = Await.result(stateFuture, timeout)
4848

core/src/main/scala/org/apache/spark/deploy/master/ui/MasterWebUI.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,13 @@ class MasterWebUI(val master: Master, requestedPort: Int)
4545
}
4646

4747
/** Attach a reconstructed UI to this Master UI. Only valid after bind(). */
48-
def attachUI(ui: SparkUI) {
48+
def attachSparkUI(ui: SparkUI) {
4949
assert(serverInfo.isDefined, "Master UI must be bound to a server before attaching SparkUIs")
5050
ui.getHandlers.foreach(attachHandler)
5151
}
5252

5353
/** Detach a reconstructed UI from this Master UI. Only valid after bind(). */
54-
def detachUI(ui: SparkUI) {
54+
def detachSparkUI(ui: SparkUI) {
5555
assert(serverInfo.isDefined, "Master UI must be bound to a server before detaching SparkUIs")
5656
ui.getHandlers.foreach(detachHandler)
5757
}

core/src/main/scala/org/apache/spark/deploy/worker/ui/LogPage.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ private[spark] class LogPage(parent: WorkerWebUI) extends WebUIPage("logPage") {
5656
pre + Utils.offsetBytes(path, startByte, endByte)
5757
}
5858

59-
override def render(request: HttpServletRequest): Seq[Node] = {
59+
def render(request: HttpServletRequest): Seq[Node] = {
6060
val defaultBytes = 100 * 1024
6161
val appId = Option(request.getParameter("appId"))
6262
val executorId = Option(request.getParameter("executorId"))

core/src/main/scala/org/apache/spark/deploy/worker/ui/WorkerPage.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import org.apache.spark.deploy.worker.{DriverRunner, ExecutorRunner}
3131
import org.apache.spark.ui.{WebUIPage, UIUtils}
3232
import org.apache.spark.util.Utils
3333

34-
private[spark] class IndexPage(parent: WorkerWebUI) extends WebUIPage("", includeJson = true) {
34+
private[spark] class IndexPage(parent: WorkerWebUI) extends WebUIPage("") {
3535
val workerActor = parent.worker.self
3636
val worker = parent.worker
3737
val timeout = parent.timeout
@@ -42,7 +42,7 @@ private[spark] class IndexPage(parent: WorkerWebUI) extends WebUIPage("", includ
4242
JsonProtocol.writeWorkerState(workerState)
4343
}
4444

45-
override def render(request: HttpServletRequest): Seq[Node] = {
45+
def render(request: HttpServletRequest): Seq[Node] = {
4646
val stateFuture = (workerActor ? RequestWorkerState)(timeout).mapTo[WorkerStateResponse]
4747
val workerState = Await.result(stateFuture, timeout)
4848

core/src/main/scala/org/apache/spark/ui/JettyUtils.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ private[spark] object JettyUtils extends Logging {
119119
/** Create a handler for serving files from a static directory */
120120
def createStaticHandler(resourceBase: String, path: String): ServletContextHandler = {
121121
val contextHandler = new ServletContextHandler
122+
contextHandler.setInitParameter("org.eclipse.jetty.servlet.Default.gzip", "false")
122123
val staticHandler = new DefaultServlet
123124
val holder = new ServletHolder(staticHandler)
124125
Option(getClass.getClassLoader.getResource(resourceBase)) match {

core/src/main/scala/org/apache/spark/ui/SparkUI.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import org.apache.spark.ui.jobs.JobProgressTab
2727
import org.apache.spark.ui.storage.StorageTab
2828

2929
/**
30-
* Top level user interface for Spark.
30+
* Top level user interface for a Spark application.
3131
*/
3232
private[spark] class SparkUI(
3333
val sc: SparkContext,

core/src/main/scala/org/apache/spark/ui/UIUtils.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ private[spark] object UIUtils extends Logging {
229229
tableClass += " table-fixed"
230230
}
231231
val colWidth = 100.toDouble / headers.size
232-
val colWidthAttr =if (fixedWidth) colWidth + "%" else ""
232+
val colWidthAttr = if (fixedWidth) colWidth + "%" else ""
233233
val headerRow: Seq[Node] = {
234234
// if none of the headers have "\n" in them
235235
if (headers.forall(!_.contains("\n"))) {

core/src/main/scala/org/apache/spark/ui/WebUI.scala

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,8 @@ private[spark] abstract class WebUI(
6363
val pagePath = "/" + page.prefix
6464
attachHandler(createServletHandler(pagePath,
6565
(request: HttpServletRequest) => page.render(request), securityManager, basePath))
66-
if (page.includeJson) {
67-
attachHandler(createServletHandler(pagePath.stripSuffix("/") + "/json",
68-
(request: HttpServletRequest) => page.renderJson(request), securityManager, basePath))
69-
}
66+
attachHandler(createServletHandler(pagePath.stripSuffix("/") + "/json",
67+
(request: HttpServletRequest) => page.renderJson(request), securityManager, basePath))
7068
}
7169

7270
/** Attach a handler to this UI. */
@@ -121,6 +119,7 @@ private[spark] abstract class WebUI(
121119

122120
/**
123121
* A tab that represents a collection of pages.
122+
* The prefix is appended to the parent address to form a full path, and must not contain slashes.
124123
*/
125124
private[spark] abstract class WebUITab(parent: WebUI, val prefix: String) {
126125
val pages = ArrayBuffer[WebUIPage]()
@@ -141,10 +140,11 @@ private[spark] abstract class WebUITab(parent: WebUI, val prefix: String) {
141140
* A page that represents the leaf node in the UI hierarchy.
142141
*
143142
* The direct parent of a WebUIPage is not specified as it can be either a WebUI or a WebUITab.
144-
* If includeJson is true, the parent WebUI (direct or indirect) creates handlers for both the
145-
* HTML and the JSON content, rather than just the former.
143+
* If the parent is a WebUI, the prefix is appended to the parent's address to form a full path.
144+
* Else, if the parent is a WebUITab, the prefix is appended to the super prefix of the parent
145+
* to form a relative path. The prefix must not contain slashes.
146146
*/
147-
private[spark] abstract class WebUIPage(var prefix: String, val includeJson: Boolean = false) {
148-
def render(request: HttpServletRequest): Seq[Node] = Seq[Node]()
147+
private[spark] abstract class WebUIPage(var prefix: String) {
148+
def render(request: HttpServletRequest): Seq[Node]
149149
def renderJson(request: HttpServletRequest): JValue = JNothing
150150
}

core/src/main/scala/org/apache/spark/ui/env/EnvironmentPage.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ private[ui] class IndexPage(parent: EnvironmentTab) extends WebUIPage("") {
2828
private val basePath = parent.basePath
2929
private val listener = parent.listener
3030

31-
override def render(request: HttpServletRequest): Seq[Node] = {
31+
def render(request: HttpServletRequest): Seq[Node] = {
3232
val runtimeInformationTable = UIUtils.listingTable(
3333
propertyHeader, jvmRow, listener.jvmInformation, fixedWidth = true)
3434
val sparkPropertiesTable = UIUtils.listingTable(

core/src/main/scala/org/apache/spark/ui/exec/ExecutorsPage.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ private[ui] class IndexPage(parent: ExecutorsTab) extends WebUIPage("") {
2929
private val basePath = parent.basePath
3030
private val listener = parent.listener
3131

32-
override def render(request: HttpServletRequest): Seq[Node] = {
32+
def render(request: HttpServletRequest): Seq[Node] = {
3333
val storageStatusList = listener.storageStatusList
3434
val maxMem = storageStatusList.map(_.maxMem).fold(0L)(_ + _)
3535
val memUsed = storageStatusList.map(_.memUsed()).fold(0L)(_ + _)

core/src/main/scala/org/apache/spark/ui/jobs/JobProgressPage.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ private[ui] class IndexPage(parent: JobProgressTab) extends WebUIPage("") {
3333
private val listener = parent.listener
3434
private lazy val isFairScheduler = parent.isFairScheduler
3535

36-
override def render(request: HttpServletRequest): Seq[Node] = {
36+
def render(request: HttpServletRequest): Seq[Node] = {
3737
listener.synchronized {
3838
val activeStages = listener.activeStages.values.toSeq
3939
val completedStages = listener.completedStages.reverse.toSeq

core/src/main/scala/org/apache/spark/ui/jobs/PoolPage.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ private[ui] class PoolPage(parent: JobProgressTab) extends WebUIPage("pool") {
3232
private val sc = parent.sc
3333
private val listener = parent.listener
3434

35-
override def render(request: HttpServletRequest): Seq[Node] = {
35+
def render(request: HttpServletRequest): Seq[Node] = {
3636
listener.synchronized {
3737
val poolName = request.getParameter("poolname")
3838
val poolToActiveStages = listener.poolToActiveStages

core/src/main/scala/org/apache/spark/ui/jobs/StagePage.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ private[ui] class StagePage(parent: JobProgressTab) extends WebUIPage("stage") {
3131
private val basePath = parent.basePath
3232
private val listener = parent.listener
3333

34-
override def render(request: HttpServletRequest): Seq[Node] = {
34+
def render(request: HttpServletRequest): Seq[Node] = {
3535
listener.synchronized {
3636
val stageId = request.getParameter("id").toInt
3737

core/src/main/scala/org/apache/spark/ui/storage/RDDPage.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ private[ui] class RddPage(parent: StorageTab) extends WebUIPage("rdd") {
3131
private val basePath = parent.basePath
3232
private val listener = parent.listener
3333

34-
override def render(request: HttpServletRequest): Seq[Node] = {
34+
def render(request: HttpServletRequest): Seq[Node] = {
3535
val rddId = request.getParameter("id").toInt
3636
val storageStatusList = listener.storageStatusList
3737
val rddInfo = listener.rddInfoList.find(_.id == rddId).getOrElse {

core/src/main/scala/org/apache/spark/ui/storage/StoragePage.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ private[ui] class IndexPage(parent: StorageTab) extends WebUIPage("") {
3131
private val basePath = parent.basePath
3232
private val listener = parent.listener
3333

34-
override def render(request: HttpServletRequest): Seq[Node] = {
34+
def render(request: HttpServletRequest): Seq[Node] = {
3535
val rdds = listener.rddInfoList
3636
val content = UIUtils.listingTable(rddHeader, rddRow, rdds)
3737
UIUtils.headerSparkPage(content, basePath, appName, "Storage ", parent.headerTabs, parent)

core/src/test/scala/org/apache/spark/ui/UISuite.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ class UISuite extends FunSuite {
6565

6666
val newTab = new WebUITab(sparkUI, "foo") {
6767
attachPage(new WebUIPage("") {
68-
override def render(request: HttpServletRequest): Seq[Node] = {
68+
def render(request: HttpServletRequest): Seq[Node] = {
6969
<b>"html magic"</b>
7070
}
7171
})

streaming/src/main/scala/org/apache/spark/streaming/ui/StreamingPage.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ private[ui] class StreamingPage(parent: StreamingTab)
3636
private val emptyCellTest = "-"
3737

3838
/** Render the page */
39-
override def render(request: HttpServletRequest): Seq[Node] = {
39+
def render(request: HttpServletRequest): Seq[Node] = {
4040
val content =
4141
generateBasicStats() ++
4242
<br></br><h4>Statistics over last {listener.completedBatches.size} processed batches</h4> ++

0 commit comments

Comments
 (0)