From: Patrick Donnelly Date: Wed, 26 Jul 2023 17:14:46 +0000 (-0400) Subject: common/TrackedOp: support overriding the _dump method X-Git-Tag: v18.2.1~147^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e34d730fc48462cb3b81acc8c8b012e74a46015c;p=ceph.git common/TrackedOp: support overriding the _dump method 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 (cherry picked from commit 224ba5ad4cf7cce6f48d9cbe1e0157b804954c6a) --- diff --git a/src/common/TrackedOp.cc b/src/common/TrackedOp.cc index d63bdb8f9a57..32a1ab472a89 100644 --- a/src/common/TrackedOp.cc +++ b/src/common/TrackedOp.cc @@ -134,7 +134,7 @@ void OpHistory::dump_ops(utime_t now, Formatter *f, set 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 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 filters) return true; } -bool OpTracker::dump_ops_in_flight(Formatter *f, bool print_only_blocked, set filters, bool count_only) +bool OpTracker::dump_ops_in_flight(Formatter *f, bool print_only_blocked, set 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, setopen_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(); } } diff --git a/src/common/TrackedOp.h b/src/common/TrackedOp.h index 073496be919c..477f6c959cb3 100644 --- a/src/common/TrackedOp.h +++ b/src/common/TrackedOp.h @@ -130,6 +130,8 @@ class OpTracker { ceph::shared_mutex lock = ceph::make_shared_mutex("OpTracker::lock"); public: + using dumper = std::function; + 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 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 filters = {""}, bool count_only = false, dumper lambda = default_dumper); bool dump_historic_ops(ceph::Formatter *f, bool by_duration = false, std::set filters = {""}); bool dump_historic_slow_ops(ceph::Formatter *f, std::set 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