diff --git a/src/common/TrackedOp.cc b/src/common/TrackedOp.cc index 4204f1a89c188..31d8a30c6bf7a 100644 --- a/src/common/TrackedOp.cc +++ b/src/common/TrackedOp.cc @@ -131,10 +131,11 @@ bool OpTracker::dump_ops_in_flight(Formatter *f, bool print_only_blocked) return true; } -void OpTracker::register_inflight_op(xlist::item *i) +bool OpTracker::register_inflight_op(xlist::item *i) { - // caller checks; - assert(tracking_enabled); + RWLock::RLocker l(lock); + if (!tracking_enabled) + return false; uint64_t current_seq = seq.inc(); uint32_t shard_index = current_seq % num_optracker_shards; @@ -145,6 +146,7 @@ void OpTracker::register_inflight_op(xlist::item *i) sdata->ops_in_flight_sharded.push_back(i); sdata->ops_in_flight_sharded.back()->seq = current_seq; } + return true; } void OpTracker::unregister_inflight_op(TrackedOp *i) diff --git a/src/common/TrackedOp.h b/src/common/TrackedOp.h index 2d50c8ff7ba4a..0cf51ec1d94ef 100644 --- a/src/common/TrackedOp.h +++ b/src/common/TrackedOp.h @@ -75,16 +75,16 @@ class OpTracker { float complaint_time; int log_threshold; void _mark_event(TrackedOp *op, const string &evt, utime_t now); + bool tracking_enabled; + RWLock lock; public: - bool tracking_enabled; CephContext *cct; - RWLock lock; OpTracker(CephContext *cct_, bool tracking, uint32_t num_shards) : seq(0), num_optracker_shards(num_shards), complaint_time(0), log_threshold(0), - tracking_enabled(tracking), cct(cct_), - lock("OpTracker::lock") { + tracking_enabled(tracking), + lock("OpTracker::lock"), cct(cct_) { for (uint32_t i = 0; i < num_optracker_shards; i++) { char lock_name[32] = {0}; @@ -107,7 +107,7 @@ class OpTracker { } bool dump_ops_in_flight(Formatter *f, bool print_only_blocked=false); bool dump_historic_ops(Formatter *f); - void register_inflight_op(xlist::item *i); + bool register_inflight_op(xlist::item *i); void unregister_inflight_op(TrackedOp *i); void get_age_ms_histogram(pow2_hist_t *h); @@ -201,9 +201,7 @@ class TrackedOp { } void dump(utime_t now, Formatter *f) const; void tracking_start() { - RWLock::RLocker l(tracker->lock); - if (tracker->tracking_enabled) { - tracker->register_inflight_op(&xitem); + if (tracker->register_inflight_op(&xitem)) { events.push_back(make_pair(initiated_at, "initiated")); is_tracked.set(1); }