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

Reply via email to