Avoid docker inspect on each usage call

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


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

Branch: refs/heads/docker_symlink
Commit: f9a80dcdba42828363ddd901e993f5b8837339f1
Parents: 23be6c8
Author: Timothy Chen <[email protected]>
Authored: Fri Oct 17 16:05:12 2014 -0700
Committer: Timothy Chen <[email protected]>
Committed: Tue Oct 28 16:53:39 2014 -0700

----------------------------------------------------------------------
 src/slave/containerizer/docker.cpp | 28 ++++++++++++++++++++++++----
 1 file changed, 24 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/f9a80dcd/src/slave/containerizer/docker.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/docker.cpp 
b/src/slave/containerizer/docker.cpp
index e29f004..d7048d8 100644
--- a/src/slave/containerizer/docker.cpp
+++ b/src/slave/containerizer/docker.cpp
@@ -200,8 +200,12 @@ private:
       pid_t pid);
 
   Future<ResourceStatistics> _usage(
-    const ContainerID& containerId,
-    const Docker::Container& container);
+      const ContainerID& containerId,
+      const Docker::Container& container);
+
+  Future<ResourceStatistics> __usage(
+      const ContainerID& containerId,
+      pid_t pid);
 
   // Call back for when the executor exits. This will trigger
   // container destroy.
@@ -1382,6 +1386,11 @@ Future<ResourceStatistics> 
DockerContainerizerProcess::usage(
     return Failure("Container is being removed: " + stringify(containerId));
   }
 
+  // Skip inspecting the docker container if we already have the pid.
+  if (container->pid.isSome()) {
+    return __usage(containerId, container->pid.get());
+  }
+
   return docker->inspect(container->name())
     .then(defer(self(), &Self::_usage, containerId, lambda::_1));
 #endif // __linux__
@@ -1407,11 +1416,22 @@ Future<ResourceStatistics> 
DockerContainerizerProcess::_usage(
     return Failure("Container is not running");
   }
 
+  container->pid = pid;
+
+  return __usage(containerId, pid.get());
+}
+
+
+Future<ResourceStatistics> DockerContainerizerProcess::__usage(
+    const ContainerID& containerId,
+    pid_t pid)
+{
+  Container* container = containers_[containerId];
+
   // Note that here getting the root pid is enough because
   // the root process acts as an 'init' process in the docker
   // container, so no other child processes will escape it.
-  Try<ResourceStatistics> statistics =
-    mesos::internal::usage(pid.get(), true, true);
+  Try<ResourceStatistics> statistics = mesos::internal::usage(pid, true, true);
   if (statistics.isError()) {
     return Failure(statistics.error());
   }

Reply via email to