From 1bd98f8a60a47e7c857785f38249030be486ad0c Mon Sep 17 00:00:00 2001 From: Matan Breizman Date: Wed, 7 Feb 2024 09:59:38 +0000 Subject: [PATCH] mon/OSDMonitor: add comments Co-authored-by: Samuel Just Signed-off-by: Matan Breizman (cherry picked from commit 685047b035368666c09d654f0e862b9d2f114701) --- src/mon/OSDMonitor.cc | 11 +++++++++-- src/mon/OSDMonitor.h | 20 ++++++++++++++++++-- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index fb5d567a8d8ca..2254971870acc 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -2324,11 +2324,18 @@ version_t OSDMonitor::get_trim_to() const return 0; } +/* There are two constraints on trimming: + * 1. we must not trim past the last_epoch_clean for any pg + * 2. we must not trim past the last reported epoch for any up + * osds. + * + * LastEpochClean::get_lower_bound_by_pool gives a value <= constraint 1. + * For constraint 2, we take the min over osd_epochs, which is populated with + * MOSDBeacon::version, see OSDMonitor::prepare_beacon + */ epoch_t OSDMonitor::get_min_last_epoch_clean() const { auto floor = last_epoch_clean.get_lower_bound_by_pool(osdmap); - // also scan osd epochs - // don't trim past the oldest reported osd epoch for (auto [osd, epoch] : osd_epochs) { if (epoch < floor) { ceph_assert(osdmap.is_up(osd)); diff --git a/src/mon/OSDMonitor.h b/src/mon/OSDMonitor.h index 1b901b5e8cac6..e20da536b33a3 100644 --- a/src/mon/OSDMonitor.h +++ b/src/mon/OSDMonitor.h @@ -114,6 +114,12 @@ class LastEpochClean { public: void report(unsigned pg_num, const pg_t& pg, epoch_t last_epoch_clean); void remove_pool(uint64_t pool); + /** + * get_lower_bound_by_pool + * + * Returns epoch e such that e <= pg.last_epoch_clean for all pgs in cluster. + * May return 0 if any pool does not have comprehensive values for all pgs. + */ epoch_t get_lower_bound_by_pool(const OSDMap& latest) const; void dump(Formatter *f) const; @@ -643,8 +649,18 @@ protected: // when we last received PG stats from each osd and the osd's osd_beacon_report_interval std::map> last_osd_report; - // TODO: use last_osd_report to store the osd report epochs, once we don't - // need to upgrade from pre-luminous releases. + /** + * osd_epochs + * + * Records the MOSDBeacon::version (the osd epoch at which the OSD sent the + * beacon) of the most recent beacon recevied from each currently up OSD. + * Used in OSDMonitor::get_min_last_epoch_clean(). + * Down osds are trimmed upon commit of each map + * (OSDMonitor::update_from_paxos). + * + * TODO: use last_osd_report to store the osd report epochs, once we don't + * need to upgrade from pre-luminous releases. + */ std::map osd_epochs; LastEpochClean last_epoch_clean; bool preprocess_beacon(MonOpRequestRef op); -- 2.39.5