Repository: mesos Updated Branches: refs/heads/master 64d2560b8 -> 96e65d966
Cleaned up the unknown orphans after all known orphans are recovered. Review: https://reviews.apache.org/r/35744 Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/96e65d96 Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/96e65d96 Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/96e65d96 Branch: refs/heads/master Commit: 96e65d966f11b9ad524a4b8a7eda2e8e6dd1644d Parents: 64d2560 Author: Jie Yu <[email protected]> Authored: Mon Jun 22 14:22:25 2015 -0700 Committer: Jie Yu <[email protected]> Committed: Mon Jun 22 15:06:27 2015 -0700 ---------------------------------------------------------------------- .../isolators/network/port_mapping.cpp | 45 ++++++++++++++------ 1 file changed, 31 insertions(+), 14 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/96e65d96/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 137cdc9..4de737a 100644 --- a/src/slave/containerizer/isolators/network/port_mapping.cpp +++ b/src/slave/containerizer/isolators/network/port_mapping.cpp @@ -1850,9 +1850,12 @@ Future<Nothing> PortMappingIsolatorProcess::recover( pids.erase(pid); } - // Cleanup unknown orphan containers. Known orphan cgroups will be - // destroyed by the containerizer using the normal cleanup path. See - // MESOS-2367 for details. + // Recover orphans. Known orphans will be destroyed by containerizer + // 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; + foreach (pid_t pid, pids) { Try<Info*> recover = _recover(pid); if (recover.isError()) { @@ -1865,23 +1868,37 @@ Future<Nothing> PortMappingIsolatorProcess::recover( stringify(pid) + ": " + recover.error()); } - // Clean up unknown orphan containers. Known orphan containers - // will be cleaned up by the containerizer using the normal - // cleanup path. See MESOS-2367 for details. - Option<ContainerID> containerId; - if (linkers.get(pid).size() == 1) { - containerId = linkers.get(pid).front(); - CHECK(!infos.contains(containerId.get())); + const ContainerID containerId = linkers.get(pid).front(); + CHECK(!infos.contains(containerId)); - if (orphans.contains(containerId.get())) { - infos[containerId.get()] = recover.get(); + if (orphans.contains(containerId)) { + infos[containerId] = recover.get(); continue; } } - // The recovery should fail if we cannot cleanup an orphan. - Try<Nothing> cleanup = _cleanup(recover.get(), containerId); + unknownOrphans.push_back(Owned<Info>(recover.get())); + } + + foreach (const Owned<Info>& info, unknownOrphans) { + CHECK_SOME(info->pid); + pid_t pid = info->pid.get(); + + Option<ContainerID> containerId; + if (linkers.get(pid).size() == 1) { + containerId = linkers.get(pid).front(); + } + + // NOTE: If 'infos' is empty (means there is no regular container + // or known orphan), the '_cleanup' below will remove the ICMP and + // ARP packet filters on host eth0. This will cause subsequent + // calls to '_cleanup' for unknown orphans to fail. However, this + // is OK because when slave restarts and tries to recover again, + // 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); if (cleanup.isError()) { foreachvalue (Info* info, infos) { delete info;
