You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by ji...@apache.org on 2016/04/24 20:04:08 UTC

mesos git commit: Implemented cleanup() for docker volume isolator.

Repository: mesos
Updated Branches:
  refs/heads/master e8e65535c -> 3add364e1


Implemented cleanup() for docker volume isolator.

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


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

Branch: refs/heads/master
Commit: 3add364e10ea6dac116bc8102b37f0de9db8bf99
Parents: e8e6553
Author: Guangya Liu <gy...@gmail.com>
Authored: Sun Apr 24 11:03:36 2016 -0700
Committer: Jie Yu <yu...@gmail.com>
Committed: Sun Apr 24 11:03:36 2016 -0700

----------------------------------------------------------------------
 .../mesos/isolators/docker/volume/isolator.cpp  | 79 ++++++++++++++++++++
 .../mesos/isolators/docker/volume/isolator.hpp  |  4 +
 2 files changed, 83 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/3add364e/src/slave/containerizer/mesos/isolators/docker/volume/isolator.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/isolators/docker/volume/isolator.cpp b/src/slave/containerizer/mesos/isolators/docker/volume/isolator.cpp
index 7c147cf..c33cef3 100644
--- a/src/slave/containerizer/mesos/isolators/docker/volume/isolator.cpp
+++ b/src/slave/containerizer/mesos/isolators/docker/volume/isolator.cpp
@@ -346,6 +346,85 @@ Future<ResourceStatistics> DockerVolumeIsolatorProcess::usage(
 Future<Nothing> DockerVolumeIsolatorProcess::cleanup(
     const ContainerID& containerId)
 {
+  if (!infos.contains(containerId)) {
+    VLOG(1) << "Ignoring cleanup request for unknown container '"
+            << containerId << "'";
+
+    return Nothing();
+  }
+
+  hashmap<DockerVolume, int> references;
+  foreachvalue (const Owned<Info>& info, infos) {
+    foreach (const DockerVolume& volume, info->volumes) {
+      if (!references.contains(volume)) {
+        references[volume] = 1;
+      } else {
+        references[volume]++;
+      }
+    }
+  }
+
+  list<Future<Nothing>> futures;
+
+  foreach (const DockerVolume& volume, infos[containerId]->volumes) {
+    if (references.contains(volume) && references[volume] > 1) {
+      VLOG(1) << "Cannot unmount the volume with driver '"
+              << volume.driver() << "' and name '" << volume.name()
+              << "' for container " << containerId
+              << " since its reference count is " << references[volume];
+      continue;
+    }
+
+    VLOG(1) << "Unmounting the volume with driver '"
+            << volume.driver() << "' and name '" << volume.name()
+            << "' for container " << containerId;
+
+    // Invoke dvdcli client to unmount the docker volume.
+    futures.push_back(client->unmount(volume.driver(), volume.name()));
+  }
+
+  return await(futures)
+    .then(defer(
+        PID<DockerVolumeIsolatorProcess>(this),
+        &DockerVolumeIsolatorProcess::_cleanup,
+        containerId,
+        lambda::_1));
+}
+
+
+Future<Nothing> DockerVolumeIsolatorProcess::_cleanup(
+    const ContainerID& containerId,
+    const list<Future<Nothing>>& futures)
+{
+  CHECK(infos.contains(containerId));
+
+  vector<string> messages;
+  foreach (const Future<Nothing>& future, futures) {
+    if (!future.isReady()) {
+      messages.push_back(future.isFailed() ? future.failure() : "discarded");
+    }
+  }
+
+  if (!messages.empty()) {
+    return Failure(strings::join("\n", messages));
+  }
+
+  const string containerDir =
+    paths::getContainerDir(rootDir, containerId.value());
+
+  Try<Nothing> rmdir = os::rmdir(containerDir);
+  if (rmdir.isError()) {
+    return Failure(
+        "Failed to remove the checkpoint directory at '" +
+        containerDir + "': " + rmdir.error());
+  }
+
+  LOG(INFO) << "Removed the checkpoint directory at '" << containerDir
+            << "' for container " << containerId;
+
+  // Remove all this container's docker volume information from infos.
+  infos.erase(containerId);
+
   return Nothing();
 }
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/3add364e/src/slave/containerizer/mesos/isolators/docker/volume/isolator.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/isolators/docker/volume/isolator.hpp b/src/slave/containerizer/mesos/isolators/docker/volume/isolator.hpp
index 02e1cff..8fb6c38 100644
--- a/src/slave/containerizer/mesos/isolators/docker/volume/isolator.hpp
+++ b/src/slave/containerizer/mesos/isolators/docker/volume/isolator.hpp
@@ -88,6 +88,10 @@ private:
       const std::vector<std::string>& targets,
       const std::list<process::Future<std::string>>& futures);
 
+  process::Future<Nothing> _cleanup(
+      const ContainerID& containerId,
+      const std::list<process::Future<Nothing>>& futures);
+
   const Flags flags;
   const std::string rootDir;
   const process::Owned<docker::volume::DriverClient> client;