void OpTracker::register_inflight_op(xlist<TrackedOp*>::item *i)
{
- if (!tracking_enabled)
- return;
+ // caller checks;
+ assert(tracking_enabled);
uint64_t current_seq = seq.inc();
uint32_t shard_index = current_seq % num_optracker_shards;
void OpTracker::unregister_inflight_op(TrackedOp *i)
{
// caller checks;
- assert(tracking_enabled);
+ assert(i->is_tracked);
uint32_t shard_index = i->seq % num_optracker_shards;
ShardedTrackingData* sdata = sharded_in_flight_list[shard_index];
i->xitem.remove_myself();
}
i->_unregistered();
- utime_t now = ceph_clock_now(cct);
- history.insert(now, TrackedOpRef(i));
+
+ if (!tracking_enabled)
+ delete i;
+ else {
+ utime_t now = ceph_clock_now(cct);
+ history.insert(now, TrackedOpRef(i));
+ }
}
bool OpTracker::check_ops_in_flight(std::vector<string> &warning_vector)
{
+ RWLock::RLocker l(lock);
if (!tracking_enabled)
return false;
void OpTracker::mark_event(TrackedOp *op, const string &dest, utime_t time)
{
- if (!tracking_enabled)
+ if (!op->is_tracked)
return;
return _mark_event(op, dest, time);
}
}
void OpTracker::RemoveOnDelete::operator()(TrackedOp *op) {
- if (!tracker->tracking_enabled) {
+ if (!op->is_tracked) {
op->_unregistered();
delete op;
return;
void TrackedOp::mark_event(const string &event)
{
- if (!tracker->tracking_enabled)
+ if (!is_tracked)
return;
utime_t now = ceph_clock_now(g_ceph_context);
#include "include/xlist.h"
#include "msg/Message.h"
#include "include/memory.h"
+#include "common/RWLock.h"
class TrackedOp;
typedef ceph::shared_ptr<TrackedOp> TrackedOpRef;
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_) {
+ tracking_enabled(tracking), cct(cct_),
+ lock("OpTracker::lock") {
for (uint32_t i = 0; i < num_optracker_shards; i++) {
char lock_name[32] = {0};
void set_history_size_and_duration(uint32_t new_size, uint32_t new_duration) {
history.set_size_and_duration(new_size, new_duration);
}
+ void set_tracking(bool enable) {
+ RWLock::WLocker l(lock);
+ tracking_enabled = enable;
+ }
void dump_ops_in_flight(Formatter *f);
void dump_historic_ops(Formatter *f);
void register_inflight_op(xlist<TrackedOp*>::item *i);
uint64_t seq; /// a unique value set by the OpTracker
uint32_t warn_interval_multiplier; // limits output of a given op warning
-
+ bool is_tracked; //whether in tracker
TrackedOp(OpTracker *_tracker, const utime_t& initiated) :
xitem(this),
tracker(_tracker),
initiated_at(initiated),
lock("TrackedOp::lock"),
seq(0),
- warn_interval_multiplier(1)
+ warn_interval_multiplier(1),
+ is_tracked(false)
{
- tracker->register_inflight_op(&xitem);
- if (tracker->tracking_enabled)
+ RWLock::RLocker l(tracker->lock);
+ if (tracker->tracking_enabled) {
+ tracker->register_inflight_op(&xitem);
events.push_back(make_pair(initiated_at, "initiated"));
+ is_tracked = true;
+ }
}
/// output any type-specific data you want to get when dump() is called
{
if (command == "dump_ops_in_flight" ||
command == "ops") {
+ RWLock::RLocker l(op_tracker.lock);
if (!op_tracker.tracking_enabled) {
ss << "op_tracker tracking is not enabled";
} else {
op_tracker.dump_ops_in_flight(f);
}
} else if (command == "dump_historic_ops") {
+ RWLock::RLocker l(op_tracker.lock);
if (!op_tracker.tracking_enabled) {
ss << "op_tracker tracking is not enabled";
} else {
store->flush_journal();
} else if (command == "dump_ops_in_flight" ||
command == "ops") {
+ RWLock::RLocker l(op_tracker.lock);
if (!op_tracker.tracking_enabled) {
ss << "op_tracker tracking is not enabled";
} else {
op_tracker.dump_ops_in_flight(f);
}
} else if (command == "dump_historic_ops") {
+ RWLock::RLocker l(op_tracker.lock);
if (!op_tracker.tracking_enabled) {
ss << "op_tracker tracking is not enabled";
} else {