Repository: mesos Updated Branches: refs/heads/master 0e76bd018 -> 357abbeb0
Implemented `CgroupsIsolatorProcess::create`. Review: https://reviews.apache.org/r/49814/ Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/357abbeb Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/357abbeb Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/357abbeb Branch: refs/heads/master Commit: 357abbeb05b60efc1ed033481c4b8bc19386ac1a Parents: 0e76bd0 Author: haosdent huang <haosd...@gmail.com> Authored: Mon Jul 25 09:23:41 2016 -0700 Committer: Jie Yu <yujie....@gmail.com> Committed: Mon Jul 25 09:23:41 2016 -0700 ---------------------------------------------------------------------- .../mesos/isolators/cgroups/cgroups.cpp | 62 +++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/357abbeb/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 4a9f55b..348f105 100644 --- a/src/slave/containerizer/mesos/isolators/cgroups/cgroups.cpp +++ b/src/slave/containerizer/mesos/isolators/cgroups/cgroups.cpp @@ -15,6 +15,10 @@ // limitations under the License. #include <stout/error.hpp> +#include <stout/foreach.hpp> +#include <stout/strings.hpp> + +#include "linux/cgroups.hpp" #include "slave/containerizer/mesos/isolators/cgroups/cgroups.hpp" @@ -49,7 +53,63 @@ CgroupsIsolatorProcess::~CgroupsIsolatorProcess() {} Try<Isolator*> CgroupsIsolatorProcess::create(const Flags& flags) { - return Error("Not implemented."); + // Subsystem name -> hierarchy path. + hashmap<string, string> hierarchies; + + // Hierarchy path -> subsystem object. + multihashmap<string, Owned<Subsystem>> subsystems; + + // Multimap: isolator name -> subsystem name. + multihashmap<string, string> isolatorMap = { + }; + + foreach (string isolator, strings::tokenize(flags.isolation, ",")) { + if (!strings::startsWith(isolator, "cgroups/")) { + // Skip when the isolator is not related to cgroups. + continue; + } + + isolator = strings::remove(isolator, "cgroups/", strings::Mode::PREFIX); + + // A cgroups isolator name may map to multiple subsystems. We need to + // convert the isolator name to its associated subsystems. + foreach (const string& subsystemName, isolatorMap.get(isolator)) { + if (hierarchies.contains(subsystemName)) { + // Skip when the subsystem exists. + continue; + } + + // Prepare hierarchy if it does not exist. + Try<string> hierarchy = cgroups::prepare( + flags.cgroups_hierarchy, + subsystemName, + flags.cgroups_root); + + if (hierarchy.isError()) { + return Error( + "Failed to prepare hierarchy for the subsystem '" + subsystemName + + "': " + hierarchy.error()); + } + + // Create and load the subsystem. + Try<Owned<Subsystem>> subsystem = + Subsystem::create(flags, subsystemName, hierarchy.get()); + + if (subsystem.isError()) { + return Error( + "Failed to create subsystem '" + subsystemName + "': " + + subsystem.error()); + } + + subsystems.put(hierarchy.get(), subsystem.get()); + hierarchies.put(subsystemName, hierarchy.get()); + } + } + + Owned<MesosIsolatorProcess> process( + new CgroupsIsolatorProcess(flags, hierarchies, subsystems)); + + return new MesosIsolator(process); }