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 <[email protected]> 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`.
