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 6950aa9..3cb1f98 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 @@ -69,6 +69,11 @@ new ThreadFactoryBuilder() .setNameFormat("ContainersLauncher #%d") .build()); + private ExecutorService containerCleaner = + Executors.newCachedThreadPool( + new ThreadFactoryBuilder() + .setNameFormat("ContainersCleaner #%d") + .build()); @VisibleForTesting public final Map running = Collections.synchronizedMap(new HashMap()); @@ -98,6 +103,7 @@ protected void serviceInit(Configuration conf) throws Exception { @Override protected void serviceStop() throws Exception { containerLauncher.shutdownNow(); + containerCleaner.shutdownNow(); super.serviceStop(); } @@ -105,7 +111,7 @@ protected void serviceStop() throws Exception { public void handle(ContainersLauncherEvent event) { // TODO: ContainersLauncher launches containers one by one!! Container container = event.getContainer(); - ContainerId containerId = container.getContainerId(); + final ContainerId containerId = container.getContainerId(); switch (event.getType()) { case LAUNCH_CONTAINER: Application app = @@ -127,7 +133,7 @@ public void handle(ContainersLauncherEvent event) { running.put(containerId, launch); break; case CLEANUP_CONTAINER: - ContainerLaunch launcher = running.remove(containerId); + final ContainerLaunch launcher = running.remove(containerId); if (launcher == null) { // Container not launched. So nothing needs to be done. return; @@ -135,12 +141,18 @@ public void handle(ContainersLauncherEvent event) { // Cleanup a container whether it is running/killed/completed, so that // no sub-processes are alive. - try { - launcher.cleanupContainer(); - } catch (IOException e) { - LOG.warn("Got exception while cleaning container " + containerId - + ". Ignoring."); - } + containerCleaner.submit( + new Runnable() { + @Override + public void run() { + try { + launcher.cleanupContainer(); + } catch (IOException e) { + LOG.warn("Got exception while cleaning container " + + containerId + ". Ignoring.", e); + } + } + }); break; } }