You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by be...@apache.org on 2014/08/16 17:26:50 UTC

[5/5] git commit: Save Docker container pid for subsequent containerizer updates.

Save Docker container pid for subsequent containerizer updates.

Review: https://reviews.apache.org/r/24768


Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/8cbb85c8
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/8cbb85c8
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/8cbb85c8

Branch: refs/heads/master
Commit: 8cbb85c8af6eae9453a868f67f2fb8dd387e18ba
Parents: a7b706a
Author: Timothy Chen <tn...@apache.org>
Authored: Sat Aug 16 07:53:55 2014 -0700
Committer: Benjamin Hindman <be...@gmail.com>
Committed: Sat Aug 16 08:25:40 2014 -0700

----------------------------------------------------------------------
 src/slave/containerizer/docker.cpp       | 55 ++++++++++++++++++++++-----
 src/tests/docker_containerizer_tests.cpp | 20 ++++++++++
 2 files changed, 66 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/8cbb85c8/src/slave/containerizer/docker.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/docker.cpp b/src/slave/containerizer/docker.cpp
index 5fa0275..215c2b4 100644
--- a/src/slave/containerizer/docker.cpp
+++ b/src/slave/containerizer/docker.cpp
@@ -227,6 +227,11 @@ private:
       const Resources& resources,
       const Docker::Container& container);
 
+  process::Future<Nothing> __update(
+      const ContainerID& containerId,
+      const Resources& resources,
+      pid_t pid);
+
   Future<ResourceStatistics> _usage(
     const ContainerID& containerId,
     const Docker::Container& container);
@@ -301,6 +306,10 @@ private:
     // The docker pull subprocess is stored so we can killtree the
     // pid when destroy is called while docker is pulling the image.
     Option<Subprocess> pull;
+
+    // Once the container is running, this saves the pid of the
+    // running container.
+    Option<pid_t> pid;
   };
 
   hashmap<ContainerID, Container*> containers_;
@@ -1237,8 +1246,16 @@ Future<Nothing> DockerContainerizerProcess::update(
     return Nothing();
   }
 
+  Container* container = containers_[containerId];
+
+  if (container->state == Container::DESTROYING)  {
+    LOG(INFO) << "Ignoring updating container '" << containerId
+              << "' that is being destroyed";
+    return Nothing();
+  }
+
   // Store the resources for usage().
-  containers_[containerId]->resources = _resources;
+  container->resources = _resources;
 
 #ifdef __linux__
   if (!_resources.cpus().isSome() && !_resources.mem().isSome()) {
@@ -1246,6 +1263,11 @@ Future<Nothing> DockerContainerizerProcess::update(
     return Nothing();
   }
 
+  // Skip inspecting the docker container if we already have the pid.
+  if (container->pid.isSome()) {
+    return __update(containerId, _resources, container->pid.get());
+  }
+
   return docker.inspect(containerName(containerId))
     .then(defer(self(), &Self::_update, containerId, _resources, lambda::_1));
 #else
@@ -1259,6 +1281,27 @@ Future<Nothing> DockerContainerizerProcess::_update(
     const Resources& _resources,
     const Docker::Container& container)
 {
+  if (container.pid.isNone()) {
+    return Nothing();
+  }
+
+  if (!containers_.contains(containerId)) {
+    LOG(INFO) << "Container has been removed after docker inspect, "
+              << "skipping update";
+    return Nothing();
+  }
+
+  containers_[containerId]->pid = container.pid.get();
+
+  return __update(containerId, _resources, container.pid.get());
+}
+
+
+Future<Nothing> DockerContainerizerProcess::__update(
+    const ContainerID& containerId,
+    const Resources& _resources,
+    pid_t pid)
+{
 #ifdef __linux__
   // Determine the the cgroups hierarchies where the 'cpu' and
   // 'memory' subsystems are mounted (they may be the same). Note that
@@ -1284,15 +1327,9 @@ Future<Nothing> DockerContainerizerProcess::_update(
   // the hierarchy with the 'memory' subsystem attached so we can
   // update the proper cgroup control files.
 
-  // First check that this container still appears to be running.
-  Option<pid_t> pid = container.pid;
-  if (pid.isNone()) {
-    return Nothing();
-  }
-
   // Determine the cgroup for the 'cpu' subsystem (based on the
   // container's pid).
-  Result<string> cpuCgroup = cgroups::cpu::cgroup(pid.get());
+  Result<string> cpuCgroup = cgroups::cpu::cgroup(pid);
 
   if (cpuCgroup.isError()) {
     return Failure("Failed to determine cgroup for the 'cpu' subsystem: " +
@@ -1325,7 +1362,7 @@ Future<Nothing> DockerContainerizerProcess::_update(
   }
 
   // Now determine the cgroup for the 'memory' subsystem.
-  Result<string> memoryCgroup = cgroups::memory::cgroup(pid.get());
+  Result<string> memoryCgroup = cgroups::memory::cgroup(pid);
 
   if (memoryCgroup.isError()) {
     return Failure("Failed to determine cgroup for the 'memory' subsystem: " +

http://git-wip-us.apache.org/repos/asf/mesos/blob/8cbb85c8/src/tests/docker_containerizer_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/docker_containerizer_tests.cpp b/src/tests/docker_containerizer_tests.cpp
index 3a55f5e..c37bc52 100644
--- a/src/tests/docker_containerizer_tests.cpp
+++ b/src/tests/docker_containerizer_tests.cpp
@@ -734,6 +734,26 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Update)
   EXPECT_EQ(1024u, cpu.get());
   EXPECT_EQ(128u, mem.get().megabytes());
 
+  newResources = Resources::parse("cpus:1;mem:144");
+
+  // Issue second update that uses the cached pid instead of inspect.
+  update = dockerContainerizer.update(containerId.get(), newResources.get());
+
+  AWAIT_READY(update);
+
+  cpu = cgroups::cpu::shares(cpuHierarchy.get(), cpuCgroup.get());
+
+  ASSERT_SOME(cpu);
+
+  mem = cgroups::memory::soft_limit_in_bytes(
+      memoryHierarchy.get(),
+      memoryCgroup.get());
+
+  ASSERT_SOME(mem);
+
+  EXPECT_EQ(1024u, cpu.get());
+  EXPECT_EQ(144u, mem.get().megabytes());
+
   driver.stop();
   driver.join();