]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
TrackedOp: introduce an _unregistered() function to let implementations clean up
authorGreg Farnum <greg@inktank.com>
Tue, 22 Apr 2014 23:04:00 +0000 (16:04 -0700)
committerSamuel Just <sam.just@inktank.com>
Mon, 5 May 2014 21:57:52 +0000 (14:57 -0700)
Right now, the OpRequest uses it to clean up Message payload data.

Signed-off-by: Greg Farnum <greg@inktank.com>
src/common/TrackedOp.cc
src/common/TrackedOp.h
src/osd/OpRequest.cc
src/osd/OpRequest.h

index 0a2a2896dd7ca6eee40e2112f7e7c9ec2a8c9f8e..626b7700b8e4ccfd016212d6c332dac7d5e5e643 100644 (file)
@@ -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
 }
index 28f0874048eecf8a7e593da4be6141638e5f32eb..053cf8c043fea4151e637859948549469b2b6ced 100644 (file)
@@ -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(); }
index a6e908791081ecd141fb5130ed63ed25b1388b3c..a8b9b743754cb20265c28bd666119b8b333dec6e 100644 (file)
@@ -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;
 }
index ba6333fd4974c8ef039d7b27c871061099ebfca2..3840d0e6fb540db0ef8eaac50d88f849ef328bc4 100644 (file)
@@ -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; }