diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/container/Container.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/container/Container.java index 56b4fdd..66f614a 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/container/Container.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/container/Container.java @@ -53,6 +53,10 @@ NMContainerStatus getNMContainerStatus(); + void setPendingKillEvent(ContainerKillEvent event); + + ContainerKillEvent getPendingKillEvent(); + String toString(); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/container/ContainerImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/container/ContainerImpl.java index 3c76596..d46ca1e 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/container/ContainerImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/container/ContainerImpl.java @@ -124,6 +124,8 @@ RecoveredContainerStatus.REQUESTED; // whether container was marked as killed after recovery private boolean recoveredAsKilled = false; + // pending kill event while container is In New State and to be recovered + private ContainerKillEvent pendingKillEvent; public ContainerImpl(Configuration conf, Dispatcher dispatcher, NMStateStoreService stateStore, ContainerLaunchContext launchContext, @@ -180,7 +182,8 @@ public ContainerImpl(Configuration conf, Dispatcher dispatcher, .addTransition(ContainerState.NEW, ContainerState.NEW, ContainerEventType.UPDATE_DIAGNOSTICS_MSG, UPDATE_DIAGNOSTICS_TRANSITION) - .addTransition(ContainerState.NEW, ContainerState.DONE, + .addTransition(ContainerState.NEW, + EnumSet.of(ContainerState.NEW, ContainerState.DONE), ContainerEventType.KILL_CONTAINER, new KillOnNewTransition()) // From LOCALIZING State @@ -772,6 +775,11 @@ public void transition(ContainerImpl container, ContainerEvent event) { new ContainersLauncherEvent(container, ContainersLauncherEventType.CLEANUP_CONTAINER)); } + + ContainerKillEvent killEvent = container.getPendingKillEvent(); + if (killEvent != null) { + container.dispatcher.getEventHandler().handle(killEvent); + } } } @@ -983,21 +991,32 @@ public void transition(ContainerImpl container, ContainerEvent event) { /** * Handle the following transition: + * - NEW -> NEW if container is recovered as LAUNCHED * - NEW -> DONE upon KILL_CONTAINER */ - static class KillOnNewTransition extends ContainerDoneTransition { + static class KillOnNewTransition implements + MultipleArcTransition { @Override - public void transition(ContainerImpl container, ContainerEvent event) { - ContainerKillEvent killEvent = (ContainerKillEvent) event; - container.exitCode = killEvent.getContainerExitStatus(); - container.addDiagnostics(killEvent.getDiagnostic(), "\n"); - container.addDiagnostics("Container is killed before being launched.\n"); - container.metrics.killedContainer(); - NMAuditLogger.logSuccess(container.user, - AuditConstants.FINISH_KILLED_CONTAINER, "ContainerImpl", - container.containerId.getApplicationAttemptId().getApplicationId(), - container.containerId); - super.transition(container, event); + public ContainerState transition(ContainerImpl container, + ContainerEvent event) { + if (container.recoveredStatus != RecoveredContainerStatus.LAUNCHED) { + ContainerKillEvent killEvent = (ContainerKillEvent) event; + container.exitCode = killEvent.getContainerExitStatus(); + container.addDiagnostics(killEvent.getDiagnostic(), "\n"); + container.addDiagnostics( + "Container is killed before being launched.\n"); + container.metrics.killedContainer(); + NMAuditLogger.logSuccess(container.user, + AuditConstants.FINISH_KILLED_CONTAINER, "ContainerImpl", + container.containerId.getApplicationAttemptId().getApplicationId(), + container.containerId); + container.metrics.releaseContainer(container.resource); + container.sendFinishedEvents(); + return ContainerState.DONE; + } else { + container.setPendingKillEvent((ContainerKillEvent) event); + return ContainerState.NEW; + } } } @@ -1136,6 +1155,16 @@ public void handle(ContainerEvent event) { } @Override + public void setPendingKillEvent(ContainerKillEvent event){ + pendingKillEvent = event; + } + + @Override + public ContainerKillEvent getPendingKillEvent() { + return pendingKillEvent; + } + + @Override public String toString() { this.readLock.lock(); try { diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/webapp/MockContainer.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/webapp/MockContainer.java index b2ccb61..9bb7e9c 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/webapp/MockContainer.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/webapp/MockContainer.java @@ -39,6 +39,7 @@ import org.apache.hadoop.yarn.server.api.protocolrecords.NMContainerStatus; import org.apache.hadoop.yarn.server.nodemanager.containermanager.container.Container; import org.apache.hadoop.yarn.server.nodemanager.containermanager.container.ContainerEvent; +import org.apache.hadoop.yarn.server.nodemanager.containermanager.container.ContainerKillEvent; import org.apache.hadoop.yarn.server.nodemanager.containermanager.container.ContainerState; import org.apache.hadoop.yarn.server.utils.BuilderUtils; @@ -140,4 +141,14 @@ public ContainerTokenIdentifier getContainerTokenIdentifier() { public NMContainerStatus getNMContainerStatus() { return null; } + + @Override + public void setPendingKillEvent(ContainerKillEvent containerKillEvent) { + + } + + @Override + public ContainerKillEvent getPendingKillEvent() { + return null; + } }