]> 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 09:57:59 +0000 (09:57 +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 34676ee7a1098877ed558cb95406a9707d65dbf1..9208cc2d47642e50e9ad9d43abd8d6d2f869d890 100644 (file)
@@ -349,6 +349,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 5b10f146616f3c4745a99044a75f01adb8670905..fcd63807274d88bdd613b7788c349e1a5b995cd9 100644 (file)
@@ -1576,6 +1576,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 61adae1205eb2ffc3c3e8984b15dabb922ff1713..408e8114ef519c26336fea97dcff92da16ff2742 100644 (file)
@@ -519,6 +519,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 9709f3ce1444ac5550029f2f4ec079a39ce1b42d..5fa76a7a7b23c52ab2e1c24792052f7a6b2f07b2 100644 (file)
@@ -953,7 +953,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 2cc340cb9df9a8ee60940432e58eab44fe519438..d3ac117b96167db376f40b005f096c9571cbc68e 100644 (file)
@@ -391,6 +391,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;