You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by qi...@apache.org on 2020/03/20 09:03:01 UTC
[mesos] 04/21: Updated the `update()` method of isolator to handle
resource limits.
This is an automated email from the ASF dual-hosted git repository.
qianzhang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mesos.git
commit 10d835645f9d3ecd10260e30a3c0c2c23950e7cc
Author: Qian Zhang <zh...@gmail.com>
AuthorDate: Thu Dec 5 14:59:54 2019 +0800
Updated the `update()` method of isolator to handle resource limits.
Review: https://reviews.apache.org/r/71884
---
include/mesos/slave/isolator.hpp | 4 +++-
src/slave/containerizer/mesos/isolator.cpp | 6 ++++--
src/slave/containerizer/mesos/isolator.hpp | 8 ++++++--
src/slave/containerizer/mesos/isolator_tracker.cpp | 8 +++++---
src/slave/containerizer/mesos/isolator_tracker.hpp | 4 +++-
src/slave/containerizer/mesos/isolators/cgroups/cgroups.cpp | 10 +++++++---
src/slave/containerizer/mesos/isolators/cgroups/cgroups.hpp | 4 +++-
src/slave/containerizer/mesos/isolators/filesystem/linux.cpp | 9 +++++----
src/slave/containerizer/mesos/isolators/filesystem/linux.hpp | 4 +++-
src/slave/containerizer/mesos/isolators/filesystem/posix.cpp | 9 +++++----
src/slave/containerizer/mesos/isolators/filesystem/posix.hpp | 4 +++-
src/slave/containerizer/mesos/isolators/gpu/isolator.cpp | 8 +++++---
src/slave/containerizer/mesos/isolators/gpu/isolator.hpp | 4 +++-
.../containerizer/mesos/isolators/network/port_mapping.cpp | 11 ++++++-----
.../containerizer/mesos/isolators/network/port_mapping.hpp | 4 +++-
src/slave/containerizer/mesos/isolators/network/ports.cpp | 7 ++++---
src/slave/containerizer/mesos/isolators/network/ports.hpp | 4 +++-
src/slave/containerizer/mesos/isolators/posix.hpp | 4 +++-
src/slave/containerizer/mesos/isolators/posix/disk.cpp | 7 ++++---
src/slave/containerizer/mesos/isolators/posix/disk.hpp | 4 +++-
src/slave/containerizer/mesos/isolators/windows/cpu.cpp | 9 ++++++---
src/slave/containerizer/mesos/isolators/windows/cpu.hpp | 5 ++++-
src/slave/containerizer/mesos/isolators/windows/mem.cpp | 9 ++++++---
src/slave/containerizer/mesos/isolators/windows/mem.hpp | 5 ++++-
src/slave/containerizer/mesos/isolators/xfs/disk.cpp | 7 ++++---
src/slave/containerizer/mesos/isolators/xfs/disk.hpp | 4 +++-
src/tests/containerizer/isolator.hpp | 7 +++++--
src/tests/slave_tests.cpp | 2 +-
28 files changed, 114 insertions(+), 57 deletions(-)
diff --git a/include/mesos/slave/isolator.hpp b/include/mesos/slave/isolator.hpp
index 65893e1..a3f1fcf 100644
--- a/include/mesos/slave/isolator.hpp
+++ b/include/mesos/slave/isolator.hpp
@@ -97,7 +97,9 @@ public:
// Update the resources allocated to the container.
virtual process::Future<Nothing> update(
const ContainerID& containerId,
- const Resources& resources)
+ const Resources& resourceRequests,
+ const google::protobuf::Map<
+ std::string, Value::Scalar>& resourceLimits = {})
{
return Nothing();
}
diff --git a/src/slave/containerizer/mesos/isolator.cpp b/src/slave/containerizer/mesos/isolator.cpp
index ac33398..db81d9b 100644
--- a/src/slave/containerizer/mesos/isolator.cpp
+++ b/src/slave/containerizer/mesos/isolator.cpp
@@ -102,12 +102,14 @@ Future<ContainerLimitation> MesosIsolator::watch(
Future<Nothing> MesosIsolator::update(
const ContainerID& containerId,
- const Resources& resources)
+ const Resources& resourceRequests,
+ const google::protobuf::Map<string, Value::Scalar>& resourceLimits)
{
return dispatch(process.get(),
&MesosIsolatorProcess::update,
containerId,
- resources);
+ resourceRequests,
+ resourceLimits);
}
diff --git a/src/slave/containerizer/mesos/isolator.hpp b/src/slave/containerizer/mesos/isolator.hpp
index a558679..efc0f79 100644
--- a/src/slave/containerizer/mesos/isolator.hpp
+++ b/src/slave/containerizer/mesos/isolator.hpp
@@ -61,7 +61,9 @@ public:
process::Future<Nothing> update(
const ContainerID& containerId,
- const Resources& resources) override;
+ const Resources& resourceRequests,
+ const google::protobuf::Map<
+ std::string, Value::Scalar>& resourceLimits = {}) override;
process::Future<ResourceStatistics> usage(
const ContainerID& containerId) override;
@@ -121,7 +123,9 @@ public:
virtual process::Future<Nothing> update(
const ContainerID& containerId,
- const Resources& resources)
+ const Resources& resourceRequests,
+ const google::protobuf::Map<
+ std::string, Value::Scalar>& resourceLimits = {})
{
return Nothing();
}
diff --git a/src/slave/containerizer/mesos/isolator_tracker.cpp b/src/slave/containerizer/mesos/isolator_tracker.cpp
index c78e883..ee48956 100644
--- a/src/slave/containerizer/mesos/isolator_tracker.cpp
+++ b/src/slave/containerizer/mesos/isolator_tracker.cpp
@@ -104,14 +104,16 @@ Future<ContainerLimitation> IsolatorTracker::watch(
Future<Nothing> IsolatorTracker::update(
const ContainerID& containerId,
- const Resources& resources)
+ const Resources& resourceRequests,
+ const google::protobuf::Map<string, Value::Scalar>& resourceLimits)
{
return tracker->track(
- isolator->update(containerId, resources),
+ isolator->update(containerId, resourceRequests, resourceLimits),
strings::format("%s::update", isolatorName).get(),
COMPONENT_NAME_CONTAINERIZER,
{{"containerId", stringify(containerId)},
- {"resources", stringify(resources)}});
+ {"resourceRequests", stringify(resourceRequests)},
+ {"resourceLimits", stringify(resourceLimits)}});
}
diff --git a/src/slave/containerizer/mesos/isolator_tracker.hpp b/src/slave/containerizer/mesos/isolator_tracker.hpp
index 563db10..58a416b 100644
--- a/src/slave/containerizer/mesos/isolator_tracker.hpp
+++ b/src/slave/containerizer/mesos/isolator_tracker.hpp
@@ -54,7 +54,9 @@ public:
process::Future<Nothing> update(
const ContainerID& containerId,
- const Resources& resources) override;
+ const Resources& resourceRequests,
+ const google::protobuf::Map<
+ std::string, Value::Scalar>& resourceLimits = {}) override;
process::Future<ResourceStatistics> usage(
const ContainerID& containerId) override;
diff --git a/src/slave/containerizer/mesos/isolators/cgroups/cgroups.cpp b/src/slave/containerizer/mesos/isolators/cgroups/cgroups.cpp
index bf2a4d8..52d1479 100644
--- a/src/slave/containerizer/mesos/isolators/cgroups/cgroups.cpp
+++ b/src/slave/containerizer/mesos/isolators/cgroups/cgroups.cpp
@@ -566,7 +566,10 @@ Future<Option<ContainerLaunchInfo>> CgroupsIsolatorProcess::_prepare(
strings::join(";", errors));
}
- return update(containerId, containerConfig.resources())
+ return update(
+ containerId,
+ containerConfig.resources(),
+ containerConfig.limits())
.then(defer(
PID<CgroupsIsolatorProcess>(this),
&CgroupsIsolatorProcess::__prepare,
@@ -856,7 +859,8 @@ void CgroupsIsolatorProcess::_watch(
Future<Nothing> CgroupsIsolatorProcess::update(
const ContainerID& containerId,
- const Resources& resources)
+ const Resources& resourceRequests,
+ const google::protobuf::Map<string, Value::Scalar>& resourceLimits)
{
if (!infos.contains(containerId)) {
return Failure("Unknown container");
@@ -868,7 +872,7 @@ Future<Nothing> CgroupsIsolatorProcess::update(
updates.push_back(subsystem->update(
containerId,
infos[containerId]->cgroup,
- resources));
+ resourceRequests));
}
}
diff --git a/src/slave/containerizer/mesos/isolators/cgroups/cgroups.hpp b/src/slave/containerizer/mesos/isolators/cgroups/cgroups.hpp
index 8718b7a..cd62a77 100644
--- a/src/slave/containerizer/mesos/isolators/cgroups/cgroups.hpp
+++ b/src/slave/containerizer/mesos/isolators/cgroups/cgroups.hpp
@@ -70,7 +70,9 @@ public:
process::Future<Nothing> update(
const ContainerID& containerId,
- const Resources& resources) override;
+ const Resources& resourceRequests,
+ const google::protobuf::Map<
+ std::string, Value::Scalar>& resourceLimits = {}) override;
process::Future<ResourceStatistics> usage(
const ContainerID& containerId) override;
diff --git a/src/slave/containerizer/mesos/isolators/filesystem/linux.cpp b/src/slave/containerizer/mesos/isolators/filesystem/linux.cpp
index 0819738..520d023 100644
--- a/src/slave/containerizer/mesos/isolators/filesystem/linux.cpp
+++ b/src/slave/containerizer/mesos/isolators/filesystem/linux.cpp
@@ -850,7 +850,8 @@ Future<Option<ContainerLaunchInfo>> LinuxFilesystemIsolatorProcess::prepare(
Future<Nothing> LinuxFilesystemIsolatorProcess::update(
const ContainerID& containerId,
- const Resources& resources)
+ const Resources& resourceRequests,
+ const google::protobuf::Map<string, Value::Scalar>& resourceLimits)
{
if (containerId.has_parent()) {
return Failure("Not supported for nested containers");
@@ -882,7 +883,7 @@ Future<Nothing> LinuxFilesystemIsolatorProcess::update(
continue;
}
- if (resources.contains(resource)) {
+ if (resourceRequests.contains(resource)) {
continue;
}
@@ -923,7 +924,7 @@ Future<Nothing> LinuxFilesystemIsolatorProcess::update(
vector<Future<gid_t>> futures;
// We then mount new persistent volumes.
- foreach (const Resource& resource, resources.persistentVolumes()) {
+ foreach (const Resource& resource, resourceRequests.persistentVolumes()) {
// This is enforced by the master.
CHECK(resource.disk().has_volume());
@@ -1075,7 +1076,7 @@ Future<Nothing> LinuxFilesystemIsolatorProcess::update(
}
// Store the new resources;
- info->resources = resources;
+ info->resources = resourceRequests;
return collect(futures)
.then(defer(self(), [this, containerId](const vector<gid_t>& gids)
diff --git a/src/slave/containerizer/mesos/isolators/filesystem/linux.hpp b/src/slave/containerizer/mesos/isolators/filesystem/linux.hpp
index e6fe688..04ac167 100644
--- a/src/slave/containerizer/mesos/isolators/filesystem/linux.hpp
+++ b/src/slave/containerizer/mesos/isolators/filesystem/linux.hpp
@@ -63,7 +63,9 @@ public:
process::Future<Nothing> update(
const ContainerID& containerId,
- const Resources& resources) override;
+ const Resources& resourceRequests,
+ const google::protobuf::Map<
+ std::string, Value::Scalar>& resourceLimits = {}) override;
process::Future<Nothing> cleanup(
const ContainerID& containerId) override;
diff --git a/src/slave/containerizer/mesos/isolators/filesystem/posix.cpp b/src/slave/containerizer/mesos/isolators/filesystem/posix.cpp
index dbf149a..e80cc1e 100644
--- a/src/slave/containerizer/mesos/isolators/filesystem/posix.cpp
+++ b/src/slave/containerizer/mesos/isolators/filesystem/posix.cpp
@@ -135,7 +135,8 @@ Future<Option<ContainerLaunchInfo>> PosixFilesystemIsolatorProcess::prepare(
Future<Nothing> PosixFilesystemIsolatorProcess::update(
const ContainerID& containerId,
- const Resources& resources)
+ const Resources& resourceRequests,
+ const google::protobuf::Map<string, Value::Scalar>& resourceLimits)
{
if (!infos.contains(containerId)) {
return Failure("Unknown container");
@@ -163,7 +164,7 @@ Future<Nothing> PosixFilesystemIsolatorProcess::update(
continue;
}
- if (resources.contains(resource)) {
+ if (resourceRequests.contains(resource)) {
continue;
}
@@ -193,7 +194,7 @@ Future<Nothing> PosixFilesystemIsolatorProcess::update(
vector<Future<gid_t>> futures;
// We then link additional persistent volumes.
- foreach (const Resource& resource, resources.persistentVolumes()) {
+ foreach (const Resource& resource, resourceRequests.persistentVolumes()) {
// This is enforced by the master.
CHECK(resource.disk().has_volume());
@@ -335,7 +336,7 @@ Future<Nothing> PosixFilesystemIsolatorProcess::update(
}
// Store the updated resources.
- info->resources = resources;
+ info->resources = resourceRequests;
return collect(futures)
.then(defer(self(), [this, containerId](const vector<gid_t>& gids)
diff --git a/src/slave/containerizer/mesos/isolators/filesystem/posix.hpp b/src/slave/containerizer/mesos/isolators/filesystem/posix.hpp
index 9db6ddd..db492ea 100644
--- a/src/slave/containerizer/mesos/isolators/filesystem/posix.hpp
+++ b/src/slave/containerizer/mesos/isolators/filesystem/posix.hpp
@@ -48,7 +48,9 @@ public:
process::Future<Nothing> update(
const ContainerID& containerId,
- const Resources& resources) override;
+ const Resources& resourceRequests,
+ const google::protobuf::Map<
+ std::string, Value::Scalar>& resourceLimits = {}) override;
process::Future<Nothing> cleanup(
const ContainerID& containerId) override;
diff --git a/src/slave/containerizer/mesos/isolators/gpu/isolator.cpp b/src/slave/containerizer/mesos/isolators/gpu/isolator.cpp
index 5d18210..a0be102 100644
--- a/src/slave/containerizer/mesos/isolators/gpu/isolator.cpp
+++ b/src/slave/containerizer/mesos/isolators/gpu/isolator.cpp
@@ -475,7 +475,8 @@ Future<Option<ContainerLaunchInfo>> NvidiaGpuIsolatorProcess::_prepare(
Future<Nothing> NvidiaGpuIsolatorProcess::update(
const ContainerID& containerId,
- const Resources& resources)
+ const Resources& resourceRequests,
+ const google::protobuf::Map<string, Value::Scalar>& resourceLimits)
{
if (containerId.has_parent()) {
return Failure("Not supported for nested containers");
@@ -487,7 +488,7 @@ Future<Nothing> NvidiaGpuIsolatorProcess::update(
Info* info = CHECK_NOTNULL(infos[containerId]);
- Option<double> gpus = resources.gpus();
+ Option<double> gpus = resourceRequests.gpus();
// Make sure that the `gpus` resource is not fractional.
// We rely on scalar resources only having 3 digits of precision.
@@ -495,7 +496,8 @@ Future<Nothing> NvidiaGpuIsolatorProcess::update(
return Failure("The 'gpus' resource must be an unsigned integer");
}
- size_t requested = static_cast<size_t>(resources.gpus().getOrElse(0.0));
+ size_t requested =
+ static_cast<size_t>(resourceRequests.gpus().getOrElse(0.0));
// Update the GPU allocation to reflect the new total.
if (requested > info->allocated.size()) {
diff --git a/src/slave/containerizer/mesos/isolators/gpu/isolator.hpp b/src/slave/containerizer/mesos/isolators/gpu/isolator.hpp
index cc3cab5..e4f221d 100644
--- a/src/slave/containerizer/mesos/isolators/gpu/isolator.hpp
+++ b/src/slave/containerizer/mesos/isolators/gpu/isolator.hpp
@@ -97,7 +97,9 @@ public:
process::Future<Nothing> update(
const ContainerID& containerId,
- const Resources& resources) override;
+ const Resources& resourceRequests,
+ const google::protobuf::Map<
+ std::string, Value::Scalar>& resourceLimits = {}) override;
process::Future<ResourceStatistics> usage(
const ContainerID& containerId) override;
diff --git a/src/slave/containerizer/mesos/isolators/network/port_mapping.cpp b/src/slave/containerizer/mesos/isolators/network/port_mapping.cpp
index 65b23f0..3dd32f5 100644
--- a/src/slave/containerizer/mesos/isolators/network/port_mapping.cpp
+++ b/src/slave/containerizer/mesos/isolators/network/port_mapping.cpp
@@ -2952,7 +2952,8 @@ void PortMappingIsolatorProcess::_update(
Future<Nothing> PortMappingIsolatorProcess::update(
const ContainerID& containerId,
- const Resources& resources)
+ const Resources& resourceRequests,
+ const google::protobuf::Map<string, Value::Scalar>& resourceLimits)
{
// It is possible for the network isolator to be asked to update a
// container that isn't managed by it, for instance, containers
@@ -2970,9 +2971,9 @@ Future<Nothing> PortMappingIsolatorProcess::update(
// specified in 'resources'. However, this behavior needs to be
// changed once the master can make default allocations for
// ephemeral ports.
- if (resources.ephemeral_ports().isSome()) {
+ if (resourceRequests.ephemeral_ports().isSome()) {
LOG(WARNING) << "Ignoring the specified ephemeral_ports '"
- << resources.ephemeral_ports().get()
+ << resourceRequests.ephemeral_ports().get()
<< "' for container" << containerId;
}
@@ -2985,9 +2986,9 @@ Future<Nothing> PortMappingIsolatorProcess::update(
IntervalSet<uint16_t> nonEphemeralPorts;
- if (resources.ports().isSome()) {
+ if (resourceRequests.ports().isSome()) {
nonEphemeralPorts = rangesToIntervalSet<uint16_t>(
- resources.ports().get()).get();
+ resourceRequests.ports().get()).get();
// Sanity check to make sure that the assigned non-ephemeral ports
// for the container are part of the non-ephemeral ports specified
diff --git a/src/slave/containerizer/mesos/isolators/network/port_mapping.hpp b/src/slave/containerizer/mesos/isolators/network/port_mapping.hpp
index c14a8cc..cd9849c 100644
--- a/src/slave/containerizer/mesos/isolators/network/port_mapping.hpp
+++ b/src/slave/containerizer/mesos/isolators/network/port_mapping.hpp
@@ -168,7 +168,9 @@ public:
process::Future<Nothing> update(
const ContainerID& containerId,
- const Resources& resources) override;
+ const Resources& resourceRequests,
+ const google::protobuf::Map<
+ std::string, Value::Scalar>& resourceLimits = {}) override;
process::Future<ResourceStatistics> usage(
const ContainerID& containerId) override;
diff --git a/src/slave/containerizer/mesos/isolators/network/ports.cpp b/src/slave/containerizer/mesos/isolators/network/ports.cpp
index 86d3053..a3f36d6 100644
--- a/src/slave/containerizer/mesos/isolators/network/ports.cpp
+++ b/src/slave/containerizer/mesos/isolators/network/ports.cpp
@@ -544,7 +544,8 @@ Future<ContainerLimitation> NetworkPortsIsolatorProcess::watch(
Future<Nothing> NetworkPortsIsolatorProcess::update(
const ContainerID& containerId,
- const Resources& resources)
+ const Resources& resourceRequests,
+ const google::protobuf::Map<string, Value::Scalar>& resourceLimits)
{
if (!infos.contains(containerId)) {
LOG(INFO) << "Ignoring update for unknown container " << containerId;
@@ -558,7 +559,7 @@ Future<Nothing> NetworkPortsIsolatorProcess::update(
// processes in the corresponding cgroup.
if (containerId.has_parent()) {
// Child containers don't get resources, only the parents do.
- CHECK(resources.empty());
+ CHECK(resourceRequests.empty());
// Verify that we know about the root for this container.
CHECK(infos.contains(protobuf::getRootContainerId(containerId)));
@@ -566,7 +567,7 @@ Future<Nothing> NetworkPortsIsolatorProcess::update(
return Nothing();
}
- Option<Value::Ranges> ports = resources.ports();
+ Option<Value::Ranges> ports = resourceRequests.ports();
if (ports.isSome()) {
const Owned<Info>& info = infos.at(containerId);
info->allocatedPorts = rangesToIntervalSet<uint16_t>(ports.get()).get();
diff --git a/src/slave/containerizer/mesos/isolators/network/ports.hpp b/src/slave/containerizer/mesos/isolators/network/ports.hpp
index c0d0858..dd43267 100644
--- a/src/slave/containerizer/mesos/isolators/network/ports.hpp
+++ b/src/slave/containerizer/mesos/isolators/network/ports.hpp
@@ -69,7 +69,9 @@ public:
process::Future<Nothing> update(
const ContainerID& containerId,
- const Resources& resources) override;
+ const Resources& resourceRequests,
+ const google::protobuf::Map<
+ std::string, Value::Scalar>& resourceLimits = {}) override;
process::Future<Nothing> cleanup(
const ContainerID& containerId) override;
diff --git a/src/slave/containerizer/mesos/isolators/posix.hpp b/src/slave/containerizer/mesos/isolators/posix.hpp
index f8de3d2..bdf1e70 100644
--- a/src/slave/containerizer/mesos/isolators/posix.hpp
+++ b/src/slave/containerizer/mesos/isolators/posix.hpp
@@ -103,7 +103,9 @@ public:
process::Future<Nothing> update(
const ContainerID& containerId,
- const Resources& resources) override
+ const Resources& resourceRequests,
+ const google::protobuf::Map<
+ std::string, Value::Scalar>& resourceLimits = {}) override
{
if (!promises.contains(containerId)) {
return process::Failure("Unknown container: " + stringify(containerId));
diff --git a/src/slave/containerizer/mesos/isolators/posix/disk.cpp b/src/slave/containerizer/mesos/isolators/posix/disk.cpp
index 842facf..50ecfd1 100644
--- a/src/slave/containerizer/mesos/isolators/posix/disk.cpp
+++ b/src/slave/containerizer/mesos/isolators/posix/disk.cpp
@@ -210,7 +210,8 @@ Future<ContainerLimitation> PosixDiskIsolatorProcess::watch(
Future<Nothing> PosixDiskIsolatorProcess::update(
const ContainerID& containerId,
- const Resources& resources)
+ const Resources& resourceRequests,
+ const google::protobuf::Map<string, Value::Scalar>& resourceLimits)
{
if (containerId.has_parent()) {
return Failure("Not supported for nested containers");
@@ -222,14 +223,14 @@ Future<Nothing> PosixDiskIsolatorProcess::update(
}
LOG(INFO) << "Updating the disk resources for container "
- << containerId << " to " << resources;
+ << containerId << " to " << resourceRequests;
const Owned<Info>& info = infos[containerId];
// This stores the updated quotas.
hashmap<string, Resources> quotas;
- foreach (const Resource& resource, resources) {
+ foreach (const Resource& resource, resourceRequests) {
if (resource.name() != "disk") {
continue;
}
diff --git a/src/slave/containerizer/mesos/isolators/posix/disk.hpp b/src/slave/containerizer/mesos/isolators/posix/disk.hpp
index 2e9b481..df255d9 100644
--- a/src/slave/containerizer/mesos/isolators/posix/disk.hpp
+++ b/src/slave/containerizer/mesos/isolators/posix/disk.hpp
@@ -98,7 +98,9 @@ public:
process::Future<Nothing> update(
const ContainerID& containerId,
- const Resources& resources) override;
+ const Resources& resourceRequests,
+ const google::protobuf::Map<
+ std::string, Value::Scalar>& resourceLimits = {}) override;
process::Future<ResourceStatistics> usage(
const ContainerID& containerId) override;
diff --git a/src/slave/containerizer/mesos/isolators/windows/cpu.cpp b/src/slave/containerizer/mesos/isolators/windows/cpu.cpp
index 0d3706f..86b95cf 100644
--- a/src/slave/containerizer/mesos/isolators/windows/cpu.cpp
+++ b/src/slave/containerizer/mesos/isolators/windows/cpu.cpp
@@ -45,6 +45,7 @@ using process::Future;
using process::Owned;
using std::max;
+using std::string;
using std::vector;
namespace mesos {
@@ -152,7 +153,9 @@ Try<Isolator*> WindowsCpuIsolatorProcess::create(const Flags& flags)
Future<Nothing> WindowsCpuIsolatorProcess::update(
- const ContainerID& containerId, const Resources& resources)
+ const ContainerID& containerId,
+ const Resources& resourceRequests,
+ const google::protobuf::Map<string, Value::Scalar>& resourceLimits)
{
if (containerId.has_parent()) {
return Failure("Not supported for nested containers");
@@ -167,13 +170,13 @@ Future<Nothing> WindowsCpuIsolatorProcess::update(
"Container not isolated before update: " + stringify(containerId));
}
- if (resources.cpus().isNone()) {
+ if (resourceRequests.cpus().isNone()) {
return Failure(
"Failed to update container '" + stringify(containerId) +
"': No cpus resource given");
}
- infos[containerId].limit = max(resources.cpus().get(), MIN_CPU);
+ infos[containerId].limit = max(resourceRequests.cpus().get(), MIN_CPU);
const Try<Nothing> set = os::set_job_cpu_limit(
infos[containerId].pid.get(), infos[containerId].limit.get());
if (set.isError()) {
diff --git a/src/slave/containerizer/mesos/isolators/windows/cpu.hpp b/src/slave/containerizer/mesos/isolators/windows/cpu.hpp
index ef58d67..8efba3c 100644
--- a/src/slave/containerizer/mesos/isolators/windows/cpu.hpp
+++ b/src/slave/containerizer/mesos/isolators/windows/cpu.hpp
@@ -56,7 +56,10 @@ public:
const ContainerID& containerId, pid_t pid) override;
process::Future<Nothing> update(
- const ContainerID& containerId, const Resources& resources) override;
+ const ContainerID& containerId,
+ const Resources& resourceRequests,
+ const google::protobuf::Map<
+ std::string, Value::Scalar>& resourceLimits = {}) override;
process::Future<ResourceStatistics> usage(
const ContainerID& containerId) override;
diff --git a/src/slave/containerizer/mesos/isolators/windows/mem.cpp b/src/slave/containerizer/mesos/isolators/windows/mem.cpp
index 4fabb93..5b66f40 100644
--- a/src/slave/containerizer/mesos/isolators/windows/mem.cpp
+++ b/src/slave/containerizer/mesos/isolators/windows/mem.cpp
@@ -46,6 +46,7 @@ using process::Future;
using process::Owned;
using std::max;
+using std::string;
using std::vector;
namespace mesos {
@@ -153,7 +154,9 @@ Try<Isolator*> WindowsMemIsolatorProcess::create(const Flags& flags)
Future<Nothing> WindowsMemIsolatorProcess::update(
- const ContainerID& containerId, const Resources& resources)
+ const ContainerID& containerId,
+ const Resources& resourceRequests,
+ const google::protobuf::Map<string, Value::Scalar>& resourceLimits)
{
if (containerId.has_parent()) {
return Failure("Not supported for nested containers");
@@ -168,13 +171,13 @@ Future<Nothing> WindowsMemIsolatorProcess::update(
"Container not isolated before update: " + stringify(containerId));
}
- if (resources.mem().isNone()) {
+ if (resourceRequests.mem().isNone()) {
return Failure(
"Failed to update container '" + stringify(containerId) +
"': No mem resource given");
}
- infos[containerId].limit = max(resources.mem().get(), MIN_MEM);
+ infos[containerId].limit = max(resourceRequests.mem().get(), MIN_MEM);
const Try<Nothing> set = os::set_job_mem_limit(
infos[containerId].pid.get(), infos[containerId].limit.get());
if (set.isError()) {
diff --git a/src/slave/containerizer/mesos/isolators/windows/mem.hpp b/src/slave/containerizer/mesos/isolators/windows/mem.hpp
index 1c87764..e704b31 100644
--- a/src/slave/containerizer/mesos/isolators/windows/mem.hpp
+++ b/src/slave/containerizer/mesos/isolators/windows/mem.hpp
@@ -57,7 +57,10 @@ public:
const ContainerID& containerId, pid_t pid) override;
process::Future<Nothing> update(
- const ContainerID& containerId, const Resources& resources) override;
+ const ContainerID& containerId,
+ const Resources& resourceRequests,
+ const google::protobuf::Map<
+ std::string, Value::Scalar>& resourceLimits = {}) override;
process::Future<ResourceStatistics> usage(
const ContainerID& containerId) override;
diff --git a/src/slave/containerizer/mesos/isolators/xfs/disk.cpp b/src/slave/containerizer/mesos/isolators/xfs/disk.cpp
index 1680a59..e1bbb31 100644
--- a/src/slave/containerizer/mesos/isolators/xfs/disk.cpp
+++ b/src/slave/containerizer/mesos/isolators/xfs/disk.cpp
@@ -596,7 +596,8 @@ static Try<xfs::QuotaInfo> applyProjectQuota(
Future<Nothing> XfsDiskIsolatorProcess::update(
const ContainerID& containerId,
- const Resources& resources)
+ const Resources& resourceRequests,
+ const google::protobuf::Map<string, Value::Scalar>& resourceLimits)
{
if (!infos.contains(containerId)) {
LOG(INFO) << "Ignoring update for unknown container " << containerId;
@@ -606,7 +607,7 @@ Future<Nothing> XfsDiskIsolatorProcess::update(
const Owned<Info>& info = infos.at(containerId);
// First, apply the disk quota to the sandbox.
- Option<Bytes> sandboxQuota = getSandboxDisk(resources);
+ Option<Bytes> sandboxQuota = getSandboxDisk(resourceRequests);
if (sandboxQuota.isSome()) {
foreachpair (
const string& directory, Info::PathInfo& pathInfo, info->paths) {
@@ -628,7 +629,7 @@ Future<Nothing> XfsDiskIsolatorProcess::update(
}
// Make sure that we have project IDs assigned to all persistent volumes.
- foreach (const Resource& resource, resources.persistentVolumes()) {
+ foreach (const Resource& resource, resourceRequests.persistentVolumes()) {
CHECK(resource.disk().has_volume());
const Bytes size = Megabytes(resource.scalar().value());
diff --git a/src/slave/containerizer/mesos/isolators/xfs/disk.hpp b/src/slave/containerizer/mesos/isolators/xfs/disk.hpp
index 16bb432..55af66b 100644
--- a/src/slave/containerizer/mesos/isolators/xfs/disk.hpp
+++ b/src/slave/containerizer/mesos/isolators/xfs/disk.hpp
@@ -64,7 +64,9 @@ public:
process::Future<Nothing> update(
const ContainerID& containerId,
- const Resources& resources) override;
+ const Resources& resourceRequests,
+ const google::protobuf::Map<
+ std::string, Value::Scalar>& resourceLimits = {}) override;
process::Future<ResourceStatistics> usage(
const ContainerID& containerId) override;
diff --git a/src/tests/containerizer/isolator.hpp b/src/tests/containerizer/isolator.hpp
index 5861b8b..084f238 100644
--- a/src/tests/containerizer/isolator.hpp
+++ b/src/tests/containerizer/isolator.hpp
@@ -103,9 +103,12 @@ public:
watch,
process::Future<mesos::slave::ContainerLimitation>(const ContainerID&));
- MOCK_METHOD2(
+ MOCK_METHOD3(
update,
- process::Future<Nothing>(const ContainerID&, const Resources&));
+ process::Future<Nothing>(
+ const ContainerID&,
+ const Resources&,
+ const google::protobuf::Map<std::string, Value::Scalar>&));
MOCK_METHOD1(
usage,
diff --git a/src/tests/slave_tests.cpp b/src/tests/slave_tests.cpp
index 92fa299..ff0dec6 100644
--- a/src/tests/slave_tests.cpp
+++ b/src/tests/slave_tests.cpp
@@ -2822,7 +2822,7 @@ TEST_F(SlaveTest, ROOT_ContainerizerDebugEndpoint)
.WillOnce(DoAll(FutureSatisfy(&prepare),
Return(promise.future())));
- EXPECT_CALL(*mockIsolator, update(_, _))
+ EXPECT_CALL(*mockIsolator, update(_, _, _))
.WillOnce(Return(Nothing()));
// Wrap `mockIsolator` in `PendingFutureTracker`.