diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java index 42f2cae62d0..a15ae86b211 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java @@ -1947,6 +1947,20 @@ public static boolean isAclEnabled(Configuration conf) { */ public static final boolean DEFAULT_NM_DOCKER_ALLOW_DELAYED_REMOVAL = false; + /** + * A configurable value to pass to the Docker Stop command. This value + * defines the number of seconds between the docker stop command sending + * a SIGTERM and a SIGKILL. + */ + public static final String NM_DOCKER_STOP_GRACE_PERIOD = + DOCKER_CONTAINER_RUNTIME_PREFIX + "stop.grace-period"; + + /** + * The default value for the grace period between the SIGTERM and the + * SIGKILL in the Docker Stop command. + */ + public static final int DEFAULT_NM_DOCKER_STOP_GRACE_PERIOD = 10; + /** The mode in which the Java Container Sandbox should run detailed by * the JavaSandboxLinuxContainerRuntime. */ public static final String YARN_CONTAINER_SANDBOX = diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml index 81b6658d61e..c4e1e39e537 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml @@ -1787,6 +1787,14 @@ + A configurable value to pass to the Docker Stop command. This value + defines the number of seconds between the docker stop command sending + a SIGTERM and a SIGKILL. + yarn.nodemanager.runtime.linux.docker.stop.grace-period + + + + The mode in which the Java Container Sandbox should run detailed by the JavaSandboxLinuxContainerRuntime. yarn.nodemanager.runtime.linux.sandbox-mode 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/linux/runtime/DockerLinuxContainerRuntime.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/DockerLinuxContainerRuntime.java index 02904930a97..20f043132ac 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/DockerLinuxContainerRuntime.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/DockerLinuxContainerRuntime.java @@ -245,6 +245,7 @@ private int userRemappingGidThreshold; private Set capabilities; private boolean delayedRemovalAllowed; + private int dockerStopGracePeriod; /** * Return whether the given environment variables indicate that the operation @@ -348,6 +349,10 @@ public void initialize(Configuration conf, Context nmContext) delayedRemovalAllowed = conf.getBoolean( YarnConfiguration.NM_DOCKER_ALLOW_DELAYED_REMOVAL, YarnConfiguration.DEFAULT_NM_DOCKER_ALLOW_DELAYED_REMOVAL); + + dockerStopGracePeriod = conf.getInt( + YarnConfiguration.NM_DOCKER_STOP_GRACE_PERIOD, + YarnConfiguration.DEFAULT_NM_DOCKER_STOP_GRACE_PERIOD); } private Set getDockerCapabilitiesFromConf() throws @@ -1138,7 +1143,8 @@ private void handleContainerStop(String containerId, Map env) DockerCommandExecutor.getContainerStatus(containerId, conf, privilegedOperationExecutor); if (DockerCommandExecutor.isStoppable(containerStatus)) { - DockerStopCommand dockerStopCommand = new DockerStopCommand(containerId); + DockerStopCommand dockerStopCommand = new DockerStopCommand( + containerId, dockerStopGracePeriod); DockerCommandExecutor.executeDockerCommand(dockerStopCommand, containerId, env, conf, privilegedOperationExecutor, false); } else { 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/linux/runtime/docker/DockerStopCommand.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/docker/DockerStopCommand.java index ccfff827a0a..025d268fa62 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/docker/DockerStopCommand.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/docker/DockerStopCommand.java @@ -32,6 +32,12 @@ public DockerStopCommand(String containerName) { super.addCommandArguments("name", containerName); } + public DockerStopCommand(String containerName, int gracePeriod) { + super(STOP_COMMAND); + super.addCommandArguments("name", containerName); + super.addCommandArguments("time", Integer.toString(gracePeriod)); + } + public DockerStopCommand setGracePeriod(int value) { super.addCommandArguments("time", Integer.toString(value)); return this; 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/linux/runtime/TestDockerContainerRuntime.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/TestDockerContainerRuntime.java index 132a2025bf7..a95022d2789 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/TestDockerContainerRuntime.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/runtime/TestDockerContainerRuntime.java @@ -146,6 +146,7 @@ private final String whitelistedUser = "yoda"; private String[] testCapabilities; private final String signalPid = "1234"; + private int dockerStopGracePeriod; @Before public void setup() { @@ -166,6 +167,10 @@ public void setup() { env.put("FROM_CLIENT", "1"); image = "busybox:latest"; + dockerStopGracePeriod = conf.getInt( + YarnConfiguration.NM_DOCKER_STOP_GRACE_PERIOD, + YarnConfiguration.DEFAULT_NM_DOCKER_STOP_GRACE_PERIOD); + env.put(DockerLinuxContainerRuntime.ENV_DOCKER_CONTAINER_IMAGE, image); when(container.getContainerId()).thenReturn(cId); when(cId.toString()).thenReturn(containerId); @@ -1308,10 +1313,11 @@ public void testDockerStopOnTermSignalWhenRunning() List dockerCommands = getDockerCommandsForSignal( ContainerExecutor.Signal.TERM, DockerCommandExecutor.DockerContainerStatus.RUNNING); - Assert.assertEquals(3, dockerCommands.size()); + Assert.assertEquals(4, dockerCommands.size()); Assert.assertEquals("[docker-command-execution]", dockerCommands.get(0)); Assert.assertEquals(" docker-command=stop", dockerCommands.get(1)); Assert.assertEquals(" name=container_id", dockerCommands.get(2)); + Assert.assertEquals(" time=10", dockerCommands.get(3)); } @Test @@ -1321,10 +1327,11 @@ public void testDockerStopOnKillSignalWhenRunning() List dockerCommands = getDockerCommandsForSignal( ContainerExecutor.Signal.KILL, DockerCommandExecutor.DockerContainerStatus.RUNNING); - Assert.assertEquals(3, dockerCommands.size()); + Assert.assertEquals(4, dockerCommands.size()); Assert.assertEquals("[docker-command-execution]", dockerCommands.get(0)); Assert.assertEquals(" docker-command=stop", dockerCommands.get(1)); Assert.assertEquals(" name=container_id", dockerCommands.get(2)); + Assert.assertEquals(" time=10", dockerCommands.get(3)); } @Test @@ -1884,7 +1891,7 @@ public void signalContainer(ContainerRuntimeContext ctx) || ContainerExecutor.Signal.TERM.equals(signal)) { if (DockerCommandExecutor.isStoppable(containerStatus)) { DockerStopCommand dockerStopCommand = - new DockerStopCommand(containerName); + new DockerStopCommand(containerName, dockerStopGracePeriod); DockerCommandExecutor.executeDockerCommand(dockerStopCommand, containerName, environment, conf, mockExecutor, false); }