This is an automated email from the ASF dual-hosted git repository. abudnik pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/mesos.git
commit 81555e8d73507afcc28bc6ee92c2ef456adbaf87 Author: Andrei Budnik <[email protected]> AuthorDate: Tue Mar 3 14:57:49 2020 +0100 Fixed `cgroups::create` for nested cgroups. This patch modifies `cgroups::create` function to call `cloneCpusetCpusMems` for all absent nested cgroups along the path to a cgroup that is accepted as an argument to this function. For instance, if `cgroups::create` is called to create three non-existent cgroups recursively for the path `/a/b/c`, then `cloneCpusetCpusMems` is called to clone both `cpuset.cpus` and `cpuset.mems` for `/a` from its parent, then `/a/b` from `/a`, and so on down the path. Review: https://reviews.apache.org/r/72122/ --- src/linux/cgroups.cpp | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/linux/cgroups.cpp b/src/linux/cgroups.cpp index 73646c9..2234f0d 100644 --- a/src/linux/cgroups.cpp +++ b/src/linux/cgroups.cpp @@ -646,7 +646,19 @@ Try<Nothing> create( const string& cgroup, bool recursive) { + vector<string> missingCgroups; + string currentCgroup; + Path cgroupPath(cgroup); + for (auto it = cgroupPath.begin(); it != cgroupPath.end(); ++it) { + currentCgroup = path::join(currentCgroup, *it); + if (!missingCgroups.empty() || + !os::exists(path::join(hierarchy, currentCgroup))) { + missingCgroups.push_back(currentCgroup); + } + } + string path = path::join(hierarchy, cgroup); + Try<Nothing> mkdir = os::mkdir(path, recursive); if (mkdir.isError()) { return Error( @@ -661,8 +673,18 @@ Try<Nothing> create( "Failed to determine if hierarchy '" + hierarchy + "' has the 'cpuset' subsystem attached: " + attached.error()); } else if (attached->count("cpuset") > 0) { - string parent = Path(path::join("/", cgroup)).dirname(); - return internal::cloneCpusetCpusMems(hierarchy, parent, cgroup); + foreach (const string& cgroup, missingCgroups) { + string parent = Path(cgroup).dirname(); + + Try<Nothing> clone = + internal::cloneCpusetCpusMems(hierarchy, parent, cgroup); + + if (clone.isError()) { + return Error( + "Failed to clone `cpuset.cpus` and `cpuset.mems` from '" + + parent + "' to '" + cgroup + "': " + clone.error()); + } + } } return Nothing();
