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()); }
