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());
