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 60b6e310725..f06040ea344 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 @@ 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 @@ protected void cleanupContainerFiles(Path containerWorkDir) { 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 { 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 fdfe5b17a9e..a71f7961495 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 @@ -152,25 +152,10 @@ public void handle(ContainersLauncherEvent event) { 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 +206,30 @@ public void handle(ContainersLauncherEvent event) { break; } } + + private 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(); + } + } }