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 377caf776deb0..3b4bc242b4668 100644 --- a/core/src/main/scala/org/apache/spark/util/JsonProtocol.scala +++ b/core/src/main/scala/org/apache/spark/util/JsonProtocol.scala @@ -874,8 +874,14 @@ private[spark] object JsonProtocol 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 8105df64705a4..8af8c8579232f 100644 --- a/core/src/test/scala/org/apache/spark/util/JsonProtocolSuite.scala +++ b/core/src/test/scala/org/apache/spark/util/JsonProtocolSuite.scala @@ -874,6 +874,36 @@ class JsonProtocolSuite extends SparkFunSuite { val jobFailedEvent = JsonProtocol.sparkEventFromJson(exJobFailureNoStackJson) testEvent(jobFailedEvent, exJobFailureExpectedJson) } + + 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")) + } + } + }