From 633e6b24da1a45a918491fb8f776fcb88fa5d6c3 Mon Sep 17 00:00:00 2001 From: Matan Breizman Date: Sun, 12 Nov 2023 13:31:40 +0000 Subject: [PATCH] crimson/osd: OSDBeacon to report lec See: https://github.com/ceph/ceph/pull/14504 Signed-off-by: Matan Breizman --- src/crimson/mgr/client.h | 2 +- src/crimson/osd/osd.cc | 20 +++++++++++++------- src/crimson/osd/osd.h | 5 ++++- src/crimson/osd/shard_services.cc | 2 +- src/crimson/osd/shard_services.h | 2 +- 5 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/crimson/mgr/client.h b/src/crimson/mgr/client.h index 501949768dddf..b88c60c5e4a47 100644 --- a/src/crimson/mgr/client.h +++ b/src/crimson/mgr/client.h @@ -24,7 +24,7 @@ namespace crimson::mgr // implement WithStats if you want to report stats to mgr periodically class WithStats { public: - virtual seastar::future get_stats() const = 0; + virtual seastar::future get_stats() = 0; virtual ~WithStats() {} }; diff --git a/src/crimson/osd/osd.cc b/src/crimson/osd/osd.cc index 2ff907a79362c..1b574abd8fa38 100644 --- a/src/crimson/osd/osd.cc +++ b/src/crimson/osd/osd.cc @@ -883,13 +883,20 @@ void OSD::update_stats() }); } -seastar::future OSD::get_stats() const +seastar::future OSD::get_stats() { // MPGStats::had_map_for is not used since PGMonitor was removed auto m = crimson::make_message(monc->get_fsid(), osdmap->get_epoch()); m->osd_stat = osd_stat; return pg_shard_manager.get_pg_stats( - ).then([m=std::move(m)](auto &&stats) mutable { + ).then([this, m=std::move(m)](auto &&stats) mutable { + min_last_epoch_clean = osdmap->get_epoch(); + min_last_epoch_clean_pgs.clear(); + for (auto [pgid, stat] : stats) { + min_last_epoch_clean = std::min(min_last_epoch_clean, + stat.get_effective_last_epoch_clean()); + min_last_epoch_clean_pgs.push_back(pgid); + } m->pg_stat = std::move(stats); return seastar::make_ready_future(std::move(m)); }); @@ -1283,14 +1290,13 @@ seastar::future<> OSD::send_beacon() if (!pg_shard_manager.is_active()) { return seastar::now(); } - // FIXME: min lec should be calculated from pg_stat - // and should set m->pgs - epoch_t min_last_epoch_clean = osdmap->get_epoch(); - auto m = crimson::make_message(osdmap->get_epoch(), + auto beacon = crimson::make_message(osdmap->get_epoch(), min_last_epoch_clean, superblock.last_purged_snaps_scrub, local_conf()->osd_beacon_report_interval); - return monc->send_message(std::move(m)); + beacon->pgs = min_last_epoch_clean_pgs; + logger().debug("{} {}", __func__, *beacon); + return monc->send_message(std::move(beacon)); } seastar::future<> OSD::update_heartbeat_peers() diff --git a/src/crimson/osd/osd.h b/src/crimson/osd/osd.h index 10ff60d47017f..8125e89fbaf1c 100644 --- a/src/crimson/osd/osd.h +++ b/src/crimson/osd/osd.h @@ -106,8 +106,11 @@ class OSD final : public crimson::net::Dispatcher, // pg statistics including osd ones osd_stat_t osd_stat; uint32_t osd_stat_seq = 0; + epoch_t min_last_epoch_clean = 0; + // which pgs were scanned for min_lec + std::vector min_last_epoch_clean_pgs; void update_stats(); - seastar::future get_stats() const final; + seastar::future get_stats() final; // AuthHandler methods void handle_authentication(const EntityName& name, diff --git a/src/crimson/osd/shard_services.cc b/src/crimson/osd/shard_services.cc index c73613dd98880..e81c96562ca6e 100644 --- a/src/crimson/osd/shard_services.cc +++ b/src/crimson/osd/shard_services.cc @@ -72,7 +72,7 @@ seastar::future<> PerShardState::stop_pgs() }); } -std::map PerShardState::get_pg_stats() const +std::map PerShardState::get_pg_stats() { assert_core(); std::map ret; diff --git a/src/crimson/osd/shard_services.h b/src/crimson/osd/shard_services.h index 51720d706ebe7..37993a4f67950 100644 --- a/src/crimson/osd/shard_services.h +++ b/src/crimson/osd/shard_services.h @@ -119,7 +119,7 @@ class PerShardState { PGMap pg_map; seastar::future<> stop_pgs(); - std::map get_pg_stats() const; + std::map get_pg_stats(); seastar::future<> broadcast_map_to_pgs( ShardServices &shard_services, epoch_t epoch); -- 2.39.5