]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon/OSDMonitor: fix osd_epochs insertion on prepare_beacon()
authorMatan Breizman <mbreizma@redhat.com>
Sun, 24 Dec 2023 14:16:12 +0000 (14:16 +0000)
committerMykola Golub <mgolub@suse.com>
Fri, 1 Mar 2024 12:10:00 +0000 (14:10 +0200)
Previously, an OSD marked out could have been added back to the map upon new beacon sent by the OSD.
If the OSD goes down (after being added back to map) - it won't be marked as OUT again.
Therefore, `osd_epochs` would remain with a "stale" OSD, as a result OSDMonitor::get_min_last_epoch_clean() will always return the "stale" OSD epoch.

When osd is marked out, it will be erased from `osd_epochs` map. Correspondingly, it should be added back to the map **only** once it's marked in.

Fixes: https://tracker.ceph.com/issues/63883
Signed-off-by: Matan Breizman <mbreizma@redhat.com>
(cherry picked from commit dd1d30b7b209eaff376620ebd6b9a65df5ee7361)

src/mon/OSDMonitor.cc

index 74eb691f523111556ad93a02dbaf463b50ede685..e3ad324c0e4ae3c7491fcde7bf62fdf75a54febf 100644 (file)
@@ -4420,8 +4420,9 @@ bool OSDMonitor::prepare_beacon(MonOpRequestRef op)
 
   last_osd_report[from].first = ceph_clock_now();
   last_osd_report[from].second = beacon->osd_beacon_report_interval;
-  osd_epochs[from] = beacon->version;
-
+  if (osdmap.is_in(from)) {
+    osd_epochs[from] = beacon->version;
+  }
   for (const auto& pg : beacon->pgs) {
     if (auto* pool = osdmap.get_pg_pool(pg.pool()); pool != nullptr) {
       unsigned pg_num = pool->get_pg_num();