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/08/02 05:20:17 UTC

mesos git commit: Implemented `CgroupsIsolatorProcess::cleanup`.

Repository: mesos
Updated Branches:
  refs/heads/master 08dfd59bb -> 9567fb420


Implemented `CgroupsIsolatorProcess::cleanup`.

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


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

Branch: refs/heads/master
Commit: 9567fb42062774ca841da8cbfb45119bc30a0a4d
Parents: 08dfd59
Author: haosdent huang <ha...@gmail.com>
Authored: Mon Aug 1 22:03:41 2016 -0700
Committer: Jie Yu <yu...@gmail.com>
Committed: Mon Aug 1 22:19:38 2016 -0700

----------------------------------------------------------------------
 .../mesos/isolators/cgroups/cgroups.cpp         | 87 +++++++++++++++++++-
 .../mesos/isolators/cgroups/cgroups.hpp         | 21 +++--
 2 files changed, 101 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/9567fb42/src/slave/containerizer/mesos/isolators/cgroups/cgroups.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/isolators/cgroups/cgroups.cpp b/src/slave/containerizer/mesos/isolators/cgroups/cgroups.cpp
index bd20631..c304e2a 100644
--- a/src/slave/containerizer/mesos/isolators/cgroups/cgroups.cpp
+++ b/src/slave/containerizer/mesos/isolators/cgroups/cgroups.cpp
@@ -346,7 +346,92 @@ Future<ContainerStatus> CgroupsIsolatorProcess::status(
 Future<Nothing> CgroupsIsolatorProcess::cleanup(
     const ContainerID& containerId)
 {
-  return Failure("Not implemented.");
+  // Multiple calls may occur during test clean up.
+  if (!infos.contains(containerId)) {
+    VLOG(1) << "Ignoring cleanup request for unknown container: "
+            << containerId;
+
+    return Nothing();
+  }
+
+  list<Future<Nothing>> cleanups;
+  foreachvalue (const Owned<Subsystem>& subsystem, subsystems) {
+    cleanups.push_back(subsystem->cleanup(containerId));
+  }
+
+  return await(cleanups)
+    .then(defer(
+        PID<CgroupsIsolatorProcess>(this),
+        &CgroupsIsolatorProcess::_cleanup,
+        containerId,
+        lambda::_1));
+}
+
+
+Future<Nothing> CgroupsIsolatorProcess::_cleanup(
+    const ContainerID& containerId,
+    const list<Future<Nothing>>& futures)
+{
+  CHECK(infos.contains(containerId));
+
+  vector<string> errors;
+  foreach (const Future<Nothing>& future, futures) {
+    if (!future.isReady()) {
+      errors.push_back((future.isFailed()
+          ? future.failure()
+          : "discarded"));
+    }
+  }
+
+  if (errors.size() > 0) {
+    return Failure(
+        "Failed to cleanup subsystems: " +
+        strings::join(";", errors));
+  }
+
+  list<Future<Nothing>> destroys;
+
+  // TODO(haosdent): Use foreachkey once MESOS-5037 is resolved.
+  foreach (const string& hierarchy, subsystems.keys()) {
+    destroys.push_back(cgroups::destroy(
+        hierarchy,
+        infos[containerId]->cgroup,
+        cgroups::DESTROY_TIMEOUT));
+  }
+
+  return await(destroys)
+    .then(defer(
+        PID<CgroupsIsolatorProcess>(this),
+        &CgroupsIsolatorProcess::__cleanup,
+        containerId,
+        lambda::_1));
+}
+
+
+Future<Nothing> CgroupsIsolatorProcess::__cleanup(
+    const ContainerID& containerId,
+    const list<Future<Nothing>>& futures)
+{
+  CHECK(infos.contains(containerId));
+
+  vector<string> errors;
+  foreach (const Future<Nothing>& future, futures) {
+    if (!future.isReady()) {
+      errors.push_back((future.isFailed()
+          ? future.failure()
+          : "discarded"));
+    }
+  }
+
+  if (errors.size() > 0) {
+    return Failure(
+        "Failed to destroy cgroups: " +
+        strings::join(";", errors));
+  }
+
+  infos.erase(containerId);
+
+  return Nothing();
 }
 
 } // namespace slave {

http://git-wip-us.apache.org/repos/asf/mesos/blob/9567fb42/src/slave/containerizer/mesos/isolators/cgroups/cgroups.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/isolators/cgroups/cgroups.hpp b/src/slave/containerizer/mesos/isolators/cgroups/cgroups.hpp
index 422b465..8814299 100644
--- a/src/slave/containerizer/mesos/isolators/cgroups/cgroups.hpp
+++ b/src/slave/containerizer/mesos/isolators/cgroups/cgroups.hpp
@@ -79,12 +79,8 @@ public:
       const ContainerID& containerId);
 
 private:
-  CgroupsIsolatorProcess(
-      const Flags& _flags,
-      const hashmap<std::string, std::string>& _hierarchies,
-      const multihashmap<std::string, process::Owned<Subsystem>>& _subsystems);
-
-  struct Info {
+  struct Info
+  {
     Info(const ContainerID& _containerId, const std::string& _cgroup)
       : containerId(_containerId), cgroup(_cgroup) {}
 
@@ -96,6 +92,19 @@ private:
     process::Promise<mesos::slave::ContainerLimitation> limitation;
   };
 
+  CgroupsIsolatorProcess(
+      const Flags& _flags,
+      const hashmap<std::string, std::string>& _hierarchies,
+      const multihashmap<std::string, process::Owned<Subsystem>>& _subsystems);
+
+  process::Future<Nothing> _cleanup(
+      const ContainerID& containerId,
+      const std::list<process::Future<Nothing>>& futures);
+
+  process::Future<Nothing> __cleanup(
+      const ContainerID& containerId,
+      const std::list<process::Future<Nothing>>& futures);
+
   const Flags flags;
 
   // Map from subsystem name to hierarchy path.