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 e855f1ee7fdcc812cf2bc48d198054a49c5320f2 Author: Andrei Budnik <abud...@mesosphere.com> AuthorDate: Tue Mar 3 14:57:09 2020 +0100 Moved cgroup path helpers to `paths.hpp`. Review: https://reviews.apache.org/r/72121/ --- .../mesos/isolators/network/ports.cpp | 5 +- src/slave/containerizer/mesos/linux_launcher.cpp | 77 ++++------------------ src/slave/containerizer/mesos/linux_launcher.hpp | 6 -- src/slave/containerizer/mesos/paths.cpp | 60 +++++++++++++++++ src/slave/containerizer/mesos/paths.hpp | 14 ++++ 5 files changed, 88 insertions(+), 74 deletions(-) diff --git a/src/slave/containerizer/mesos/isolators/network/ports.cpp b/src/slave/containerizer/mesos/isolators/network/ports.cpp index fec74d3..86d3053 100644 --- a/src/slave/containerizer/mesos/isolators/network/ports.cpp +++ b/src/slave/containerizer/mesos/isolators/network/ports.cpp @@ -38,7 +38,7 @@ #include "slave/constants.hpp" -#include "slave/containerizer/mesos/linux_launcher.hpp" +#include "slave/containerizer/mesos/paths.hpp" using std::list; using std::set; @@ -94,7 +94,8 @@ collectContainerListeners( foreach (const ContainerID& containerId, containerIds) { // Reconstruct the cgroup path from the container ID. - string cgroup = LinuxLauncher::cgroup(cgroupsRoot, containerId); + string cgroup = + containerizer::paths::getCgroupPath(cgroupsRoot, containerId); VLOG(1) << "Checking processes for container " << containerId << " in cgroup " << cgroup; diff --git a/src/slave/containerizer/mesos/linux_launcher.cpp b/src/slave/containerizer/mesos/linux_launcher.cpp index c10092b..0c8c890 100644 --- a/src/slave/containerizer/mesos/linux_launcher.cpp +++ b/src/slave/containerizer/mesos/linux_launcher.cpp @@ -37,7 +37,6 @@ #include "mesos/resources.hpp" -#include "slave/containerizer/mesos/constants.hpp" #include "slave/containerizer/mesos/linux_launcher.hpp" #include "slave/containerizer/mesos/paths.hpp" @@ -105,10 +104,6 @@ private: Future<Nothing> _destroy(const ContainerID& containerId); - // Helper for parsing the cgroup path to determine the container ID - // it belongs to. - Option<ContainerID> parse(const string& cgroup); - static const string subsystem; const Flags flags; const string freezerHierarchy; @@ -194,19 +189,6 @@ bool LinuxLauncher::available() } -string LinuxLauncher::cgroup( - const string& cgroupsRoot, - const ContainerID& containerId) -{ - return path::join( - cgroupsRoot, - containerizer::paths::buildPath( - containerId, - CGROUP_SEPARATOR, - containerizer::paths::JOIN)); -} - - LinuxLauncher::LinuxLauncher( const Flags& flags, const string& freezerHierarchy, @@ -326,7 +308,9 @@ Future<hashset<ContainerID>> LinuxLauncherProcess::recover( // created (e.g., in the future we might have nested containers // that are managed by something else rooted within the freezer // hierarchy). - Option<ContainerID> containerId = parse(cgroup); + Option<ContainerID> containerId = + containerizer::paths::parseCgroupPath(flags.cgroups_root, cgroup); + if (containerId.isNone()) { LOG(INFO) << "Not recovering cgroup " << cgroup; continue; @@ -510,7 +494,9 @@ Try<pid_t> LinuxLauncherProcess::fork( parentHooks.emplace_back(Subprocess::ParentHook([=](pid_t child) { return cgroups::isolate( freezerHierarchy, - LinuxLauncher::cgroup(this->flags.cgroups_root, containerId), + containerizer::paths::getCgroupPath( + this->flags.cgroups_root, + containerId), child); })); @@ -519,7 +505,9 @@ Try<pid_t> LinuxLauncherProcess::fork( parentHooks.emplace_back(Subprocess::ParentHook([=](pid_t child) { return cgroups::isolate( systemdHierarchy.get(), - LinuxLauncher::cgroup(this->flags.cgroups_root, containerId), + containerizer::paths::getCgroupPath( + this->flags.cgroups_root, + containerId), child); })); } @@ -591,7 +579,7 @@ Future<Nothing> LinuxLauncherProcess::destroy(const ContainerID& containerId) } const string cgroup = - LinuxLauncher::cgroup(flags.cgroups_root, container->id); + containerizer::paths::getCgroupPath(flags.cgroups_root, container->id); // We remove the container so that we don't attempt multiple // destroys simultaneously and no other functions will return @@ -641,7 +629,7 @@ Future<Nothing> LinuxLauncherProcess::_destroy(const ContainerID& containerId) } const string cgroup = - LinuxLauncher::cgroup(flags.cgroups_root, containerId); + containerizer::paths::getCgroupPath(flags.cgroups_root, containerId); if (!cgroups::exists(systemdHierarchy.get(), cgroup)) { return Nothing(); @@ -675,49 +663,6 @@ Future<ContainerStatus> LinuxLauncherProcess::status( return status; } - -Option<ContainerID> LinuxLauncherProcess::parse(const string& cgroup) -{ - Option<ContainerID> current; - - // Start not expecting to see a separator and adjust after each - // non-separator we see. - bool separator = false; - - vector<string> tokens = strings::tokenize( - strings::remove(cgroup, flags.cgroups_root, strings::PREFIX), - stringify(os::PATH_SEPARATOR)); - - for (size_t i = 0; i < tokens.size(); i++) { - if (separator && tokens[i] == CGROUP_SEPARATOR) { - separator = false; - - // If the cgroup has CGROUP_SEPARATOR as the last segment, - // should just ignore it because this cgroup belongs to us. - if (i == tokens.size() - 1) { - return None(); - } else { - continue; - } - } else if (separator) { - return None(); - } else { - separator = true; - } - - ContainerID id; - id.set_value(tokens[i]); - - if (current.isSome()) { - id.mutable_parent()->CopyFrom(current.get()); - } - - current = id; - } - - return current; -} - } // namespace slave { } // namespace internal { } // namespace mesos { diff --git a/src/slave/containerizer/mesos/linux_launcher.hpp b/src/slave/containerizer/mesos/linux_launcher.hpp index 993a264..8d63411 100644 --- a/src/slave/containerizer/mesos/linux_launcher.hpp +++ b/src/slave/containerizer/mesos/linux_launcher.hpp @@ -37,12 +37,6 @@ public: // Returns 'true' if prerequisites for using LinuxLauncher are available. static bool available(); - // Helper for determining the cgroup for a container (i.e., the path - // in a cgroup subsystem). - static std::string cgroup( - const std::string& cgroupsRoot, - const ContainerID& containerId); - ~LinuxLauncher() override; process::Future<hashset<ContainerID>> recover( diff --git a/src/slave/containerizer/mesos/paths.cpp b/src/slave/containerizer/mesos/paths.cpp index b028795..8230028 100644 --- a/src/slave/containerizer/mesos/paths.cpp +++ b/src/slave/containerizer/mesos/paths.cpp @@ -22,7 +22,9 @@ #include "common/protobuf_utils.hpp" #include "common/resources_utils.hpp" +#include "slave/containerizer/mesos/constants.hpp" #include "slave/containerizer/mesos/paths.hpp" + #include "slave/state.hpp" #ifndef __WINDOWS__ @@ -594,6 +596,64 @@ Try<string> getParentShmPath( return parentShmPath; } + +string getCgroupPath( + const string& cgroupsRoot, + const ContainerID& containerId) +{ + return path::join( + cgroupsRoot, + containerizer::paths::buildPath( + containerId, + CGROUP_SEPARATOR, + containerizer::paths::JOIN)); +} + + +Option<ContainerID> parseCgroupPath( + const string& cgroupsRoot, + const string& cgroup) +{ + Option<ContainerID> current; + + // Start not expecting to see a separator and adjust after each + // non-separator we see. + bool separator = false; + + vector<string> tokens = strings::tokenize( + strings::remove(cgroup, cgroupsRoot, strings::PREFIX), + stringify(os::PATH_SEPARATOR)); + + for (size_t i = 0; i < tokens.size(); i++) { + if (separator && tokens[i] == CGROUP_SEPARATOR) { + separator = false; + + // If the cgroup has CGROUP_SEPARATOR as the last segment, + // should just ignore it because this cgroup belongs to us. + if (i == tokens.size() - 1) { + return None(); + } else { + continue; + } + } else if (separator) { + return None(); + } else { + separator = true; + } + + ContainerID id; + id.set_value(tokens[i]); + + if (current.isSome()) { + id.mutable_parent()->CopyFrom(current.get()); + } + + current = id; + } + + return current; +} + } // namespace paths { } // namespace containerizer { } // namespace slave { diff --git a/src/slave/containerizer/mesos/paths.hpp b/src/slave/containerizer/mesos/paths.hpp index e35d380..5f188e5 100644 --- a/src/slave/containerizer/mesos/paths.hpp +++ b/src/slave/containerizer/mesos/paths.hpp @@ -272,6 +272,20 @@ Try<std::string> getParentShmPath( const std::string runtimeDir, const ContainerID& containerId); + +// Helper for determining the cgroup for a container (i.e., the path +// in a cgroup subsystem). +std::string getCgroupPath( + const std::string& cgroupsRoot, + const ContainerID& containerId); + + +// Helper for parsing the cgroup path to determine the container ID +// it belongs to. +Option<ContainerID> parseCgroupPath( + const std::string& cgroupsRoot, + const std::string& cgroup); + } // namespace paths { } // namespace containerizer { } // namespace slave {