it is required by the "ceph_test_admin_socket_output" test.
Signed-off-by: Kefu Chai <kchai@redhat.com>
};
template std::unique_ptr<AdminSocketHook> make_asok_hook<FlushPgStatsHook>(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<tell_result_t> call(const cmdmap_t&,
+ std::string_view format,
+ ceph::bufferlist&& input) const final
+ {
+ std::unique_ptr<Formatter> 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<tell_result_t>(f.get());
+ }
+private:
+ const crimson::osd::OSD& osd;
+};
+template std::unique_ptr<AdminSocketHook> make_asok_hook<DumpPGStateHistory>(const crimson::osd::OSD& osd);
+
/**
* A CephContext admin hook: calling assert (if allowed by
* 'debug_asok_assert_abort')
class FlushPgStatsHook;
class OsdStatusHook;
class SendBeaconHook;
+class DumpPGStateHistory;
template<class Hook, class... Args>
std::unique_ptr<AdminSocketHook> make_asok_hook(Args&&... args);
asok->register_admin_commands(),
asok->register_command(make_asok_hook<OsdStatusHook>(*this)),
asok->register_command(make_asok_hook<SendBeaconHook>(*this)),
- asok->register_command(make_asok_hook<FlushPgStatsHook>(*this)));
+ asok->register_command(make_asok_hook<FlushPgStatsHook>(*this)),
+ asok->register_command(make_asok_hook<DumpPGStateHistory>(std::as_const(*this))));
}).then_unpack([] {
return seastar::now();
});
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 << " "
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,