YARN-9126. Fix container clean up for reinitialization.
Contributed by Chandni Singh
Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/e815fd9c
Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/e815fd9c
Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/e815fd9c
Branch: refs/heads/HDFS-12943
Commit: e815fd9c49e80b9200dd8852abe74fe219ad9110
Parents: cf57113
Author: Eric Yang <[email protected]>
Authored: Wed Dec 19 14:55:56 2018 -0500
Committer: Eric Yang <[email protected]>
Committed: Wed Dec 19 14:55:56 2018 -0500
----------------------------------------------------------------------
.../launcher/ContainerLaunch.java | 3 ++
.../launcher/ContainersLauncher.java | 50 ++++++++++++--------
.../launcher/TestContainersLauncher.java | 14 ++++--
3 files changed, 44 insertions(+), 23 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e815fd9c/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/launcher/ContainerLaunch.java
----------------------------------------------------------------------
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/ContainerLaunch.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/ContainerLaunch.java
index 60b6e31..f06040e 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/ContainerLaunch.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/ContainerLaunch.java
@@ -113,6 +113,7 @@ public class ContainerLaunch implements Callable<Integer> {
Shell.appendScriptExtension("launch_container");
public static final String FINAL_CONTAINER_TOKENS_FILE = "container_tokens";
+ public static final String SYSFS_DIR = "sysfs";
public static final String KEYSTORE_FILE = "yarn_provided.keystore";
public static final String TRUSTSTORE_FILE = "yarn_provided.truststore";
@@ -1772,6 +1773,8 @@ public class ContainerLaunch implements Callable<Integer>
{
deleteAsUser(new Path(containerWorkDir, CONTAINER_SCRIPT));
// delete TokensPath
deleteAsUser(new Path(containerWorkDir, FINAL_CONTAINER_TOKENS_FILE));
+ // delete sysfs dir
+ deleteAsUser(new Path(containerWorkDir, SYSFS_DIR));
// delete symlinks because launch script will create symlinks again
try {
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e815fd9c/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/launcher/ContainersLauncher.java
----------------------------------------------------------------------
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/ContainersLauncher.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/ContainersLauncher.java
index fdfe5b1..90ccd67 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/ContainersLauncher.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/ContainersLauncher.java
@@ -46,7 +46,6 @@ import
org.apache.hadoop.yarn.server.nodemanager.LocalDirsHandlerService;
import
org.apache.hadoop.yarn.server.nodemanager.containermanager.ContainerManagerImpl;
import
org.apache.hadoop.yarn.server.nodemanager.containermanager.application.Application;
import
org.apache.hadoop.yarn.server.nodemanager.containermanager.container.Container;
-import
org.apache.hadoop.yarn.server.nodemanager.containermanager.container.Container;
import
org.apache.hadoop.yarn.server.nodemanager.containermanager.localizer.ResourceLocalizationService;
import com.google.common.annotations.VisibleForTesting;
@@ -152,25 +151,10 @@ public class ContainersLauncher extends AbstractService
containerLauncher.submit(launch);
break;
case CLEANUP_CONTAINER:
+ cleanup(event, containerId, true);
+ break;
case CLEANUP_CONTAINER_FOR_REINIT:
- ContainerLaunch existingLaunch = running.remove(containerId);
- if (existingLaunch == null) {
- // Container not launched.
- // triggering KILLING to CONTAINER_CLEANEDUP_AFTER_KILL transition.
- dispatcher.getEventHandler().handle(
- new ContainerExitEvent(containerId,
- ContainerEventType.CONTAINER_KILLED_ON_REQUEST,
- Shell.WINDOWS ?
ContainerExecutor.ExitCode.FORCE_KILLED.getExitCode() :
- ContainerExecutor.ExitCode.TERMINATED.getExitCode(),
- "Container terminated before launch."));
- return;
- }
-
- // Cleanup a container whether it is running/killed/completed, so that
- // no sub-processes are alive.
- ContainerCleanup cleanup = new ContainerCleanup(context, getConfig(),
- dispatcher, exec, event.getContainer(), existingLaunch);
- containerLauncher.submit(cleanup);
+ cleanup(event, containerId, false);
break;
case SIGNAL_CONTAINER:
SignalContainersLauncherEvent signalEvent =
@@ -221,4 +205,32 @@ public class ContainersLauncher extends AbstractService
break;
}
}
+
+ @VisibleForTesting
+ void cleanup(ContainersLauncherEvent event, ContainerId containerId,
+ boolean async) {
+ ContainerLaunch existingLaunch = running.remove(containerId);
+ if (existingLaunch == null) {
+ // Container not launched.
+ // triggering KILLING to CONTAINER_CLEANEDUP_AFTER_KILL transition.
+ dispatcher.getEventHandler().handle(
+ new ContainerExitEvent(containerId,
+ ContainerEventType.CONTAINER_KILLED_ON_REQUEST,
+ Shell.WINDOWS ?
+ ContainerExecutor.ExitCode.FORCE_KILLED.getExitCode() :
+ ContainerExecutor.ExitCode.TERMINATED.getExitCode(),
+ "Container terminated before launch."));
+ return;
+ }
+
+ // Cleanup a container whether it is running/killed/completed, so that
+ // no sub-processes are alive.
+ ContainerCleanup cleanup = new ContainerCleanup(context, getConfig(),
+ dispatcher, exec, event.getContainer(), existingLaunch);
+ if (async) {
+ containerLauncher.submit(cleanup);
+ } else {
+ cleanup.run();
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/e815fd9c/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/launcher/TestContainersLauncher.java
----------------------------------------------------------------------
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/TestContainersLauncher.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/TestContainersLauncher.java
index f2fafd2..c6c8788 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/TestContainersLauncher.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/TestContainersLauncher.java
@@ -31,6 +31,7 @@ import
org.apache.hadoop.yarn.server.nodemanager.containermanager.ContainerManag
import
org.apache.hadoop.yarn.server.nodemanager.containermanager.application.Application;
import
org.apache.hadoop.yarn.server.nodemanager.containermanager.application.ApplicationImpl;
import
org.apache.hadoop.yarn.server.nodemanager.containermanager.container.ContainerImpl;
+import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
@@ -39,8 +40,10 @@ import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
@@ -212,11 +215,14 @@ public class TestContainersLauncher {
when(event.getType())
.thenReturn(ContainersLauncherEventType.CLEANUP_CONTAINER_FOR_REINIT);
- assertEquals(1, dummyMap.size());
+ final List<ContainerId> cleanedContainers = new ArrayList<>();
+ doAnswer(invocation -> {
+ cleanedContainers.add((ContainerId)invocation.getArguments()[1]);
+ return null;
+ }).when(spy).cleanup(any(), any(), anyBoolean());
spy.handle(event);
- assertEquals(0, dummyMap.size());
- Mockito.verify(containerLauncher, Mockito.times(1))
- .submit(Mockito.any(ContainerCleanup.class));
+ Assert.assertEquals("container not cleaned", containerId,
+ cleanedContainers.get(0));
}
@Test
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]