Added docker::killAndRm() to performs 'docker kill && docker rm (-f)'
This will be faster than doing 'docker rm -f' on a running container. Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/78d8e402 Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/78d8e402 Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/78d8e402 Branch: refs/heads/master Commit: 78d8e402c66d9a561e9e4ba75e26a94149dad8cc Parents: ded3558 Author: Yifan Gu <[email protected]> Authored: Thu Jul 3 12:06:40 2014 -0700 Committer: Benjamin Hindman <[email protected]> Committed: Mon Aug 4 15:08:16 2014 -0700 ---------------------------------------------------------------------- src/docker/docker.cpp | 26 ++++++++++++++++++++++++-- src/docker/docker.hpp | 12 ++++++++++++ src/slave/containerizer/docker.cpp | 4 ++-- 3 files changed, 38 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/78d8e402/src/docker/docker.cpp ---------------------------------------------------------------------- diff --git a/src/docker/docker.cpp b/src/docker/docker.cpp index 0283b67..1a2d1d2 100644 --- a/src/docker/docker.cpp +++ b/src/docker/docker.cpp @@ -133,7 +133,9 @@ Future<Option<int> > Docker::kill(const string& container) const } -Future<Option<int> > Docker::rm(const string& container, const bool force) const +Future<Option<int> > Docker::rm( + const string& container, + const bool force) const { string cmd = force ? " rm -f " : " rm "; @@ -153,6 +155,26 @@ Future<Option<int> > Docker::rm(const string& container, const bool force) const } +Future<Option<int> > Docker::killAndRm(const string& container) const +{ + return kill(container) + .then(lambda::bind(Docker::_killAndRm, *this, container, lambda::_1)); +} + + +Future<Option<int> > Docker::_killAndRm( + const Docker& docker, + const string& container, + const Option<int>& status) +{ + // If 'kill' fails, then do a 'rm -f'. + if (status.isNone()) { + return docker.rm(container, true); + } + return docker.rm(container); +} + + Future<Docker::Container> Docker::inspect(const string& container) const { VLOG(1) << "Running " << path << " inspect " << container; @@ -276,7 +298,7 @@ Future<list<Docker::Container> > Docker::ps(const bool all) const } return s.get().status() - .then(lambda::bind(&Docker::_ps, Docker(path), s.get())); + .then(lambda::bind(&Docker::_ps, *this, s.get())); } http://git-wip-us.apache.org/repos/asf/mesos/blob/78d8e402/src/docker/docker.hpp ---------------------------------------------------------------------- diff --git a/src/docker/docker.hpp b/src/docker/docker.hpp index 2957e92..9d2205c 100644 --- a/src/docker/docker.hpp +++ b/src/docker/docker.hpp @@ -73,6 +73,14 @@ public: const std::string& container, const bool force = false) const; + // Performs 'docker kill && docker rm' + // if 'docker kill' fails, then will do a 'docker rm -f'. + // + // TODO(yifan): Depreciate this when the docker provides + // something like 'docker rm --kill'. + process::Future<Option<int> > killAndRm( + const std::string& container) const; + // Performs 'docker inspect CONTAINER'. process::Future<Container> inspect( const std::string& container) const; @@ -90,6 +98,10 @@ private: static process::Future<std::list<Container> > _ps( const Docker& docker, const process::Subprocess& s); + static process::Future<Option<int> > _killAndRm( + const Docker& docker, + const std::string& container, + const Option<int>& status); const std::string path; }; http://git-wip-us.apache.org/repos/asf/mesos/blob/78d8e402/src/slave/containerizer/docker.cpp ---------------------------------------------------------------------- diff --git a/src/slave/containerizer/docker.cpp b/src/slave/containerizer/docker.cpp index 5026082..44d4d3d 100644 --- a/src/slave/containerizer/docker.cpp +++ b/src/slave/containerizer/docker.cpp @@ -438,7 +438,7 @@ Future<Nothing> DockerContainerizerProcess::_recover( if (!statuses.keys().contains(id.get())) { // TODO(benh): Retry 'docker rm -f' if it failed but the container // still exists (asynchronously). - docker.rm(container.id(), true); + docker.killAndRm(container.id()); } } @@ -706,7 +706,7 @@ void DockerContainerizerProcess::destroy( // TODO(benh): Retry 'docker rm -f' if it failed but the container // still exists (asynchronously). - docker.rm(DOCKER_NAME_PREFIX + stringify(containerId), true) + docker.killAndRm(DOCKER_NAME_PREFIX + stringify(containerId)) .onAny(defer(self(), &Self::_destroy, containerId, killed, lambda::_1)); }
