void OpTracker::unregister_inflight_op(TrackedOp *i)
{
// caller checks;
- assert(tracking_enabled);
+ assert(i->is_tracked.read());
uint32_t shard_index = i->seq % num_optracker_shards;
ShardedTrackingData* sdata = sharded_in_flight_list[shard_index];
void OpTracker::mark_event(TrackedOp *op, const string &dest, utime_t time)
{
- if (!tracking_enabled)
+ if (!op->is_tracked.read())
return;
return _mark_event(op, dest, time);
}
}
void OpTracker::RemoveOnDelete::operator()(TrackedOp *op) {
- if (!tracker->tracking_enabled) {
+ if (!op->is_tracked.read()) {
op->_unregistered();
delete op;
return;
void TrackedOp::mark_event(const string &event)
{
- if (!tracker->tracking_enabled)
+ if (!is_tracked.read())
return;
utime_t now = ceph_clock_now(g_ceph_context);
void TrackedOp::dump(utime_t now, Formatter *f) const
{
+ // Ignore if still in the constructor
+ if (!is_tracked.read())
+ return;
stringstream name;
_dump_op_descriptor_unlocked(name);
f->dump_string("description", name.str().c_str()); // this TrackedOp
#include "include/xlist.h"
#include "msg/Message.h"
#include "include/memory.h"
+#include "include/atomic.h"
class TrackedOp;
typedef ceph::shared_ptr<TrackedOp> TrackedOpRef;
{
typename T::Ref retval(new T(params, this),
RemoveOnDelete(this));
+ retval->tracking_start();
return retval;
}
};
uint64_t seq; /// a unique value set by the OpTracker
uint32_t warn_interval_multiplier; // limits output of a given op warning
-
+ // Transitions from false -> true without locks being held
+ atomic_t is_tracked; //whether in tracker and out of constructor
TrackedOp(OpTracker *_tracker, const utime_t& initiated) :
xitem(this),
tracker(_tracker),
lock("TrackedOp::lock"),
seq(0),
warn_interval_multiplier(1)
- {
- tracker->register_inflight_op(&xitem);
- if (tracker->tracking_enabled)
- events.push_back(make_pair(initiated_at, "initiated"));
- }
+ { }
/// output any type-specific data you want to get when dump() is called
virtual void _dump(utime_t now, Formatter *f) const {}
return events.rbegin()->second.c_str();
}
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);
+ events.push_back(make_pair(initiated_at, "initiated"));
+ is_tracked.set(1);
+ }
+ }
};
#endif