From a56c0f0f1a4fb6a4a86d3dfb74927d9151cee421 Mon Sep 17 00:00:00 2001 From: chunmei liu Date: Thu, 24 Jul 2025 06:33:06 -0700 Subject: [PATCH] crimson/osd/osd_admin: add osd command to dump store shards info Signed-off-by: chunmei liu --- src/crimson/admin/osd_admin.cc | 24 +++++++++++++++++ src/crimson/admin/osd_admin.h | 1 + src/crimson/osd/osd.cc | 2 ++ src/crimson/osd/pg_map.cc | 45 ++++++++++++++++++++++++++++++++ src/crimson/osd/pg_map.h | 2 ++ src/crimson/osd/shard_services.h | 4 +++ 6 files changed, 78 insertions(+) diff --git a/src/crimson/admin/osd_admin.cc b/src/crimson/admin/osd_admin.cc index ee77a9bbe98..6fae77e7bb1 100644 --- a/src/crimson/admin/osd_admin.cc +++ b/src/crimson/admin/osd_admin.cc @@ -618,4 +618,28 @@ private: template std::unique_ptr make_asok_hook(crimson::osd::ShardServices& shard_services); +class StoreShardNumsHook : public AdminSocketHook { +public: + explicit StoreShardNumsHook(crimson::osd::ShardServices& shard_services) : + AdminSocketHook{"dump_store_shards", "", "show store shards on each osd shard"}, + shard_services(shard_services) + {} + seastar::future call(const cmdmap_t&, + std::string_view format, + ceph::bufferlist&& input) const final + { + LOG_PREFIX(AdminSocketHook::StoreShardNumsHook); + DEBUG(""); + unique_ptr f{Formatter::create(format, "json-pretty", "json-pretty")}; + f->open_object_section("Store shards"); + co_await shard_services.dump_store_shards(f.get()); + f->close_section(); + co_return std::move(f); + } +private: + crimson::osd::ShardServices& shard_services; +}; +template std::unique_ptr +make_asok_hook(crimson::osd::ShardServices& shard_services); + } // namespace crimson::admin diff --git a/src/crimson/admin/osd_admin.h b/src/crimson/admin/osd_admin.h index b33ea005fb8..bb877decf14 100644 --- a/src/crimson/admin/osd_admin.h +++ b/src/crimson/admin/osd_admin.h @@ -23,6 +23,7 @@ class DumpInFlightOpsHook; class DumpHistoricOpsHook; class DumpSlowestHistoricOpsHook; class DumpRecoveryReservationsHook; +class StoreShardNumsHook; template std::unique_ptr make_asok_hook(Args&&... args); diff --git a/src/crimson/osd/osd.cc b/src/crimson/osd/osd.cc index 19aa4d03c41..d0420487541 100644 --- a/src/crimson/osd/osd.cc +++ b/src/crimson/osd/osd.cc @@ -824,6 +824,8 @@ seastar::future<> OSD::start_asok_admin() std::as_const(get_shard_services().get_registry()))); asok->register_command( make_asok_hook(get_shard_services())); + asok->register_command( + make_asok_hook(get_shard_services())); }); } diff --git a/src/crimson/osd/pg_map.cc b/src/crimson/osd/pg_map.cc index 5444dc54dc2..01504d2cd65 100644 --- a/src/crimson/osd/pg_map.cc +++ b/src/crimson/osd/pg_map.cc @@ -12,6 +12,51 @@ using std::make_pair; namespace crimson::osd { +seastar::future<> PGShardMapping::dump_store_shards(Formatter *f) const { + f->dump_int("this shard id", seastar::this_shard_id()); + f->dump_int("osd shard nums", seastar::smp::count); + f->dump_int("store_shard_nums", store_shard_nums); + + for (const auto &i : core_to_num_pgs) { + f->open_object_section("core_pgs"); + f->dump_int("core", i.first); + f->dump_int("num_pgs", i.second); + f->close_section(); + } + + if (seastar::smp::count < store_shard_nums) { + for (auto i = core_shard_to_num_pgs.begin(); + i != core_shard_to_num_pgs.end(); ++i) { + f->open_object_section("core_store"); + f->dump_int("core", i->first); + for (auto j = i->second.begin(); + j != i->second.end(); ++j) { + f->open_object_section("store"); + f->dump_int("store_index", j->first); + f->dump_int("num_pgs", j->second); + f->close_section(); + } + f->close_section(); + } + } + if(seastar::smp::count > store_shard_nums) { + for (auto i = core_alien_to_num_pgs.begin(); + i != core_alien_to_num_pgs.end(); ++i) { + f->open_object_section("core_alien"); + f->dump_int("core", i->first); + for (auto j = i->second.begin(); + j != i->second.end(); ++j) { + f->open_object_section("alien_core"); + f->dump_int("alien_core_id", j->first); + f->dump_int("num_pgs", j->second); + f->close_section(); + } + f->close_section(); + } + } + return seastar::now(); +} + seastar::future> PGShardMapping::get_or_create_pg_mapping( spg_t pgid, core_id_t core_expected, diff --git a/src/crimson/osd/pg_map.h b/src/crimson/osd/pg_map.h index 7006f19874b..c112f8acde9 100644 --- a/src/crimson/osd/pg_map.h +++ b/src/crimson/osd/pg_map.h @@ -45,6 +45,8 @@ public: size_t get_num_pgs() const { return pg_to_core.size(); } + seastar::future<> dump_store_shards(Formatter *f) const; + /// Map to cores in [min_core_mapping, core_mapping_limit) PGShardMapping(core_id_t min_core_mapping, core_id_t core_mapping_limit, unsigned int store_shard_nums) : store_shard_nums(store_shard_nums) { diff --git a/src/crimson/osd/shard_services.h b/src/crimson/osd/shard_services.h index de9c6e25b69..04d2a006b30 100644 --- a/src/crimson/osd/shard_services.h +++ b/src/crimson/osd/shard_services.h @@ -505,6 +505,10 @@ public: return {get_reactor_utilization()}; } + auto dump_store_shards(Formatter *f) const { + return pg_to_shard_mapping.dump_store_shards(f); + } + auto create_split_pg_mapping(spg_t pgid, core_id_t core, unsigned int store_index) { return pg_to_shard_mapping.get_or_create_pg_mapping(pgid, core, store_index); } -- 2.39.5