This is an automated email from the ASF dual-hosted git repository.
yangjie01 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/spark.git
The following commit(s) were added to refs/heads/master by this push:
new 7d8d018e7bdc [SPARK-52381][CORE] JsonProtocol: Only accept subclasses
of SparkListenerEvent
7d8d018e7bdc is described below
commit 7d8d018e7bdcd03b9c730e45caeec98f13963dbb
Author: PJ Fanning <[email protected]>
AuthorDate: Sat Jun 28 19:04:10 2025 +0800
[SPARK-52381][CORE] JsonProtocol: Only accept subclasses of
SparkListenerEvent
### What changes were proposed in this pull request?
JsonProtocol tidy up. Only parse JSON relating to Spark events.
https://issues.apache.org/jira/browse/SPARK-52381
### Why are the changes needed?
Tidier code and
https://lists.apache.org/thread/9zwkdo85wcdfppgqvbhjly8wdgf595yp
### Does this PR introduce _any_ user-facing change?
No
### How was this patch tested?
Unit test
### Was this patch authored or co-authored using generative AI tooling?
No
Closes #51061 from pjfanning/SPARK-52381.
Authored-by: PJ Fanning <[email protected]>
Signed-off-by: yangjie01 <[email protected]>
---
.../scala/org/apache/spark/util/JsonProtocol.scala | 10 ++++++--
.../org/apache/spark/util/JsonProtocolSuite.scala | 30 ++++++++++++++++++++++
2 files changed, 38 insertions(+), 2 deletions(-)
diff --git a/core/src/main/scala/org/apache/spark/util/JsonProtocol.scala
b/core/src/main/scala/org/apache/spark/util/JsonProtocol.scala
index d4b9b3c2ef3a..201e5abb1bbc 100644
--- a/core/src/main/scala/org/apache/spark/util/JsonProtocol.scala
+++ b/core/src/main/scala/org/apache/spark/util/JsonProtocol.scala
@@ -919,8 +919,14 @@ private[spark] class JsonProtocol(sparkConf: SparkConf)
extends JsonUtils {
case `stageExecutorMetrics` => stageExecutorMetricsFromJson(json)
case `blockUpdate` => blockUpdateFromJson(json)
case `resourceProfileAdded` => resourceProfileAddedFromJson(json)
- case other => mapper.readValue(json.toString, Utils.classForName(other))
- .asInstanceOf[SparkListenerEvent]
+ case other =>
+ val otherClass = Utils.classForName(other)
+ if (classOf[SparkListenerEvent].isAssignableFrom(otherClass)) {
+ mapper.readValue(json.toString, otherClass)
+ .asInstanceOf[SparkListenerEvent]
+ } else {
+ throw new SparkException(s"Unknown event type: $other")
+ }
}
}
diff --git a/core/src/test/scala/org/apache/spark/util/JsonProtocolSuite.scala
b/core/src/test/scala/org/apache/spark/util/JsonProtocolSuite.scala
index 115d1f34bcb4..390d22938802 100644
--- a/core/src/test/scala/org/apache/spark/util/JsonProtocolSuite.scala
+++ b/core/src/test/scala/org/apache/spark/util/JsonProtocolSuite.scala
@@ -1022,6 +1022,36 @@ class jsonProtocolSuite extends SparkFunSuite {
"String value length (10000) exceeds the maximum allowed"
))
}
+
+ test("SPARK-52381: handle class not found") {
+ val unknownJson =
+ """{
+ | "Event" : "com.example.UnknownEvent",
+ | "foo" : "foo"
+ |}""".stripMargin
+ try {
+ jsonProtocol.sparkEventFromJson(unknownJson)
+ fail("Expected ClassNotFoundException for unknown event type")
+ } catch {
+ case e: ClassNotFoundException =>
+ }
+ }
+
+ test("SPARK-52381: only read classes that extend SparkListenerEvent") {
+ val unknownJson =
+ """{
+ | "Event" : "org.apache.spark.SparkException",
+ | "foo" : "foo"
+ |}""".stripMargin
+ try {
+ jsonProtocol.sparkEventFromJson(unknownJson)
+ fail("Expected SparkException for unknown event type")
+ } catch {
+ case e: SparkException =>
+ assert(e.getMessage.startsWith("Unknown event type"))
+ }
+ }
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]