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)
return 0;
}
+ epoch_t max_oldest_stored_osdmap() final {
+ // TODO
+ return 0;
+ }
+
void on_backfill_reserved() final {
recovery_handler->on_backfill_reserved();
}
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();
}
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;
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);
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;