diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/main/java/org/apache/hadoop/yarn/service/provider/docker/DockerProviderService.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/main/java/org/apache/hadoop/yarn/service/provider/docker/DockerProviderService.java index 7844621b4ae..3397e5c8e84 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/main/java/org/apache/hadoop/yarn/service/provider/docker/DockerProviderService.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-services/hadoop-yarn-services-core/src/main/java/org/apache/hadoop/yarn/service/provider/docker/DockerProviderService.java @@ -54,18 +54,20 @@ public void processArtifact(AbstractLauncher launcher, * Check if system is default to disable docker override or * user requested a Docker container with ENTRY_POINT support. * - * @param component - YARN Service component + * @param compLaunchContext - launch context for the component. * @return true if Docker launch command override is disabled */ - private boolean checkUseEntryPoint(Component component) { + private boolean checkUseEntryPoint( + ContainerLaunchService.ComponentLaunchContext compLaunchContext) { boolean overrideDisable = false; String overrideDisableKey = Environment. YARN_CONTAINER_RUNTIME_DOCKER_RUN_OVERRIDE_DISABLE. name(); - String overrideDisableValue = (component - .getConfiguration().getEnv(overrideDisableKey) != null) ? - component.getConfiguration().getEnv(overrideDisableKey) : - System.getenv(overrideDisableKey); + String overrideDisableValue = ( + compLaunchContext.getConfiguration().getEnv(overrideDisableKey) + != null) ? + compLaunchContext.getConfiguration().getEnv( + overrideDisableKey) : System.getenv(overrideDisableKey); overrideDisable = Boolean.parseBoolean(overrideDisableValue); return overrideDisable; } @@ -77,10 +79,9 @@ public void buildContainerLaunchCommand(AbstractLauncher launcher, ContainerLaunchService.ComponentLaunchContext compLaunchContext, Map tokensForSubstitution) throws IOException, SliderException { - Component component = instance.getComponent().getComponentSpec(); - boolean useEntryPoint = checkUseEntryPoint(component); + boolean useEntryPoint = checkUseEntryPoint(compLaunchContext); if (useEntryPoint) { - String launchCommand = component.getLaunchCommand(); + String launchCommand = compLaunchContext.getLaunchCommand(); if (!StringUtils.isEmpty(launchCommand)) { launcher.addCommand(launchCommand); } 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()); } /**