Skip to content
Snippets Groups Projects
Commit 800bd799 authored by Forest Fang's avatar Forest Fang Committed by Sean Owen
Browse files

[SPARK-11906][WEB UI] Speculation Tasks Cause ProgressBar UI Overflow

When there are speculative tasks in the stage, running progress bar could overflow and goes hidden on a new line:
![image](https://cloud.githubusercontent.com/assets/4317392/11326841/5fd3482e-9142-11e5-8ca5-cb2f0c0c8964.png)
3 completed / 2 running (including 1 speculative) out of 4 total tasks

This is a simple fix by capping the started tasks at `total - completed` tasks
![image](https://cloud.githubusercontent.com/assets/4317392/11326842/6bb67260-9142-11e5-90f0-37f9174878ec.png)

I should note my preferred way to fix it is via css style
```css
.progress { display: flex; }
```
which shifts the correction burden from driver to web browser. However I couldn't get selenium test to measure the position/dimension of the progress bar correctly to get this unit tested.

It also has the side effect that the width will be calibrated so the running occupies 2 / 5 instead of 1 / 4.
![image](https://cloud.githubusercontent.com/assets/4317392/11326848/7b03e9f0-9142-11e5-89ad-bd99cb0647cf.png)

All in all, since this cosmetic bug is minor enough, I suppose the original simple fix should be good enough.

Author: Forest Fang <forest.fang@outlook.com>

Closes #9896 from saurfang/progressbar.
parent 12eea834
No related branches found
No related tags found
No related merge requests found
...@@ -319,7 +319,9 @@ private[spark] object UIUtils extends Logging { ...@@ -319,7 +319,9 @@ private[spark] object UIUtils extends Logging {
skipped: Int, skipped: Int,
total: Int): Seq[Node] = { total: Int): Seq[Node] = {
val completeWidth = "width: %s%%".format((completed.toDouble/total)*100) val completeWidth = "width: %s%%".format((completed.toDouble/total)*100)
val startWidth = "width: %s%%".format((started.toDouble/total)*100) // started + completed can be > total when there are speculative tasks
val boundedStarted = math.min(started, total - completed)
val startWidth = "width: %s%%".format((boundedStarted.toDouble/total)*100)
<div class="progress"> <div class="progress">
<span style="text-align:center; position:absolute; width:100%; left:0;"> <span style="text-align:center; position:absolute; width:100%; left:0;">
......
...@@ -57,6 +57,16 @@ class UIUtilsSuite extends SparkFunSuite { ...@@ -57,6 +57,16 @@ class UIUtilsSuite extends SparkFunSuite {
) )
} }
test("SPARK-11906: Progress bar should not overflow because of speculative tasks") {
val generated = makeProgressBar(2, 3, 0, 0, 4).head.child.filter(_.label == "div")
val expected = Seq(
<div class="bar bar-completed" style="width: 75.0%"></div>,
<div class="bar bar-running" style="width: 25.0%"></div>
)
assert(generated.sameElements(expected),
s"\nRunning progress bar should round down\n\nExpected:\n$expected\nGenerated:\n$generated")
}
private def verify( private def verify(
desc: String, expected: Elem, errorMsg: String = "", baseUrl: String = ""): Unit = { desc: String, expected: Elem, errorMsg: String = "", baseUrl: String = ""): Unit = {
val generated = makeDescription(desc, baseUrl) val generated = makeDescription(desc, baseUrl)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment