Skip to content

Commit ca509d3

Browse files
committed
Add fullStackTrace to the constructor of ExceptionFailure
1 parent a07057b commit ca509d3

File tree

5 files changed

+10
-19
lines changed

5 files changed

+10
-19
lines changed

core/src/main/scala/org/apache/spark/TaskEndReason.scala

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -89,26 +89,18 @@ case class ExceptionFailure(
8989
className: String,
9090
description: String,
9191
stackTrace: Array[StackTraceElement],
92+
fullStackTrace: String,
9293
metrics: Option[TaskMetrics])
9394
extends TaskFailedReason {
9495

95-
/** The stack trace message with a full (recursive) stack trace. */
96-
private var fullStackTrace: String = null
97-
9896
private[spark] def this(e: Throwable, metrics: Option[TaskMetrics]) {
99-
this(e.getClass.getName, e.getMessage, e.getStackTrace, metrics)
100-
fullStackTrace = Utils.exceptionString(e)
101-
}
102-
103-
private[spark] def getFullStackTrace: String = fullStackTrace
104-
105-
private[spark] def setFullStackTrace(fullStackTrace: String): this.type = {
106-
this.fullStackTrace = fullStackTrace
107-
this
97+
this(e.getClass.getName, e.getMessage, e.getStackTrace, Utils.exceptionString(e), metrics)
10898
}
10999

110100
override def toErrorString: String =
111101
if (fullStackTrace == null) {
102+
// fullStackTrace is added in 1.2.0
103+
// If fullStackTrace is null, use the old error string for backward compatibility
112104
Utils.exceptionString(className, description, stackTrace)
113105
} else {
114106
fullStackTrace

core/src/main/scala/org/apache/spark/scheduler/DAGScheduler.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1094,7 +1094,7 @@ class DAGScheduler(
10941094
handleExecutorLost(bmAddress.executorId, fetchFailed = true, Some(task.epoch))
10951095
}
10961096

1097-
case ExceptionFailure(className, description, stackTrace, metrics) =>
1097+
case ExceptionFailure(className, description, stackTrace, fullStackTrace, metrics) =>
10981098
// Do nothing here, left up to the TaskScheduler to decide how to handle user failures
10991099

11001100
case TaskResultLost =>

core/src/main/scala/org/apache/spark/util/JsonProtocol.scala

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ private[spark] object JsonProtocol {
287287
("Class Name" -> exceptionFailure.className) ~
288288
("Description" -> exceptionFailure.description) ~
289289
("Stack Trace" -> stackTrace) ~
290-
("Full Stack Trace" -> exceptionFailure.getFullStackTrace) ~
290+
("Full Stack Trace" -> exceptionFailure.fullStackTrace) ~
291291
("Metrics" -> metrics)
292292
case ExecutorLostFailure(executorId) =>
293293
("Executor ID" -> executorId)
@@ -641,8 +641,7 @@ private[spark] object JsonProtocol {
641641
val fullStackTrace = Utils.jsonOption(json \ "Full Stack Trace").
642642
map(_.extract[String]).orNull
643643
val metrics = Utils.jsonOption(json \ "Metrics").map(taskMetricsFromJson)
644-
ExceptionFailure(className, description, stackTrace, metrics).
645-
setFullStackTrace(fullStackTrace)
644+
ExceptionFailure(className, description, stackTrace, fullStackTrace, metrics)
646645
case `taskResultLost` => TaskResultLost
647646
case `taskKilled` => TaskKilled
648647
case `executorLostFailure` =>

core/src/test/scala/org/apache/spark/ui/jobs/JobProgressListenerSuite.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ class JobProgressListenerSuite extends FunSuite with LocalSparkContext with Matc
116116
val taskFailedReasons = Seq(
117117
Resubmitted,
118118
new FetchFailed(null, 0, 0, 0, "ignored"),
119-
new ExceptionFailure("Exception", "description", null, None),
119+
ExceptionFailure("Exception", "description", null, null, None),
120120
TaskResultLost,
121121
TaskKilled,
122122
ExecutorLostFailure("0"),

core/src/test/scala/org/apache/spark/util/JsonProtocolSuite.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ class JsonProtocolSuite extends FunSuite {
128128
}
129129

130130
test("ExceptionFailure backward compatibility") {
131-
val exceptionFailure = ExceptionFailure("To be", "or not to be", stackTrace, None)
131+
val exceptionFailure = ExceptionFailure("To be", "or not to be", stackTrace, null, None)
132132
val oldEvent = JsonProtocol.taskEndReasonToJson(exceptionFailure)
133133
.removeField({ _._1 == "Full Stack Trace" })
134134
assertEquals(exceptionFailure, JsonProtocol.taskEndReasonFromJson(oldEvent))
@@ -409,8 +409,8 @@ class JsonProtocolSuite extends FunSuite {
409409
assert(r1.className === r2.className)
410410
assert(r1.description === r2.description)
411411
assertSeqEquals(r1.stackTrace, r2.stackTrace, assertStackTraceElementEquals)
412+
assert(r1.fullStackTrace === r2.fullStackTrace)
412413
assertOptionEquals(r1.metrics, r2.metrics, assertTaskMetricsEquals)
413-
assert(r1.getFullStackTrace === r2.getFullStackTrace)
414414
case (TaskResultLost, TaskResultLost) =>
415415
case (TaskKilled, TaskKilled) =>
416416
case (ExecutorLostFailure(execId1), ExecutorLostFailure(execId2)) =>

0 commit comments

Comments
 (0)