template std::unique_ptr<AdminSocketHook>
make_asok_hook<DumpRecoveryReservationsHook>(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<tell_result_t> call(const cmdmap_t&,
+ std::string_view format,
+ ceph::bufferlist&& input) const final
+ {
+ LOG_PREFIX(AdminSocketHook::StoreShardNumsHook);
+ DEBUG("");
+ unique_ptr<Formatter> 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<AdminSocketHook>
+make_asok_hook<StoreShardNumsHook>(crimson::osd::ShardServices& shard_services);
+
} // namespace crimson::admin
class DumpHistoricOpsHook;
class DumpSlowestHistoricOpsHook;
class DumpRecoveryReservationsHook;
+class StoreShardNumsHook;
template<class Hook, class... Args>
std::unique_ptr<AdminSocketHook> make_asok_hook(Args&&... args);
std::as_const(get_shard_services().get_registry())));
asok->register_command(
make_asok_hook<DumpRecoveryReservationsHook>(get_shard_services()));
+ asok->register_command(
+ make_asok_hook<StoreShardNumsHook>(get_shard_services()));
});
}
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<std::pair<core_id_t, unsigned int>> PGShardMapping::get_or_create_pg_mapping(
spg_t pgid,
core_id_t core_expected,
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) {
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);
}