]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: move down peers out from peer_purged 42240/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 06:08:27 +0000 (09:08 +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)

Conflicts:
src/osd/PeeringState.cc (does not exist, the code is in PG.cc)

src/osd/PG.cc

index b6dc62ef5b89d618f107279ab2d29c9f11d60bca..80f4463d66d63e3c22365a0ea1da1dec77170ffe 100644 (file)
@@ -990,13 +990,23 @@ void PG::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); // 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();