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 16:35:28 UTC

mesos git commit: Used `await` instead of `collect` on `Subsystem` operations.

Repository: mesos
Updated Branches:
  refs/heads/master 59a61a4b3 -> 58a1bd139


Used `await` instead of `collect` on `Subsystem` operations.

In order to get the error message for each subsystem, this patch changes
to use `await` on `Subsystem` operations and combines every unready
`Future` error message.

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


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

Branch: refs/heads/master
Commit: 58a1bd1396f7f124537dd21812bcb65ee6802452
Parents: 59a61a4
Author: haosdent huang <ha...@gmail.com>
Authored: Tue Aug 2 09:18:30 2016 -0700
Committer: Jie Yu <yu...@gmail.com>
Committed: Tue Aug 2 09:35:15 2016 -0700

----------------------------------------------------------------------
 .../mesos/isolators/cgroups/cgroups.cpp         | 97 +++++++++++++++++---
 .../mesos/isolators/cgroups/cgroups.hpp         | 11 +++
 2 files changed, 97 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/58a1bd13/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 c304e2a..5a50a62 100644
--- a/src/slave/containerizer/mesos/isolators/cgroups/cgroups.cpp
+++ b/src/slave/containerizer/mesos/isolators/cgroups/cgroups.cpp
@@ -201,18 +201,41 @@ Future<Option<ContainerLaunchInfo>> CgroupsIsolatorProcess::prepare(
     prepares.push_back(subsystem->prepare(containerId));
   }
 
-  // TODO(haosdent): Here we assume the command executor's resources
-  // include the task's resources. Revisit here if this semantics
-  // changes.
-  return collect(prepares)
+  return await(prepares)
     .then(defer(
         PID<CgroupsIsolatorProcess>(this),
-        &CgroupsIsolatorProcess::update,
+        &CgroupsIsolatorProcess::_prepare,
         containerId,
-        containerConfig.executor_info().resources()))
-    .then([]() -> Future<Option<ContainerLaunchInfo>> {
-      return None();
-    });
+        containerConfig,
+        lambda::_1));
+}
+
+
+Future<Option<ContainerLaunchInfo>> CgroupsIsolatorProcess::_prepare(
+    const ContainerID& containerId,
+    const ContainerConfig& containerConfig,
+    const list<Future<Nothing>>& futures)
+{
+  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 prepare subsystems: " +
+        strings::join(";", errors));
+  }
+
+  // TODO(haosdent): Here we assume the command executor's resources
+  // include the task's resources. Revisit here if this semantics
+  // changes.
+  return update(containerId, containerConfig.executor_info().resources())
+    .then([]() { return Option<ContainerLaunchInfo>::none(); });
 }
 
 
@@ -248,7 +271,33 @@ Future<Nothing> CgroupsIsolatorProcess::isolate(
     isolates.push_back(subsystem->isolate(containerId, pid));
   }
 
-  return collect(isolates).then([]() { return Nothing(); });
+  return await(isolates)
+    .then(defer(
+        PID<CgroupsIsolatorProcess>(this),
+        &CgroupsIsolatorProcess::_isolate,
+        lambda::_1));
+}
+
+
+Future<Nothing> CgroupsIsolatorProcess::_isolate(
+    const list<Future<Nothing>>& futures)
+{
+  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 isolate subsystems: " +
+        strings::join(";", errors));
+  }
+
+  return Nothing();
 }
 
 
@@ -276,7 +325,33 @@ Future<Nothing> CgroupsIsolatorProcess::update(
     updates.push_back(subsystem->update(containerId, resources));
   }
 
-  return collect(updates).then([]() { return Nothing(); });
+  return await(updates)
+    .then(defer(
+        PID<CgroupsIsolatorProcess>(this),
+        &CgroupsIsolatorProcess::_update,
+        lambda::_1));
+}
+
+
+Future<Nothing> CgroupsIsolatorProcess::_update(
+    const list<Future<Nothing>>& futures)
+{
+  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 update subsystems: " +
+        strings::join(";", errors));
+  }
+
+  return Nothing();
 }
 
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/58a1bd13/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 8814299..1477b5e 100644
--- a/src/slave/containerizer/mesos/isolators/cgroups/cgroups.hpp
+++ b/src/slave/containerizer/mesos/isolators/cgroups/cgroups.hpp
@@ -97,6 +97,17 @@ private:
       const hashmap<std::string, std::string>& _hierarchies,
       const multihashmap<std::string, process::Owned<Subsystem>>& _subsystems);
 
+  process::Future<Option<mesos::slave::ContainerLaunchInfo>> _prepare(
+      const ContainerID& containerId,
+      const mesos::slave::ContainerConfig& containerConfig,
+      const std::list<process::Future<Nothing>>& futures);
+
+  process::Future<Nothing> _isolate(
+      const std::list<process::Future<Nothing>>& futures);
+
+  process::Future<Nothing> _update(
+      const std::list<process::Future<Nothing>>& futures);
+
   process::Future<Nothing> _cleanup(
       const ContainerID& containerId,
       const std::list<process::Future<Nothing>>& futures);