This is an automated email from the ASF dual-hosted git repository.

bmahler pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mesos.git


The following commit(s) were added to refs/heads/master by this push:
     new b8936677f [cgroups2] Pass device manager to controllers & cgroups2 
isolator.
b8936677f is described below

commit b8936677f99ab10e4210f9b72c8a6be228aa43c5
Author: Jason Zhou <[email protected]>
AuthorDate: Wed Jul 31 15:19:06 2024 -0700

    [cgroups2] Pass device manager to controllers & cgroups2 isolator.
    
    Passes the device manager to the cgroups2 isolator on containerizer
    startup, and sets up the ability for the manager to be passed to the
    device controller and GPU isolator.
    
    Review: https://reviews.apache.org/r/75016/
---
 src/slave/containerizer/containerizer.hpp          |  2 ++
 src/slave/containerizer/mesos/containerizer.cpp    |  9 +++++++--
 .../mesos/isolators/cgroups2/cgroups2.cpp          | 22 ++++++++++++++++------
 .../mesos/isolators/cgroups2/cgroups2.hpp          |  5 ++++-
 4 files changed, 29 insertions(+), 9 deletions(-)

diff --git a/src/slave/containerizer/containerizer.hpp 
b/src/slave/containerizer/containerizer.hpp
index 691fdfe29..dab99f262 100644
--- a/src/slave/containerizer/containerizer.hpp
+++ b/src/slave/containerizer/containerizer.hpp
@@ -45,6 +45,8 @@
 
 #include "slave/containerizer/fetcher.hpp"
 
+#include "slave/containerizer/device_manager/device_manager.hpp"
+
 namespace mesos {
 namespace internal {
 namespace slave {
diff --git a/src/slave/containerizer/mesos/containerizer.cpp 
b/src/slave/containerizer/mesos/containerizer.cpp
index f7ff6b8e5..9bafb137b 100644
--- a/src/slave/containerizer/mesos/containerizer.cpp
+++ b/src/slave/containerizer/mesos/containerizer.cpp
@@ -369,16 +369,21 @@ Try<MesosContainerizer*> MesosContainerizer::create(
   Shared<Provisioner> provisioner = _provisioner->share();
 
 #ifdef __linux__
+  Owned<DeviceManager> device_manager =
+    Owned<DeviceManager>(CHECK_NOTERROR(DeviceManager::create(flags)));
+
   // Initialize either the cgroups v2 or cgroups v1 isolator, based on what
   // is available on the host machine.
-  auto cgroupsIsolatorSelector = [] (const Flags& flags) -> Try<Isolator*> {
+  auto cgroupsIsolatorSelector = [device_manager] (const Flags& flags)
+      -> Try<Isolator*>
+  {
     Try<bool> mounted = cgroups2::mounted();
     if (mounted.isError()) {
       return Error("Failed to determine if the cgroup2 filesystem is mounted: "
                    + mounted.error());
     }
     if (*mounted) {
-      return Cgroups2IsolatorProcess::create(flags);
+      return Cgroups2IsolatorProcess::create(flags, device_manager);
     }
     return CgroupsIsolatorProcess::create(flags);
   };
diff --git a/src/slave/containerizer/mesos/isolators/cgroups2/cgroups2.cpp 
b/src/slave/containerizer/mesos/isolators/cgroups2/cgroups2.cpp
index 2ca388079..3cf3645c4 100644
--- a/src/slave/containerizer/mesos/isolators/cgroups2/cgroups2.cpp
+++ b/src/slave/containerizer/mesos/isolators/cgroups2/cgroups2.cpp
@@ -73,7 +73,9 @@ Cgroups2IsolatorProcess::Cgroups2IsolatorProcess(
 Cgroups2IsolatorProcess::~Cgroups2IsolatorProcess() {}
 
 
-Try<Isolator*> Cgroups2IsolatorProcess::create(const Flags& flags)
+Try<Isolator*> Cgroups2IsolatorProcess::create(
+    const Flags& flags,
+    const Owned<DeviceManager>& deviceManager)
 {
   hashmap<string, Try<Owned<ControllerProcess>>(*)(const Flags&)> creators = {
     {"core", &CoreControllerProcess::create},
@@ -82,6 +84,10 @@ Try<Isolator*> Cgroups2IsolatorProcess::create(const Flags& 
flags)
     {"perf_event", &PerfEventControllerProcess::create}
   };
 
+  hashmap<string, Try<Owned<ControllerProcess>>(*)
+      (const Flags&, const Owned<DeviceManager>)>
+    creatorsWithDeviceManager = {};
+
   hashmap<string, Owned<Controller>> controllers;
 
   // The "core" controller is always enabled because the "cgroup.*" control
@@ -105,9 +111,10 @@ Try<Isolator*> Cgroups2IsolatorProcess::create(const 
Flags& flags)
       }
 
       isolator = strings::remove(isolator, "cgroups/", strings::Mode::PREFIX);
-      if (!creators.contains(isolator)) {
+      if (!creators.contains(isolator)
+          && !creatorsWithDeviceManager.contains(isolator)) {
         return Error(
-            "Unknown or unsupported isolator 'cgroups/" + isolator + "'");
+          "Unknown or unsupported isolator 'cgroups/" + isolator + "'");
       }
 
       controllersToCreate.insert(isolator);
@@ -115,12 +122,15 @@ Try<Isolator*> Cgroups2IsolatorProcess::create(const 
Flags& flags)
   }
 
   foreach (const string& controllerName, controllersToCreate) {
-    if (creators.count(controllerName) == 0) {
+    if (creators.count(controllerName) == 0
+        && creatorsWithDeviceManager.count(controllerName) == 0) {
       return Error(
-          "Cgroups v2 controller '" + controllerName + "' is not supported.");
+        "Cgroups v2 controller '" + controllerName + "' is not supported.");
     }
 
-    Try<Owned<ControllerProcess>> process = creators.at(controllerName)(flags);
+    Try<Owned<ControllerProcess>> process = creators.contains(controllerName)
+        ? creators.at(controllerName)(flags)
+        : creatorsWithDeviceManager.at(controllerName)(flags, deviceManager);
     if (process.isError()) {
       return Error("Failed to create controller '" + controllerName + "': "
                    + process.error());
diff --git a/src/slave/containerizer/mesos/isolators/cgroups2/cgroups2.hpp 
b/src/slave/containerizer/mesos/isolators/cgroups2/cgroups2.hpp
index d60215ec1..2446e064a 100644
--- a/src/slave/containerizer/mesos/isolators/cgroups2/cgroups2.hpp
+++ b/src/slave/containerizer/mesos/isolators/cgroups2/cgroups2.hpp
@@ -27,6 +27,7 @@
 #include <stout/hashmap.hpp>
 #include <stout/try.hpp>
 
+#include "slave/containerizer/device_manager/device_manager.hpp"
 #include "slave/containerizer/mesos/isolator.hpp"
 #include "slave/containerizer/mesos/isolators/cgroups2/controller.hpp"
 #include "slave/flags.hpp"
@@ -57,7 +58,9 @@ namespace slave {
 class Cgroups2IsolatorProcess : public MesosIsolatorProcess
 {
 public:
-  static Try<mesos::slave::Isolator*> create(const Flags& flags);
+  static Try<mesos::slave::Isolator*> create(
+      const Flags& flags,
+      const process::Owned<DeviceManager>& deviceManager);
 
   ~Cgroups2IsolatorProcess() override;
 

Reply via email to