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`.