]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: Fix check_past_interval_bounds()
authorMatan Breizman <mbreizma@redhat.com>
Wed, 2 Nov 2022 10:40:03 +0000 (10:40 +0000)
committerMatan Breizman <mbreizma@redhat.com>
Tue, 16 May 2023 10:36:52 +0000 (10:36 +0000)
When getting the required past interval bounds we use
oldest_map or current pg info (lec/ec).
Before this change we set oldest_map epoch using the
osd's superblock.oldest_map.
The fix will use the max_oldest_map received with other peers
instead since a specific osd's oldest_map can lag for a while
in order to avoid large workloads.

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

src/crimson/osd/pg.h
src/osd/PG.cc
src/osd/PG.h
src/osd/PeeringState.cc
src/osd/PeeringState.h

index 776cdd635565f28cb16e417b32c471d4cd97cb77..1bd4bbfc7744a6274e5cea99dcfd741d7017ad53 100644 (file)
@@ -351,6 +351,11 @@ public:
     return 0;
   }
 
+  epoch_t max_oldest_stored_osdmap() final {
+    // TODO
+    return 0;
+  }
+
   void on_backfill_reserved() final {
     recovery_handler->on_backfill_reserved();
   }
index 3b3df466f7c9f0177ee99d2c613514ce13b1c62b..9f61d6471b5673e8788db45de21fd66b6a11d6fe 100644 (file)
@@ -1629,6 +1629,10 @@ epoch_t PG::oldest_stored_osdmap() {
   return osd->get_superblock().oldest_map;
 }
 
+epoch_t PG::max_oldest_stored_osdmap() {
+  return osd->get_superblock().max_oldest_map;
+}
+
 OstreamTemp PG::get_clog_info() {
   return osd->clog->info();
 }
index 80405c8cee0df89d91dd42d46732bce643c3b01b..027b3d064a01394bda1028169acd0b540bb45147 100644 (file)
@@ -591,6 +591,7 @@ public:
   void clear_primary_state() override;
 
   epoch_t oldest_stored_osdmap() override;
+  epoch_t max_oldest_stored_osdmap() override;
   OstreamTemp get_clog_error() override;
   OstreamTemp get_clog_info() override;
   OstreamTemp get_clog_debug() override;
index 3d71e531c0852c08342812a715a9b4c4425b1873..37be742f9925e9515a96501a7bd7e05803babac6 100644 (file)
@@ -930,7 +930,9 @@ static pair<epoch_t, epoch_t> get_required_past_interval_bounds(
 
 void PeeringState::check_past_interval_bounds() const
 {
-  auto oldest_epoch = pl->oldest_stored_osdmap();
+  // a specific OSD's oldest_map can lag for a while, therfore
+  // use the maximum MOSDMap.oldest_map received with peers.
+  auto oldest_epoch = pl->max_oldest_stored_osdmap();
   auto rpib = get_required_past_interval_bounds(
     info,
     oldest_epoch);
index 976c3a5443c01f25ce5d3d187168036b8bee5b7a..074ed0d88d128f725daf28f32437182aa194e03c 100644 (file)
@@ -405,6 +405,7 @@ public:
     virtual void on_active_actmap() = 0;
     virtual void on_active_advmap(const OSDMapRef &osdmap) = 0;
     virtual epoch_t oldest_stored_osdmap() = 0;
+    virtual epoch_t max_oldest_stored_osdmap() = 0;
 
     // ============ recovery reservation notifications ==========
     virtual void on_backfill_reserved() = 0;