aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/src/main/scala/org/apache/spark/scheduler/cluster/CoarseGrainedSchedulerBackend.scala9
1 files changed, 8 insertions, 1 deletions
diff --git a/core/src/main/scala/org/apache/spark/scheduler/cluster/CoarseGrainedSchedulerBackend.scala b/core/src/main/scala/org/apache/spark/scheduler/cluster/CoarseGrainedSchedulerBackend.scala
index 8896391f97..0fea9c123b 100644
--- a/core/src/main/scala/org/apache/spark/scheduler/cluster/CoarseGrainedSchedulerBackend.scala
+++ b/core/src/main/scala/org/apache/spark/scheduler/cluster/CoarseGrainedSchedulerBackend.scala
@@ -289,7 +289,14 @@ class CoarseGrainedSchedulerBackend(scheduler: TaskSchedulerImpl, val rpcEnv: Rp
scheduler.executorLost(executorId, if (killed) ExecutorKilled else reason)
listenerBus.post(
SparkListenerExecutorRemoved(System.currentTimeMillis(), executorId, reason.toString))
- case None => logInfo(s"Asked to remove non-existent executor $executorId")
+ case None =>
+ // SPARK-15262: If an executor is still alive even after the scheduler has removed
+ // its metadata, we may receive a heartbeat from that executor and tell its block
+ // manager to reregister itself. If that happens, the block manager master will know
+ // about the executor, but the scheduler will not. Therefore, we should remove the
+ // executor from the block manager when we hit this case.
+ scheduler.sc.env.blockManager.master.removeExecutor(executorId)
+ logInfo(s"Asked to remove non-existent executor $executorId")
}
}