From: chunmei liu Date: Mon, 9 Mar 2026 22:51:46 +0000 (-0700) Subject: crimson/osd/osd_admin: add osd command to dump store shards info X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=92b8c8f22694b08c382d9a95d2fa73859e5133dd;p=ceph.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 d9f8daa5b9c..e69edaae150 100644 --- a/src/crimson/admin/osd_admin.cc +++ b/src/crimson/admin/osd_admin.cc @@ -640,4 +640,28 @@ public: }; template std::unique_ptr make_asok_hook(); +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 2a5d47c57f8..334110e575a 100644 --- a/src/crimson/admin/osd_admin.h +++ b/src/crimson/admin/osd_admin.h @@ -24,7 +24,7 @@ class DumpHistoricOpsHook; class DumpSlowestHistoricOpsHook; class DumpRecoveryReservationsHook; class DumpReactorBackendHook; - +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 afda91077ea..6dae3ec9d95 100644 --- a/src/crimson/osd/osd.cc +++ b/src/crimson/osd/osd.cc @@ -843,6 +843,8 @@ seastar::future<> OSD::start_asok_admin() make_asok_hook(get_shard_services())); asok->register_command( make_asok_hook()); + 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 10b4a0dcea7..a6632346707 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 8ab92fccdac..13d071e9282 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 8a5c8e45329..e8586a01dac 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, store_index_t store_index) { return pg_to_shard_mapping.get_or_create_pg_mapping(pgid, core, store_index); }