From eb463199daf55bf5c34310de13ef93d9163cd2fa Mon Sep 17 00:00:00 2001 From: Mykola Golub Date: Thu, 1 Jul 2021 16:52:21 +0100 Subject: [PATCH] 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) --- src/osd/PeeringState.cc | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/osd/PeeringState.cc b/src/osd/PeeringState.cc index 6274d2959ab5e..355ba78ed6ca2 100644 --- a/src/osd/PeeringState.cc +++ b/src/osd/PeeringState.cc @@ -395,13 +395,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(); -- 2.39.5