]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
common/TrackedOp: support overriding the _dump method
authorPatrick Donnelly <pdonnell@redhat.com>
Wed, 26 Jul 2023 17:14:46 +0000 (13:14 -0400)
committerPatrick Donnelly <pdonnell@redhat.com>
Tue, 8 Aug 2023 12:58:41 +0000 (08:58 -0400)
When dumping an op, it may be desirable to alter how it is dumped depending on
which locks are held. As it happens, I plan to dump extra information if the
mds_lock is held!

Signed-off-by: Patrick Donnelly <pdonnell@redhat.com>
src/common/TrackedOp.cc
src/common/TrackedOp.h

index d63bdb8f9a5744a2d91237f3eefafeab587f6cd4..32a1ab472a89f82096454b2ed672e173963a971c 100644 (file)
@@ -134,7 +134,7 @@ void OpHistory::dump_ops(utime_t now, Formatter *f, set<string> filters, bool by
        if (!i->second->filter_out(filters))
          continue;
        f->open_object_section("op");
-       i->second->dump(now, f);
+       i->second->dump(now, f, OpTracker::default_dumper);
        f->close_section();
       }
     };
@@ -214,7 +214,7 @@ void OpHistory::dump_slow_ops(utime_t now, Formatter *f, set<string> filters)
       if (!i->second->filter_out(filters))
         continue;
       f->open_object_section("Op");
-      i->second->dump(now, f);
+      i->second->dump(now, f, OpTracker::default_dumper);
       f->close_section();
     }
     f->close_section();
@@ -233,7 +233,7 @@ bool OpTracker::dump_historic_slow_ops(Formatter *f, set<string> filters)
   return true;
 }
 
-bool OpTracker::dump_ops_in_flight(Formatter *f, bool print_only_blocked, set<string> filters, bool count_only)
+bool OpTracker::dump_ops_in_flight(Formatter *f, bool print_only_blocked, set<string> filters, bool count_only, dumper lambda)
 {
   if (!tracking_enabled)
     return false;
@@ -259,7 +259,7 @@ bool OpTracker::dump_ops_in_flight(Formatter *f, bool print_only_blocked, set<st
       
       if (!count_only) {
         f->open_object_section("op");
-        op.dump(now, f);
+        op.dump(now, f, lambda);
         f->close_section(); // this TrackedOp
       }
 
@@ -496,7 +496,7 @@ void TrackedOp::mark_event(std::string_view event, utime_t stamp)
   _event_marked();
 }
 
-void TrackedOp::dump(utime_t now, Formatter *f) const
+void TrackedOp::dump(utime_t now, Formatter *f, OpTracker::dumper lambda) const
 {
   // Ignore if still in the constructor
   if (!state)
@@ -507,7 +507,7 @@ void TrackedOp::dump(utime_t now, Formatter *f) const
   f->dump_float("duration", get_duration());
   {
     f->open_object_section("type_data");
-    _dump(f);
+    lambda(*this, f);
     f->close_section();
   }
 }
index af0e036baf4438e9bb4c5e6a59f2676a5ee7281f..238f1c7ac7c5fc68944324cfc3fe5fe8bf8246ce 100644 (file)
@@ -130,6 +130,8 @@ class OpTracker {
   ceph::shared_mutex lock = ceph::make_shared_mutex("OpTracker::lock");
 
 public:
+  using dumper = std::function<void(const TrackedOp&, Formatter*)>;
+
   CephContext *cct;
   OpTracker(CephContext *cct_, bool tracking, uint32_t num_shards);
       
@@ -149,7 +151,8 @@ public:
   void set_tracking(bool enable) {
     tracking_enabled = enable;
   }
-  bool dump_ops_in_flight(ceph::Formatter *f, bool print_only_blocked = false, std::set<std::string> filters = {""}, bool count_only = false);
+  static void default_dumper(const TrackedOp& op, Formatter* f);
+  bool dump_ops_in_flight(ceph::Formatter *f, bool print_only_blocked = false, std::set<std::string> filters = {""}, bool count_only = false, dumper lambda = default_dumper);
   bool dump_historic_ops(ceph::Formatter *f, bool by_duration = false, std::set<std::string> filters = {""});
   bool dump_historic_slow_ops(ceph::Formatter *f, std::set<std::string> filters = {""});
   bool register_inflight_op(TrackedOp *i);
@@ -374,6 +377,10 @@ public:
     want_new_desc = true;
   }
 
+  void dump_type(Formatter* f) const {
+    return _dump(f);
+  }
+
   const utime_t& get_initiated() const {
     return initiated_at;
   }
@@ -397,7 +404,7 @@ public:
     return _get_state_string();
   }
 
-  void dump(utime_t now, ceph::Formatter *f) const;
+  void dump(utime_t now, ceph::Formatter *f, OpTracker::dumper lambda) const;
 
   void tracking_start() {
     if (tracker->register_inflight_op(this)) {
@@ -421,5 +428,8 @@ protected:
   }
 };
 
+inline void OpTracker::default_dumper(const TrackedOp& op, Formatter* f) {
+  op._dump(f);
+}
 
 #endif