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 04295e13678..ae6f427b606 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 @@ -43,6 +43,8 @@ import java.util.Set; import java.util.concurrent.Callable; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; @@ -136,6 +138,8 @@ protected final LocalDirsHandlerService dirsHandler; + private final Lock containerExecLock = new ReentrantLock(); + public ContainerLaunch(Context context, Configuration configuration, Dispatcher dispatcher, ContainerExecutor exec, Application app, Container container, LocalDirsHandlerService dirsHandler, @@ -486,7 +490,12 @@ protected int launchContainer(ContainerStartContext ctx) throws IOException, ConfigurationException { int launchPrep = prepareForLaunch(ctx); if (launchPrep == 0) { - return exec.launchContainer(ctx); + containerExecLock.lock(); + try { + return exec.launchContainer(ctx); + } finally { + containerExecLock.unlock(); + } } return launchPrep; } @@ -495,7 +504,12 @@ protected int relaunchContainer(ContainerStartContext ctx) throws IOException, ConfigurationException { int launchPrep = prepareForLaunch(ctx); if (launchPrep == 0) { - return exec.relaunchContainer(ctx); + containerExecLock.lock(); + try { + return exec.relaunchContainer(ctx); + } finally { + containerExecLock.unlock(); + } } return launchPrep; } @@ -807,18 +821,22 @@ public void cleanupContainer() throws IOException { lfs.delete(pidFilePath.suffix(EXIT_CODE_FILE_SUFFIX), false); } } - - // Reap the container - boolean result = exec.reapContainer( - new ContainerReapContext.Builder() - .setContainer(container) - .setUser(container.getUser()) - .build()); - if (!result) { - throw new IOException("Reap container failed for container " - + containerIdStr); + containerExecLock.lock(); + try { + // Reap the container + boolean result = exec.reapContainer( + new ContainerReapContext.Builder() + .setContainer(container) + .setUser(container.getUser()) + .build()); + if (!result) { + throw new IOException("Reap container failed for container " + + containerIdStr); + } + cleanupContainerFiles(getContainerWorkDir()); + } finally { + containerExecLock.unlock(); } - cleanupContainerFiles(getContainerWorkDir()); } /**