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 <mgolub@suse.com>
(cherry picked from commit
64dc3c846ab9b1491459799ed249502599878834)
Conflicts:
src/osd/PeeringState.cc (does not exist, the code is in PG.cc)
peer_missing.erase(p->first);
peer_log_requested.erase(p->first);
peer_missing_requested.erase(p->first);
- peer_purged.erase(p->first); // so we can re-purge if necessary
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)) {
+ dout(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();