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-Tag: v21.0.0~3^2~49 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=41d95f5ec43c2caecc6ae5d022818d265ccdca44;p=ceph.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 e69edaae1508..df5aeac90033 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 9350c073b7ab..73f8be167dcc 100644 --- a/src/crimson/osd/osd.cc +++ b/src/crimson/osd/osd.cc @@ -1106,26 +1106,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; @@ -1161,11 +1160,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 e26af63b1701..730336e6bff9 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 2ca8c4f105cc..04ab77ee5d00 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 6ed7a50f11a4..a2eeeeb7eb09 100644 --- a/src/crimson/osd/shard_services.cc +++ b/src/crimson/osd/shard_services.cc @@ -938,4 +938,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 e8586a01dac0..b1fb5fb29902 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) { @@ -640,6 +654,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)