From: Mykola Golub Date: Thu, 1 Jul 2021 15:52:21 +0000 (+0100) Subject: osd: move down peers out from peer_purged X-Git-Tag: v15.2.14~19^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=924b13a50b2297ab73b2103669a3baa2731e9998;p=ceph.git osd: move down peers out from peer_purged f7c5b01e18 tried to fix this, but adding peer_purged.erase() into the peer_info loop made no effect because in purge_strays() when inserting an osd to peer_purged we simultaneously remove it from peer_info. So it should be a separate loop through peer_purged list. Fixes: https://tracker.ceph.com/issues/38931 Signed-off-by: Mykola Golub (cherry picked from commit 64dc3c846ab9b1491459799ed249502599878834) --- diff --git a/src/osd/PeeringState.cc b/src/osd/PeeringState.cc index 9e893079ebeb..87ee246fce83 100644 --- a/src/osd/PeeringState.cc +++ b/src/osd/PeeringState.cc @@ -347,13 +347,23 @@ void PeeringState::remove_down_peer_info(const OSDMapRef &osdmap) peer_missing.erase(p->first); peer_log_requested.erase(p->first); peer_missing_requested.erase(p->first); - peer_purged.erase(p->first); peer_info.erase(p++); removed = true; } else ++p; } + // Remove any downed osds from peer_purged so we can re-purge if necessary + auto it = peer_purged.begin(); + while (it != peer_purged.end()) { + if (!osdmap->is_up(it->osd)) { + psdout(10) << " dropping down osd." << *it << " from peer_purged" << dendl; + peer_purged.erase(it++); + } else { + ++it; + } + } + // if we removed anyone, update peers (which include peer_info) if (removed) update_heartbeat_peers();