diff --git a/core/src/main/scala/org/apache/spark/scheduler/TaskInfo.scala b/core/src/main/scala/org/apache/spark/scheduler/TaskInfo.scala
index 6fa1f2c880f7..132a9ced7770 100644
--- a/core/src/main/scala/org/apache/spark/scheduler/TaskInfo.scala
+++ b/core/src/main/scala/org/apache/spark/scheduler/TaskInfo.scala
@@ -81,9 +81,11 @@ class TaskInfo(
def status: String = {
if (running) {
- "RUNNING"
- } else if (gettingResult) {
- "GET RESULT"
+ if (gettingResult) {
+ "GET RESULT"
+ } else {
+ "RUNNING"
+ }
} else if (failed) {
"FAILED"
} else if (successful) {
diff --git a/core/src/main/scala/org/apache/spark/ui/jobs/StagePage.scala b/core/src/main/scala/org/apache/spark/ui/jobs/StagePage.scala
index 110f8780a9a1..a1215562eb42 100644
--- a/core/src/main/scala/org/apache/spark/ui/jobs/StagePage.scala
+++ b/core/src/main/scala/org/apache/spark/ui/jobs/StagePage.scala
@@ -268,11 +268,7 @@ private[ui] class StagePage(parent: StagesTab) extends WebUIPage("stage") {
+: getFormattedTimeQuantiles(serializationTimes)
val gettingResultTimes = validTasks.map { case TaskUIData(info, _, _) =>
- if (info.gettingResultTime > 0) {
- (info.finishTime - info.gettingResultTime).toDouble
- } else {
- 0.0
- }
+ getGettingResultTime(info).toDouble
}
val gettingResultQuantiles =
@@ -462,7 +458,7 @@ private[ui] class StagePage(parent: StagesTab) extends WebUIPage("stage") {
val gcTime = metrics.map(_.jvmGCTime).getOrElse(0L)
val taskDeserializationTime = metrics.map(_.executorDeserializeTime).getOrElse(0L)
val serializationTime = metrics.map(_.resultSerializationTime).getOrElse(0L)
- val gettingResultTime = info.gettingResultTime
+ val gettingResultTime = getGettingResultTime(info)
val maybeAccumulators = info.accumulables
val accumulatorsReadable = maybeAccumulators.map{acc => s"${acc.name}: ${acc.update.get}"}
@@ -625,6 +621,19 @@ private[ui] class StagePage(parent: StagesTab) extends WebUIPage("stage") {
| {errorSummary}{details} |
}
+ private def getGettingResultTime(info: TaskInfo): Long = {
+ if (info.gettingResultTime > 0) {
+ if (info.finishTime > 0) {
+ info.finishTime - info.gettingResultTime
+ } else {
+ // The task is still fetching the result.
+ System.currentTimeMillis - info.gettingResultTime
+ }
+ } else {
+ 0L
+ }
+ }
+
private def getSchedulerDelay(info: TaskInfo, metrics: TaskMetrics): Long = {
val totalExecutionTime =
if (info.gettingResult) {
@@ -636,6 +645,8 @@ private[ui] class StagePage(parent: StagesTab) extends WebUIPage("stage") {
}
val executorOverhead = (metrics.executorDeserializeTime +
metrics.resultSerializationTime)
- math.max(0, totalExecutionTime - metrics.executorRunTime - executorOverhead)
+ math.max(
+ 0,
+ totalExecutionTime - metrics.executorRunTime - executorOverhead - getGettingResultTime(info))
}
}