From: Greg Farnum Date: Tue, 22 Apr 2014 23:04:00 +0000 (-0700) Subject: TrackedOp: introduce an _unregistered() function to let implementations clean up X-Git-Tag: v0.82~82^2~14 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=5a3efda704d49ecfaf68be3e8101e71bf8602b2e;p=ceph.git TrackedOp: introduce an _unregistered() function to let implementations clean up Right now, the OpRequest uses it to clean up Message payload data. Signed-off-by: Greg Farnum --- diff --git a/src/common/TrackedOp.cc b/src/common/TrackedOp.cc index 0a2a2896dd7c..626b7700b8e4 100644 --- a/src/common/TrackedOp.cc +++ b/src/common/TrackedOp.cc @@ -121,9 +121,6 @@ void OpTracker::unregister_inflight_op(TrackedOp *i) // caller checks; assert(tracking_enabled); - i->request->clear_data(); - i->request->clear_payload(); - Mutex::Locker locker(ops_in_flight_lock); assert(i->xitem.get_list() == &ops_in_flight); utime_t now = ceph_clock_now(cct); @@ -241,12 +238,12 @@ void OpTracker::_mark_event(TrackedOp *op, const string &evt, } void OpTracker::RemoveOnDelete::operator()(TrackedOp *op) { + op->mark_event("done"); + op->_unregistered(); 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 28f0874048ee..053cf8c043fe 100644 --- a/src/common/TrackedOp.h +++ b/src/common/TrackedOp.h @@ -156,6 +156,8 @@ protected: virtual void _event_marked() {} /// return a unique descriptor of the Op; eg the message it's attached to virtual void _dump_op_descriptor(ostream& stream) const = 0; + /// called when the last non-OpTracker reference is dropped + virtual void _unregistered() {}; public: virtual ~TrackedOp() { assert(request); request->put(); } diff --git a/src/osd/OpRequest.cc b/src/osd/OpRequest.cc index a6e908791081..a8b9b743754c 100644 --- a/src/osd/OpRequest.cc +++ b/src/osd/OpRequest.cc @@ -60,6 +60,11 @@ void OpRequest::_dump_op_descriptor(ostream& stream) const get_req()->print(stream); } +void OpRequest::_unregistered() { + request->clear_data(); + request->clear_payload(); +} + bool OpRequest::check_rmw(int flag) { return rmw_flags & flag; } diff --git a/src/osd/OpRequest.h b/src/osd/OpRequest.h index ba6333fd4974..3840d0e6fb54 100644 --- a/src/osd/OpRequest.h +++ b/src/osd/OpRequest.h @@ -90,6 +90,7 @@ private: protected: void _dump_op_descriptor(ostream& stream) const; + void _unregistered(); public: bool been_queued_for_pg() { return hit_flag_points & flag_queued_for_pg; }