From: Radoslaw Zarzynski Date: Thu, 9 May 2024 09:44:56 +0000 (+0000) Subject: crimson/osd: make OSD::osd_stat compliant with multi-core X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=8e0920cf7e014ae9c9bce24f49e80c118555b0c0;p=ceph-ci.git crimson/osd: make OSD::osd_stat compliant with multi-core The EC recovery backend needs `inc_osd_stat_repaired()`. Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/crimson/admin/osd_admin.cc b/src/crimson/admin/osd_admin.cc index 8e73180edb0..19b1891ffe8 100644 --- a/src/crimson/admin/osd_admin.cc +++ b/src/crimson/admin/osd_admin.cc @@ -209,14 +209,15 @@ public: {} seastar::future call(const cmdmap_t&, std::string_view format, - ceph::bufferlist&& input) const final + ceph::bufferlist&&) const final { LOG_PREFIX(AdminSocketHook::FlushPgStatsHook); DEBUG(""); - uint64_t seq = osd.send_pg_stats(); - unique_ptr f{Formatter::create(format, "json-pretty", "json-pretty")}; - f->dump_unsigned("stat_seq", seq); - co_return std::move(f); + return osd.send_pg_stats().then([format](uint64_t seq) { + unique_ptr f{Formatter::create(format, "json-pretty", "json-pretty")}; + f->dump_unsigned("stat_seq", seq); + return seastar::make_ready_future(std::move(f)); + }); } private: diff --git a/src/crimson/osd/osd.cc b/src/crimson/osd/osd.cc index 749b98bd59d..8002e9db8e2 100644 --- a/src/crimson/osd/osd.cc +++ b/src/crimson/osd/osd.cc @@ -1083,26 +1083,25 @@ void OSD::handle_conf_change( void OSD::update_stats() { - osd_stat_seq++; - osd_stat.up_from = get_shard_services().get_up_epoch(); - osd_stat.hb_peers = heartbeat->get_peers(); - osd_stat.seq = ( - static_cast(get_shard_services().get_up_epoch()) << 32 - ) | osd_stat_seq; gate.dispatch_in_background("statfs", *this, [this] { - (void) store.stat().then([this](store_statfs_t&& st) { - osd_stat.statfs = st; + return store.stat().then([this](store_statfs_t&& st) { + return get_shard_services().update_osd_stat( + get_shard_services().get_up_epoch(), + heartbeat->get_peers(), + st); }); }); + } 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([this, m=std::move(m)](auto &&stats) mutable { + return get_shard_services().get_osd_stat().then([this, m=m.get()](auto&& osd_stat) { + m->osd_stat = std::move(osd_stat); + return pg_shard_manager.get_pg_stats(); + }).then([this, m=std::move(m)](auto &&stats) mutable { min_last_epoch_clean = osdmap->get_epoch(); min_last_epoch_clean_pgs.clear(); std::set pool_set; @@ -1138,11 +1137,13 @@ seastar::future OSD::get_stats() }); } -uint64_t OSD::send_pg_stats() +seastar::future OSD::send_pg_stats() { - // mgr client sends the report message in background - mgrc->report(); - return osd_stat.seq; + return get_shard_services().get_osd_stat().then([this](auto&& osd_stat) { + // mgr client sends the report message in background + mgrc->report(); + return osd_stat.seq; + }); } seastar::future<> OSD::handle_osd_map(Ref m) diff --git a/src/crimson/osd/osd.h b/src/crimson/osd/osd.h index e26af63b170..730336e6bff 100644 --- a/src/crimson/osd/osd.h +++ b/src/crimson/osd/osd.h @@ -106,8 +106,6 @@ class OSD final : public crimson::net::Dispatcher, // mgr::WithStats methods // 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; @@ -172,7 +170,7 @@ public: void print(std::ostream&) const; /// @return the seq id of the pg stats being sent - uint64_t send_pg_stats(); + seastar::future send_pg_stats(); auto &get_shard_services() { return shard_services.local(); diff --git a/src/crimson/osd/pg_shard_manager.h b/src/crimson/osd/pg_shard_manager.h index f0f4cbc9b25..01b0cde75c4 100644 --- a/src/crimson/osd/pg_shard_manager.h +++ b/src/crimson/osd/pg_shard_manager.h @@ -138,6 +138,9 @@ public: FORWARD_TO_OSD_SINGLETON(store_maps) FORWARD_TO_OSD_SINGLETON(trim_maps) + // osd stats + FORWARD_TO_OSD_SINGLETON(get_osd_stat) + seastar::future<> set_up_epoch(epoch_t e); seastar::future<> set_superblock(OSDSuperblock superblock); diff --git a/src/crimson/osd/shard_services.cc b/src/crimson/osd/shard_services.cc index 9f54d657ae8..ae73c2c9f13 100644 --- a/src/crimson/osd/shard_services.cc +++ b/src/crimson/osd/shard_services.cc @@ -928,4 +928,17 @@ seastar::future<> OSDSingletonState::send_incremental_map_to_osd( } } +void OSDSingletonState::update_osd_stat( + epoch_t up_epoch, + const Heartbeat::osds_t& peers, + const store_statfs_t& st) +{ + osd_stat_seq++; + osd_stat.up_from = up_epoch; + osd_stat.hb_peers = peers; + osd_stat.statfs = st; + osd_stat.seq = (static_cast(up_epoch) << 32 + ) | osd_stat_seq; +} + }; diff --git a/src/crimson/osd/shard_services.h b/src/crimson/osd/shard_services.h index 8689a7da49a..2df9b47e494 100644 --- a/src/crimson/osd/shard_services.h +++ b/src/crimson/osd/shard_services.h @@ -17,6 +17,7 @@ #include "crimson/os/futurized_collection.h" #include "osd/PeeringState.h" #include "crimson/common/log.h" +#include "crimson/osd/heartbeat.h" #include "crimson/osd/osdmap_service.h" #include "crimson/osd/osdmap_gate.h" #include "crimson/osd/osd_meta.h" @@ -272,6 +273,19 @@ private: crimson::mgr::Client &mgrc; + osd_stat_t osd_stat; + uint32_t osd_stat_seq = 0; + osd_stat_t get_osd_stat() { + return osd_stat; + } + void update_osd_stat( + epoch_t up_epoch, + const Heartbeat::osds_t& peers, + const store_statfs_t& st); + void inc_osd_stat_repaired() { + osd_stat.num_shards_repaired++; + } + std::unique_ptr meta_coll; template void init_meta_coll(Args&&... args) { @@ -626,6 +640,9 @@ public: QUEUE_FOR_OSD_SINGLETON(send_pg_created) QUEUE_FOR_OSD_SINGLETON(send_alive) QUEUE_FOR_OSD_SINGLETON(send_pg_temp) + FORWARD_TO_OSD_SINGLETON(get_osd_stat) + FORWARD_TO_OSD_SINGLETON(update_osd_stat) + FORWARD_TO_OSD_SINGLETON(inc_osd_stat_repaired) FORWARD_TO_LOCAL_CONST(get_mnow) FORWARD_TO_LOCAL(get_hb_stamps) FORWARD_TO_LOCAL(update_shard_superblock)