]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd: support "dump_pgstate_history" command
authorKefu Chai <kchai@redhat.com>
Thu, 27 Aug 2020 14:16:25 +0000 (22:16 +0800)
committerKefu Chai <kchai@redhat.com>
Mon, 31 Aug 2020 13:18:13 +0000 (21:18 +0800)
it is required by the "ceph_test_admin_socket_output" test.

Signed-off-by: Kefu Chai <kchai@redhat.com>
src/crimson/admin/osd_admin.cc
src/crimson/admin/osd_admin.h
src/crimson/osd/osd.cc
src/crimson/osd/osd.h

index c6a6625b926599a25f4453143b3e3ca98f6d64a5..5f7c987fd25bb5d9ad02ac56e6e7d98e8546a0b1 100644 (file)
@@ -105,6 +105,32 @@ private:
 };
 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')
index 3f750fbcc019ff87a1d4f625ad04162120affbe2..cf3c393b11b575011bb0d6a8fdad2348efd92ed3 100644 (file)
@@ -12,6 +12,7 @@ class AssertAlwaysHook;
 class FlushPgStatsHook;
 class OsdStatusHook;
 class SendBeaconHook;
+class DumpPGStateHistory;
 
 template<class Hook, class... Args>
 std::unique_ptr<AdminSocketHook> make_asok_hook(Args&&... args);
index d1f55ddc781860fda0d386ab219ae99d888f695e..68e7d56f46e92de6f882651662d466697154d3ee 100644 (file)
@@ -429,7 +429,8 @@ seastar::future<> OSD::start_asok_admin()
       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();
   });
@@ -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 << " "
index e95b4f8ee110450604fc2057f64481017378a261..ba9bdf575d9461624af3ae4db1e019f9b783ae12 100644 (file)
@@ -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,