diff --git a/externals/kyuubi-spark-sql-engine/src/main/scala/org/apache/kyuubi/engine/spark/session/SparkSQLSessionManager.scala b/externals/kyuubi-spark-sql-engine/src/main/scala/org/apache/kyuubi/engine/spark/session/SparkSQLSessionManager.scala index a4048b78b94..2cb7ca9a08f 100644 --- a/externals/kyuubi-spark-sql-engine/src/main/scala/org/apache/kyuubi/engine/spark/session/SparkSQLSessionManager.scala +++ b/externals/kyuubi-spark-sql-engine/src/main/scala/org/apache/kyuubi/engine/spark/session/SparkSQLSessionManager.scala @@ -227,4 +227,8 @@ class SparkSQLSessionManager private (name: String, spark: SparkSession) opHandle: OperationHandle): Path = { new Path(getSessionResultSavePath(sessionHandle), opHandle.identifier.toString) } + + override private[kyuubi] def isEngineContextStopped = { + spark.sparkContext.isStopped + } } diff --git a/kyuubi-common/src/main/scala/org/apache/kyuubi/session/SessionManager.scala b/kyuubi-common/src/main/scala/org/apache/kyuubi/session/SessionManager.scala index 7751b7298e4..217cfc707c9 100644 --- a/kyuubi-common/src/main/scala/org/apache/kyuubi/session/SessionManager.scala +++ b/kyuubi-common/src/main/scala/org/apache/kyuubi/session/SessionManager.scala @@ -345,10 +345,15 @@ abstract class SessionManager(name: String) extends CompositeService(name) { if (idleTimeout > 0) { val checkTask = new Runnable { override def run(): Unit = { - if (!shutdown && System.currentTimeMillis() - latestLogoutTime > idleTimeout && - getActiveUserSessionCount <= 0) { - info(s"Idled for more than $idleTimeout ms, terminating") - stop() + if (!shutdown) { + if (System.currentTimeMillis() - latestLogoutTime > idleTimeout && + getActiveUserSessionCount <= 0) { + info(s"Idled for more than $idleTimeout ms, terminating") + stop() + } else if (isEngineContextStopped) { + error(s"Engine's SparkContext is stopped, terminating") + stop() + } } } } @@ -360,4 +365,6 @@ abstract class SessionManager(name: String) extends CompositeService(name) { TimeUnit.MILLISECONDS) } } + + private[kyuubi] def isEngineContextStopped: Boolean = false }