Repository: mesos
Updated Branches:
  refs/heads/master 96e65d966 -> f6155c097


Fixed a memory bug in port mapping recovery logic.

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


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

Branch: refs/heads/master
Commit: f6155c0977f203e170389c9b091ffb14f0051504
Parents: 96e65d9
Author: Jie Yu <[email protected]>
Authored: Mon Jun 22 16:05:25 2015 -0700
Committer: Jie Yu <[email protected]>
Committed: Mon Jun 22 16:29:26 2015 -0700

----------------------------------------------------------------------
 .../containerizer/isolators/network/port_mapping.cpp | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/f6155c09/src/slave/containerizer/isolators/network/port_mapping.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/isolators/network/port_mapping.cpp 
b/src/slave/containerizer/isolators/network/port_mapping.cpp
index 4de737a..1eb8173 100644
--- a/src/slave/containerizer/isolators/network/port_mapping.cpp
+++ b/src/slave/containerizer/isolators/network/port_mapping.cpp
@@ -1854,7 +1854,7 @@ Future<Nothing> PortMappingIsolatorProcess::recover(
   // using the normal cleanup path (refer to MESOS-2367 for details).
   // Unknown orphans will be cleaned up immediately. The recovery will
   // fail if there is some unknown orphan that cannot be cleaned up.
-  vector<Owned<Info>> unknownOrphans;
+  vector<Info*> unknownOrphans;
 
   foreach (pid_t pid, pids) {
     Try<Info*> recover = _recover(pid);
@@ -1862,6 +1862,9 @@ Future<Nothing> PortMappingIsolatorProcess::recover(
       foreachvalue (Info* info, infos) {
         delete info;
       }
+      foreach (Info* info, unknownOrphans) {
+        delete info;
+      }
 
       return Failure(
           "Failed to recover orphaned container with pid " +
@@ -1878,10 +1881,10 @@ Future<Nothing> PortMappingIsolatorProcess::recover(
       }
     }
 
-    unknownOrphans.push_back(Owned<Info>(recover.get()));
+    unknownOrphans.push_back(recover.get());
   }
 
-  foreach (const Owned<Info>& info, unknownOrphans) {
+  foreach (Info* info, unknownOrphans) {
     CHECK_SOME(info->pid);
     pid_t pid = info->pid.get();
 
@@ -1898,12 +1901,16 @@ Future<Nothing> PortMappingIsolatorProcess::recover(
     // it'll try to remove the remaining unknown orphans.
     // TODO(jieyu): Consider call '_cleanup' for all the unknown
     // orphans before returning even if error occurs.
-    Try<Nothing> cleanup = _cleanup(info.get(), containerId);
+    Try<Nothing> cleanup = _cleanup(info, containerId);
     if (cleanup.isError()) {
       foreachvalue (Info* info, infos) {
         delete info;
       }
 
+      // TODO(jieyu): Also delete 'info' in unknownOrphans. Notice
+      // that some 'info' in unknownOrphans might have already been
+      // deleted in '_cleanup' above.
+
       return Failure(
           "Failed to cleanup orphaned container with pid " +
           stringify(pid) + ": " + cleanup.error());

Reply via email to