Skip to content

Commit dfb0032

Browse files
committed
Backward compatibility for old history server
1 parent 1e50f71 commit dfb0032

File tree

4 files changed

+39
-29
lines changed

4 files changed

+39
-29
lines changed

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

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,11 +88,32 @@ case class FetchFailed(
8888
case class ExceptionFailure(
8989
className: String,
9090
description: String,
91-
stackTrace: String,
91+
stackTrace: Array[StackTraceElement], // backwards compatibility
9292
metrics: Option[TaskMetrics])
9393
extends TaskFailedReason {
9494

95-
override def toErrorString: String = stackTrace
95+
/** The stack trace message with a full (recursive) stack trace. */
96+
private var fullStackTrace: String = null
97+
98+
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
108+
}
109+
110+
override def toErrorString: String =
111+
if (fullStackTrace == null) {
112+
Utils.exceptionString(className, description, stackTrace)
113+
}
114+
else {
115+
fullStackTrace
116+
}
96117
}
97118

98119
/**

core/src/main/scala/org/apache/spark/executor/Executor.scala

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -257,8 +257,7 @@ private[spark] class Executor(
257257
m.executorRunTime = serviceTime
258258
m.jvmGCTime = gcTime - startGCTime
259259
}
260-
val reason = ExceptionFailure(t.getClass.getName, t.getMessage, Utils.exceptionString(t),
261-
metrics)
260+
val reason = new ExceptionFailure(t, metrics)
262261
execBackend.statusUpdate(taskId, TaskState.FAILED, ser.serialize(reason))
263262

264263
// Don't forcibly exit unless the exception was inherently fatal, to avoid

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -282,10 +282,12 @@ private[spark] object JsonProtocol {
282282
("Reduce ID" -> fetchFailed.reduceId) ~
283283
("Message" -> fetchFailed.message)
284284
case exceptionFailure: ExceptionFailure =>
285+
val stackTrace = stackTraceToJson(exceptionFailure.stackTrace)
285286
val metrics = exceptionFailure.metrics.map(taskMetricsToJson).getOrElse(JNothing)
286287
("Class Name" -> exceptionFailure.className) ~
287288
("Description" -> exceptionFailure.description) ~
288-
("Full Stack Trace" -> exceptionFailure.stackTrace) ~
289+
("Stack Trace" -> stackTrace) ~
290+
("Full Stack Trace" -> exceptionFailure.getFullStackTrace) ~
289291
("Metrics" -> metrics)
290292
case ExecutorLostFailure(executorId) =>
291293
("Executor ID" -> executorId)
@@ -635,14 +637,12 @@ private[spark] object JsonProtocol {
635637
case `exceptionFailure` =>
636638
val className = (json \ "Class Name").extract[String]
637639
val description = (json \ "Description").extract[String]
638-
val stackTrace = Utils.jsonOption(json \ "Full Stack Trace").map(_.extract[String]).
639-
getOrElse {
640-
// backward compatibility
641-
val oldStackTrace = stackTraceFromJson(json \ "Stack Trace")
642-
Utils.exceptionString(className, description, oldStackTrace)
643-
}
640+
val stackTrace = stackTraceFromJson(json \ "Stack Trace")
641+
val fullStackTrace = Utils.jsonOption(json \ "Full Stack Trace").
642+
map(_.extract[String]).orNull
644643
val metrics = Utils.jsonOption(json \ "Metrics").map(taskMetricsFromJson)
645-
ExceptionFailure(className, description, stackTrace, metrics)
644+
ExceptionFailure(className, description, stackTrace, metrics).
645+
setFullStackTrace(fullStackTrace)
646646
case `taskResultLost` => TaskResultLost
647647
case `taskKilled` => TaskKilled
648648
case `executorLostFailure` =>

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

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,7 @@ class JsonProtocolSuite extends FunSuite {
109109
// TaskEndReason
110110
val fetchFailed = FetchFailed(BlockManagerId("With or", "without you", 15), 17, 18, 19,
111111
"Some exception")
112-
val exceptionFailure = ExceptionFailure("To be", "or not to be",
113-
Utils.exceptionString(exception), None)
112+
val exceptionFailure = new ExceptionFailure(exception, None)
114113
testTaskEndReason(Success)
115114
testTaskEndReason(Resubmitted)
116115
testTaskEndReason(fetchFailed)
@@ -129,20 +128,10 @@ class JsonProtocolSuite extends FunSuite {
129128
}
130129

131130
test("ExceptionFailure backward compatibility") {
132-
val exceptionFailureJson =
133-
"""{"Reason":"ExceptionFailure","Class Name":"To be","Description":"or not to be",
134-
|"Stack Trace":[{"Declaring Class":"Apollo","Method Name":"Venus","File Name":"Mercury",
135-
|"Line Number":42},{"Declaring Class":"Afollo","Method Name":"Vemus","File Name":"Mercurry"
136-
|,"Line Number":420},{"Declaring Class":"Ayollo","Method Name":"Vesus","File Name":"Blackbe
137-
|rry","Line Number":4200}]}""".stripMargin.replaceAll("\r|\n", "")
138-
139-
val exception = new Exception("Out of Memory! Please restock film.")
140-
exception.setStackTrace(stackTrace)
141-
val expectedExceptionFailure = ExceptionFailure("To be", "or not to be",
142-
Utils.exceptionString("To be", "or not to be", stackTrace), None)
143-
144-
val exceptionFailure = JsonProtocol.taskEndReasonFromJson(parse(exceptionFailureJson))
145-
assertEquals(expectedExceptionFailure, exceptionFailure)
131+
val exceptionFailure = ExceptionFailure("To be", "or not to be", stackTrace, None)
132+
val oldEvent = JsonProtocol.taskEndReasonToJson(exceptionFailure)
133+
.removeField({ _._1 == "Full Stack Trace" })
134+
assertEquals(exceptionFailure, JsonProtocol.taskEndReasonFromJson(oldEvent))
146135
}
147136

148137
test("StageInfo backward compatibility") {
@@ -419,8 +408,9 @@ class JsonProtocolSuite extends FunSuite {
419408
case (r1: ExceptionFailure, r2: ExceptionFailure) =>
420409
assert(r1.className === r2.className)
421410
assert(r1.description === r2.description)
422-
assert(r1.stackTrace === r2.stackTrace)
411+
assertSeqEquals(r1.stackTrace, r2.stackTrace, assertStackTraceElementEquals)
423412
assertOptionEquals(r1.metrics, r2.metrics, assertTaskMetricsEquals)
413+
assert(r1.getFullStackTrace === r2.getFullStackTrace)
424414
case (TaskResultLost, TaskResultLost) =>
425415
case (TaskKilled, TaskKilled) =>
426416
case (ExecutorLostFailure(execId1), ExecutorLostFailure(execId2)) =>

0 commit comments

Comments
 (0)