diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ContainerExitStatus.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ContainerExitStatus.java index 02070100e3b..37800dc6a86 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ContainerExitStatus.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/records/ContainerExitStatus.java @@ -78,4 +78,8 @@ */ public static final int KILLED_BY_CONTAINER_SCHEDULER = -108; + /** + * Container was terminated after NM failed to localize resources for it + */ + public static final int LOCALIZE_FAILED = -109; } 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 f253b041d32..05852397058 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 @@ -1960,6 +1960,14 @@ public void transition(ContainerImpl container, ContainerEvent event) { @Override public void transition(ContainerImpl container, ContainerEvent event) { container.metrics.failedContainer(); + try { + container.exitCode = ContainerExitStatus.LOCALIZE_FAILED; + container.stateStore + .storeContainerCompleted(container.containerId, container.exitCode); + } catch (IOException e) { + LOG.error("Unable to mark container " + container.containerId + + " completed in store", e); + } NMAuditLogger.logFailure(container.user, AuditConstants.FINISH_FAILED_CONTAINER, "ContainerImpl", "Container failed with state: " + container.getContainerState(), diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/container/TestContainer.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/container/TestContainer.java index a2ef9d9186a..18a4ac7d5cd 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/container/TestContainer.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/container/TestContainer.java @@ -642,6 +642,9 @@ public void testKillOnLocalizationFailed() throws Exception { wc.containerResourcesCleanup(); assertEquals(ContainerState.DONE, wc.c.getContainerState()); assertEquals(failed + 1, metrics.getFailedContainers()); + // verify that container state has been updated in state store + verify(wc.context.getNMStateStore(), times(1)) + .storeContainerCompleted(wc.cId, ContainerExitStatus.LOCALIZE_FAILED); } finally { if (wc != null) { wc.finished(); @@ -1364,7 +1367,7 @@ protected void scheduleContainer(Container container) { when(context.getApplications()).thenReturn( new ConcurrentHashMap()); - NMNullStateStoreService stateStore = new NMNullStateStoreService(); + NMNullStateStoreService stateStore = mock(NMNullStateStoreService.class); when(context.getNMStateStore()).thenReturn(stateStore); NodeStatusUpdater nodeStatusUpdater = mock(NodeStatusUpdater.class); when(context.getNodeStatusUpdater()).thenReturn(nodeStatusUpdater);