From: Greg Farnum Date: Tue, 7 Jan 2014 18:05:57 +0000 (-0800) Subject: TrackedOp: optionally disable the actual tracking operations X-Git-Tag: v0.78~231^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=8e194888593d6d7e379b1142224383c27bcc191d;p=ceph.git TrackedOp: optionally disable the actual tracking operations To avoid op contention on global locks, optionally disable the op tracking. Create an "osd_op_tracker" config to control it, then in the OpTracker constructor set a bool. If it's set, the OpTracker doesn't actually maintain its lists and avoids taking any locks. We maintain the within-op tracking for now since it shouldn't contend, but we can turn that off later on if we like. Signed-off-by: Greg Farnum --- diff --git a/src/common/TrackedOp.cc b/src/common/TrackedOp.cc index d1dbc1e71354..4c940d308b13 100644 --- a/src/common/TrackedOp.cc +++ b/src/common/TrackedOp.cc @@ -109,6 +109,8 @@ void OpTracker::dump_ops_in_flight(Formatter *f) void OpTracker::register_inflight_op(xlist::item *i) { + if (!tracking_enabled) + return; Mutex::Locker locker(ops_in_flight_lock); ops_in_flight.push_back(i); ops_in_flight.back()->seq = seq++; @@ -116,18 +118,22 @@ void OpTracker::register_inflight_op(xlist::item *i) void OpTracker::unregister_inflight_op(TrackedOp *i) { + i->request->clear_data(); + + if (!tracking_enabled) + return; + Mutex::Locker locker(ops_in_flight_lock); assert(i->xitem.get_list() == &ops_in_flight); utime_t now = ceph_clock_now(cct); i->xitem.remove_myself(); - i->request->clear_data(); history.insert(now, TrackedOpRef(i)); } bool OpTracker::check_ops_in_flight(std::vector &warning_vector) { Mutex::Locker locker(ops_in_flight_lock); - if (!ops_in_flight.size()) + if (!ops_in_flight.size()) // this covers tracking_enabled, too return false; utime_t now = ceph_clock_now(cct); @@ -217,6 +223,8 @@ void OpTracker::get_age_ms_histogram(pow2_hist_t *h) void OpTracker::mark_event(TrackedOp *op, const string &dest) { + if (!tracking_enabled) + return; utime_t now = ceph_clock_now(cct); return _mark_event(op, dest, now); } @@ -232,6 +240,11 @@ void OpTracker::_mark_event(TrackedOp *op, const string &evt, } void OpTracker::RemoveOnDelete::operator()(TrackedOp *op) { + if (!tracker->tracking_enabled) { + op->request->clear_data(); + delete op; + return; + } op->mark_event("done"); tracker->unregister_inflight_op(op); // Do not delete op, unregister_inflight_op took control diff --git a/src/common/TrackedOp.h b/src/common/TrackedOp.h index 99184821e2a3..97c657424e8b 100644 --- a/src/common/TrackedOp.h +++ b/src/common/TrackedOp.h @@ -67,9 +67,11 @@ class OpTracker { int log_threshold; public: + bool tracking_enabled; CephContext *cct; - OpTracker(CephContext *cct_) : seq(0), ops_in_flight_lock("OpTracker mutex"), - complaint_time(0), log_threshold(0), cct(cct_) {} + OpTracker(CephContext *cct_, bool tracking) : seq(0), ops_in_flight_lock("OpTracker mutex"), + complaint_time(0), log_threshold(0), + tracking_enabled(tracking), cct(cct_) {} void set_complaint_and_threshold(float time, int threshold) { complaint_time = time; log_threshold = threshold; diff --git a/src/common/config_opts.h b/src/common/config_opts.h index 049b60d754ba..4cb596e9bd00 100644 --- a/src/common/config_opts.h +++ b/src/common/config_opts.h @@ -501,6 +501,7 @@ OPTION(osd_debug_op_order, OPT_BOOL, false) OPTION(osd_debug_verify_snaps_on_info, OPT_BOOL, false) OPTION(osd_debug_verify_stray_on_activate, OPT_BOOL, false) OPTION(osd_debug_skip_full_check_in_backfill_reservation, OPT_BOOL, false) +OPTION(osd_enable_op_tracker, OPT_BOOL, true) // enable/disable OSD op tracking OPTION(osd_op_history_size, OPT_U32, 20) // Max number of completed ops to track OPTION(osd_op_history_duration, OPT_U32, 600) // Oldest completed op to track OPTION(osd_target_transaction_size, OPT_INT, 30) // to adjust various transactions that batch smaller items diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 38bb17194a36..8e870c3bc0f3 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -818,7 +818,7 @@ OSD::OSD(CephContext *cct_, ObjectStore *store_, heartbeat_dispatcher(this), stat_lock("OSD::stat_lock"), finished_lock("OSD::finished_lock"), - op_tracker(cct), + op_tracker(cct, cct->_conf->osd_enable_op_tracker), test_ops_hook(NULL), op_wq(this, cct->_conf->osd_op_thread_timeout, &op_tp), peering_wq(this, cct->_conf->osd_op_thread_timeout, &op_tp),