commit 656041098a9b75e3714f7bda5c7d782e07343171 Author: Eric Yang Date: Mon Apr 15 18:24:40 2019 -0400 YARN-9486. Clean up failed Docker containers. Contributed by Eric Yang 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/launcher/ContainerCleanup.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/launcher/ContainerCleanup.java index b63becf..4b0af47 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/launcher/ContainerCleanup.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/launcher/ContainerCleanup.java @@ -96,7 +96,8 @@ public void run() { } // launch flag will be set to true if process already launched - boolean alreadyLaunched = !launch.markLaunched(); + boolean alreadyLaunched = !launch.markLaunched() || + launch.isLaunchCompleted(); if (!alreadyLaunched) { LOG.info("Container " + containerIdStr + " not launched." + " No cleanup needed to be done"); 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/launcher/TestContainerCleanup.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/launcher/TestContainerCleanup.java index 6c99379..bcde332 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/launcher/TestContainerCleanup.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/launcher/TestContainerCleanup.java @@ -79,6 +79,7 @@ public void setup() throws Exception { launch = mock(ContainerLaunch.class); launch.containerAlreadyLaunched = new AtomicBoolean(false); + launch.completed = new AtomicBoolean(false); launch.pidFilePath = new Path("target/" + containerId.toString() + ".pid"); when(launch.getContainerPid()).thenReturn(containerId.toString()); @@ -105,4 +106,16 @@ public void testCleanup() throws Exception { Assert.assertEquals("signal", ContainerExecutor.Signal.TERM, captor.getValue().getSignal()); } + + @Test + public void testFailedExitCleanup() throws Exception { + launch.completed.set(true); + cleanup.run(); + ArgumentCaptor captor = + ArgumentCaptor.forClass(ContainerSignalContext.class); + + verify(executor, Mockito.times(1)).signalContainer(captor.capture()); + Assert.assertEquals("signal", ContainerExecutor.Signal.TERM, + captor.getValue().getSignal()); + } }