[cgroups2] Report usage statistics for the cgroups v2 isolator process.
Overrides `::usage` for the `Cgroups2IsolatorProcess` so the
MesosContainerizer gets ResourceStatistics reported by the
cgroups v2 controllers processes, for example the `CpuControllerProcess`.
diff --git a/src/slave/containerizer/mesos/isolators/cgroups2/cgroups2.cpp b/src/slave/containerizer/mesos/isolators/cgroups2/cgroups2.cpp
index 762e343..a53e65c 100644
--- a/src/slave/containerizer/mesos/isolators/cgroups2/cgroups2.cpp
+++ b/src/slave/containerizer/mesos/isolators/cgroups2/cgroups2.cpp
@@ -674,6 +674,42 @@
}
+Future<ResourceStatistics> Cgroups2IsolatorProcess::usage(
+ const ContainerID& containerId)
+{
+ if (!infos.contains(containerId)) {
+ return Failure("Unknown container");
+ }
+
+ vector<Future<ResourceStatistics>> usages;
+ foreachvalue (const Owned<Controller>& controller, controllers) {
+ if (infos[containerId]->controllers.contains(controller->name())) {
+ usages.push_back(controller->usage(
+ containerId,
+ infos[containerId]->cgroup));
+ }
+ }
+
+ return await(usages)
+ .then([containerId](const vector<Future<ResourceStatistics>>& _usages) {
+ ResourceStatistics result;
+
+ foreach (const Future<ResourceStatistics>& statistics, _usages) {
+ if (statistics.isReady()) {
+ result.MergeFrom(statistics.get());
+ } else {
+ LOG(WARNING) << "Skipping resource statistic for container "
+ << containerId << " because: "
+ << (statistics.isFailed() ? statistics.failure()
+ : "discarded");
+ }
+ }
+
+ return result;
+ });
+}
+
+
Future<ContainerStatus> Cgroups2IsolatorProcess::status(
const ContainerID& containerId)
{
diff --git a/src/slave/containerizer/mesos/isolators/cgroups2/cgroups2.hpp b/src/slave/containerizer/mesos/isolators/cgroups2/cgroups2.hpp
index b2d06b4..9d58b9e 100644
--- a/src/slave/containerizer/mesos/isolators/cgroups2/cgroups2.hpp
+++ b/src/slave/containerizer/mesos/isolators/cgroups2/cgroups2.hpp
@@ -82,6 +82,9 @@
const google::protobuf::Map<
std::string, Value::Scalar>& resourceLimits = {}) override;
+ process::Future<ResourceStatistics> usage(
+ const ContainerID& containerId) override;
+
process::Future<ContainerStatus> status(
const ContainerID& containerId) override;