]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: move down peers out from peer_purged 42239/head
authorMykola Golub <mgolub@suse.com>
Thu, 1 Jul 2021 15:52:21 +0000 (16:52 +0100)
committerMykola Golub <mgolub@suse.com>
Thu, 8 Jul 2021 05:48:17 +0000 (08:48 +0300)
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)

src/osd/PeeringState.cc

index 9e893079ebebd18e846067f7f7a549848091b009..87ee246fce83dca3b7bf0955bb828203240fc5c4 100644 (file)
@@ -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();