]> 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>
Wed, 1 Feb 2023 09:51:55 +0000 (09:51 +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>
src/crimson/osd/pg.h
src/osd/PG.cc
src/osd/PG.h
src/osd/PeeringState.cc
src/osd/PeeringState.h

index a1b0a70ccd1abbd510b223748f878ce00fd94f5c..25b585ef6f841e376459841725a8bcfa58d5a104 100644 (file)
@@ -368,6 +368,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 38cf71565459478016434bbdbdc192cdfefe89ec..c8bad743bd6e0bcc7f701f89172ece397d36b3f6 100644 (file)
@@ -1749,6 +1749,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 9e0d4ecca08913192f450c04e2664824b7a7c19f..f1c07d1bc1742f2aeb93b2f29bdf4c93045bb0af 100644 (file)
@@ -594,6 +594,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 732508c1f3ba9b540fc9664242a1977e37fa20df..79b668af05ef177f6cfe71c2d24dad080136994a 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 e127c38aa03938a526e3dc5f71351b5e5cb4e2c0..fc7b4ef223192b2ecffd75cc5b4930480f18cad0 100644 (file)
@@ -422,6 +422,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;