From 224ba5ad4cf7cce6f48d9cbe1e0157b804954c6a Mon Sep 17 00:00:00 2001 From: Patrick Donnelly Date: Wed, 26 Jul 2023 13:14:46 -0400 Subject: [PATCH] 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 --- src/common/TrackedOp.cc | 12 ++++++------ src/common/TrackedOp.h | 14 ++++++++++++-- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/common/TrackedOp.cc b/src/common/TrackedOp.cc index d63bdb8f9a574..32a1ab472a89f 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 af0e036baf443..238f1c7ac7c5f 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 -- 2.39.5