You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by id...@apache.org on 2014/11/21 20:20:53 UTC

mesos git commit: Set memory::limit_in_bytes first, even with limitSwap enabled.

Repository: mesos
Updated Branches:
  refs/heads/master 5d3093a39 -> 24cb10a2d


Set memory::limit_in_bytes first, even with limitSwap enabled.

Review: https://reviews.apache.org/r/28305


Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/24cb10a2
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/24cb10a2
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/24cb10a2

Branch: refs/heads/master
Commit: 24cb10a2d68df48340ad8bc1bf148bae6e0b0171
Parents: 5d3093a
Author: Ian Downes <id...@twitter.com>
Authored: Thu Nov 20 16:36:26 2014 -0800
Committer: Ian Downes <id...@twitter.com>
Committed: Fri Nov 21 11:20:44 2014 -0800

----------------------------------------------------------------------
 .../containerizer/isolators/cgroups/mem.cpp     | 89 +++++++-------------
 1 file changed, 29 insertions(+), 60 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/24cb10a2/src/slave/containerizer/isolators/cgroups/mem.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/isolators/cgroups/mem.cpp b/src/slave/containerizer/isolators/cgroups/mem.cpp
index 3a3ac40..71f4b9b 100644
--- a/src/slave/containerizer/isolators/cgroups/mem.cpp
+++ b/src/slave/containerizer/isolators/cgroups/mem.cpp
@@ -324,32 +324,14 @@ Future<Nothing> CgroupsMemIsolatorProcess::update(
             << " for container " << containerId;
 
   // Read the existing limit.
-  Bytes currentLimit;
+  Try<Bytes> currentLimit =
+    cgroups::memory::limit_in_bytes(hierarchy, info->cgroup);
 
-  if (limitSwap) {
-    Result<Bytes> _currentLimit =
-      cgroups::memory::memsw_limit_in_bytes(hierarchy, info->cgroup);
-
-    if (_currentLimit.isError()) {
-      return Failure(
-          "Failed to read 'memory.memsw.limit_in_bytes': " +
-          _currentLimit.error());
-    } else if (_currentLimit.isNone()) {
-      return Failure("'memory.memsw.limit_in_bytes' is not available");
-    }
-
-    currentLimit = _currentLimit.get();
-  } else {
-    Try<Bytes> _currentLimit =
-      cgroups::memory::limit_in_bytes(hierarchy, info->cgroup);
-
-    if (_currentLimit.isError()) {
-      return Failure(
-          "Failed to read 'memory.limit_in_bytes': " +
-          _currentLimit.error());
-    }
-
-    currentLimit = _currentLimit.get();
+  // NOTE: If limitSwap is (has been) used then both limit_in_bytes
+  // and memsw.limit_in_bytes will always be set to the same value.
+  if (currentLimit.isError()) {
+    return Failure(
+        "Failed to read 'memory.limit_in_bytes': " + currentLimit.error());
   }
 
   // Determine whether to set the hard limit. If this is the first
@@ -362,7 +344,20 @@ Future<Nothing> CgroupsMemIsolatorProcess::update(
   // TODO(benh): Introduce a MemoryWatcherProcess which monitors the
   // discrepancy between usage and soft limit and introduces a "manual
   // oom" if necessary.
-  if (info->pid.isNone() || limit > currentLimit) {
+  if (info->pid.isNone() || limit > currentLimit.get()) {
+    // We always set limit_in_bytes first and optionally set
+    // memsw.limit_in_bytes if limitSwap is true.
+    Try<Nothing> write = cgroups::memory::limit_in_bytes(
+        hierarchy, info->cgroup, limit);
+
+    if (write.isError()) {
+      return Failure(
+          "Failed to set 'memory.limit_in_bytes': " + write.error());
+    }
+
+    LOG(INFO) << "Updated 'memory.limit_in_bytes' to " << limit
+              << " for container " << containerId;
+
     if (limitSwap) {
       Try<bool> write = cgroups::memory::memsw_limit_in_bytes(
           hierarchy, info->cgroup, limit);
@@ -370,23 +365,10 @@ Future<Nothing> CgroupsMemIsolatorProcess::update(
       if (write.isError()) {
         return Failure(
             "Failed to set 'memory.memsw.limit_in_bytes': " + write.error());
-      } else if (!write.get()) {
-        return Failure("'memory.memsw.limit_in_bytes' is not available");
       }
 
       LOG(INFO) << "Updated 'memory.memsw.limit_in_bytes' to " << limit
                 << " for container " << containerId;
-    } else {
-      Try<Nothing> write = cgroups::memory::limit_in_bytes(
-          hierarchy, info->cgroup, limit);
-
-      if (write.isError()) {
-        return Failure(
-            "Failed to set 'memory.limit_in_bytes': " + write.error());
-      }
-
-      LOG(INFO) << "Updated 'memory.limit_in_bytes' to " << limit
-                << " for container " << containerId;
     }
   }
 
@@ -557,28 +539,15 @@ void CgroupsMemIsolatorProcess::oom(const ContainerID& containerId)
   message << "Memory limit exceeded: ";
 
   // Output the requested memory limit.
-  if (limitSwap) {
-    Result<Bytes> limit =
-      cgroups::memory::memsw_limit_in_bytes(hierarchy, info->cgroup);
-
-    if (limit.isError()) {
-      LOG(ERROR) << "Failed to read 'memory.memsw.limit_in_bytes': "
-                 << limit.error();
-    } else if (limit.isNone()) {
-      LOG(ERROR) << "'memory.memsw.limit_in_bytes' is not available";
-    } else {
-      message << "Requested: " << limit.get() << " ";
-    }
+  // NOTE: If limitSwap is (has been) used then both limit_in_bytes
+  // and memsw.limit_in_bytes will always be set to the same value.
+  Try<Bytes> limit = cgroups::memory::limit_in_bytes(hierarchy, info->cgroup);
+
+  if (limit.isError()) {
+    LOG(ERROR) << "Failed to read 'memory.limit_in_bytes': "
+               << limit.error();
   } else {
-    Try<Bytes> limit =
-      cgroups::memory::limit_in_bytes(hierarchy, info->cgroup);
-
-    if (limit.isError()) {
-      LOG(ERROR) << "Failed to read 'memory.limit_in_bytes': "
-                 << limit.error();
-    } else {
-      message << "Requested: " << limit.get() << " ";
-    }
+    message << "Requested: " << limit.get() << " ";
   }
 
   // Output the maximum memory usage.