diff --git a/core/src/main/scala/org/apache/spark/ExecutorAllocationManager.scala b/core/src/main/scala/org/apache/spark/ExecutorAllocationManager.scala index aa363eeffffb8..b4667a4de1135 100644 --- a/core/src/main/scala/org/apache/spark/ExecutorAllocationManager.scala +++ b/core/src/main/scala/org/apache/spark/ExecutorAllocationManager.scala @@ -699,6 +699,12 @@ private[spark] class ExecutorAllocationManager( // This is needed in case the stage is aborted for any reason if (stageIdToNumTasks.isEmpty && stageIdToNumSpeculativeTasks.isEmpty) { allocationManager.onSchedulerQueueEmpty() + if (executorIdToTaskIds.nonEmpty) { + log.warn(s"There are no running tasks," + + s" but ${executorIdToTaskIds.size} executors are not idle") + executorIdToTaskIds.keySet.foreach(allocationManager.onExecutorIdle) + executorIdToTaskIds.clear() + } } } }