From: Kefu Chai Date: Thu, 27 Aug 2020 14:16:25 +0000 (+0800) Subject: crimson/osd: support "dump_pgstate_history" command X-Git-Tag: v16.1.0~1268^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=5de5e32beff7e4e927e2acf4deb8c7ce958085e8;p=ceph.git crimson/osd: support "dump_pgstate_history" command it is required by the "ceph_test_admin_socket_output" test. Signed-off-by: Kefu Chai --- diff --git a/src/crimson/admin/osd_admin.cc b/src/crimson/admin/osd_admin.cc index c6a6625b9265..5f7c987fd25b 100644 --- a/src/crimson/admin/osd_admin.cc +++ b/src/crimson/admin/osd_admin.cc @@ -105,6 +105,32 @@ private: }; template std::unique_ptr make_asok_hook(crimson::osd::OSD& osd); +/// dump the history of PGs' peering state +class DumpPGStateHistory final: public AdminSocketHook { +public: + explicit DumpPGStateHistory(const crimson::osd::OSD &osd) : + AdminSocketHook{"dump_pgstate_history", + "", + "dump history of PGs' peering state"}, + osd{osd} + {} + seastar::future call(const cmdmap_t&, + std::string_view format, + ceph::bufferlist&& input) const final + { + std::unique_ptr f{Formatter::create(format, + "json-pretty", + "json-pretty")}; + f->open_object_section("pgstate_history"); + osd.dump_pg_state_history(f.get()); + f->close_section(); + return seastar::make_ready_future(f.get()); + } +private: + const crimson::osd::OSD& osd; +}; +template std::unique_ptr make_asok_hook(const crimson::osd::OSD& osd); + /** * A CephContext admin hook: calling assert (if allowed by * 'debug_asok_assert_abort') diff --git a/src/crimson/admin/osd_admin.h b/src/crimson/admin/osd_admin.h index 3f750fbcc019..cf3c393b11b5 100644 --- a/src/crimson/admin/osd_admin.h +++ b/src/crimson/admin/osd_admin.h @@ -12,6 +12,7 @@ class AssertAlwaysHook; class FlushPgStatsHook; class OsdStatusHook; class SendBeaconHook; +class DumpPGStateHistory; template std::unique_ptr make_asok_hook(Args&&... args); diff --git a/src/crimson/osd/osd.cc b/src/crimson/osd/osd.cc index d1f55ddc7818..68e7d56f46e9 100644 --- a/src/crimson/osd/osd.cc +++ b/src/crimson/osd/osd.cc @@ -429,7 +429,8 @@ seastar::future<> OSD::start_asok_admin() asok->register_admin_commands(), asok->register_command(make_asok_hook(*this)), asok->register_command(make_asok_hook(*this)), - asok->register_command(make_asok_hook(*this))); + asok->register_command(make_asok_hook(*this)), + asok->register_command(make_asok_hook(std::as_const(*this)))); }).then_unpack([] { return seastar::now(); }); @@ -493,6 +494,20 @@ void OSD::dump_status(Formatter* f) const f->dump_unsigned("num_pgs", pg_map.get_pgs().size()); } +void OSD::dump_pg_state_history(Formatter* f) const +{ + f->open_array_section("pgs"); + for (auto [pgid, pg] : pg_map.get_pgs()) { + f->open_object_section("pg"); + f->dump_stream("pg") << pgid; + const auto& peering_state = pg->get_peering_state(); + f->dump_string("currently", peering_state.get_current_state()); + peering_state.dump_history(f); + f->close_section(); + } + f->close_section(); +} + void OSD::print(std::ostream& out) const { out << "{osd." << superblock.whoami << " " diff --git a/src/crimson/osd/osd.h b/src/crimson/osd/osd.h index e95b4f8ee110..ba9bdf575d94 100644 --- a/src/crimson/osd/osd.h +++ b/src/crimson/osd/osd.h @@ -135,7 +135,7 @@ public: seastar::future<> stop(); void dump_status(Formatter*) const; - + void dump_pg_state_history(Formatter*) const; void print(std::ostream&) const; seastar::future<> send_incremental_map(crimson::net::Connection* conn,