From: chunmei liu Date: Thu, 19 Feb 2026 23:02:43 +0000 (-0800) Subject: crimson/osd/osd_admin: add osd command to dump store X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=81ef58d5c1f6a2f05ff370b3620286846981ef0c;p=ceph-ci.git crimson/osd/osd_admin: add osd command to dump store shards info Signed-off-by: chunmei liu --- diff --git a/src/crimson/admin/osd_admin.cc b/src/crimson/admin/osd_admin.cc index b36cdd7b0a1..3828c525175 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 e03d7c634da..0467afdae3d 100644 --- a/src/crimson/osd/osd.cc +++ b/src/crimson/osd/osd.cc @@ -841,6 +841,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 7dd8d1cc10a..21aa88751ac 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 cebdf86bee6..a9e83a70894 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, uint32_t 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 bb60fd97c90..1a38d10a85f 100644 --- a/src/crimson/osd/shard_services.h +++ b/src/crimson/osd/shard_services.h @@ -498,6 +498,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, uint32_t store_index) { return pg_to_shard_mapping.get_or_create_pg_mapping(pgid, core, store_index); }