From: Greg Farnum Date: Tue, 22 Apr 2014 22:53:53 +0000 (-0700) Subject: TrackedOp: do not track a Message X-Git-Tag: v0.82~82^2~13 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=95fc551a4b7c045387dbd6753d3e0eff2036cfbf;p=ceph.git TrackedOp: do not track a Message Give it to the OpRequest (currently, the only TrackedOp implementation). Signed-off-by: Greg Farnum --- diff --git a/src/common/TrackedOp.cc b/src/common/TrackedOp.cc index 626b7700b8e4..7aa6a000af1f 100644 --- a/src/common/TrackedOp.cc +++ b/src/common/TrackedOp.cc @@ -167,8 +167,10 @@ bool OpTracker::check_ops_in_flight(std::vector &warning_vector) utime_t age = now - (*i)->get_initiated(); stringstream ss; - ss << "slow request " << age << " seconds old, received at " << (*i)->get_initiated() - << ": " << *((*i)->request) << " currently " + ss << "slow request " << age << " seconds old, received at " + << (*i)->get_initiated() << ": "; + (*i)->_dump_op_descriptor(ss); + ss << " currently " << ((*i)->current.size() ? (*i)->current : (*i)->state_string()); warning_vector.push_back(ss.str()); @@ -231,10 +233,12 @@ void OpTracker::_mark_event(TrackedOp *op, const string &evt, utime_t time) { Mutex::Locker locker(ops_in_flight_lock); + stringstream ss; + op->_dump_op_descriptor(ss); dout(5) << //"reqid: " << op->get_reqid() << ", seq: " << op->seq << ", time: " << time << ", event: " << evt - << ", request: " << *op->request << dendl; + << ", op: " << ss.str() << dendl; } void OpTracker::RemoveOnDelete::operator()(TrackedOp *op) { diff --git a/src/common/TrackedOp.h b/src/common/TrackedOp.h index 053cf8c043fe..6e22ec304cff 100644 --- a/src/common/TrackedOp.h +++ b/src/common/TrackedOp.h @@ -127,7 +127,6 @@ private: friend class OpTracker; xlist::item xitem; protected: - Message *request; /// the logical request we are tracking OpTracker *tracker; /// the tracker we are associated with utime_t initiated_at; @@ -138,9 +137,8 @@ protected: uint32_t warn_interval_multiplier; // limits output of a given op warning - TrackedOp(Message *req, OpTracker *_tracker, const utime_t& initiated) : + TrackedOp(OpTracker *_tracker, const utime_t& initiated) : xitem(this), - request(req), tracker(_tracker), initiated_at(initiated), lock("TrackedOp::lock"), @@ -160,7 +158,7 @@ protected: virtual void _unregistered() {}; public: - virtual ~TrackedOp() { assert(request); request->put(); } + virtual ~TrackedOp() {} const utime_t& get_initiated() const { return initiated_at; @@ -171,7 +169,6 @@ public: (events.rbegin()->first - get_initiated()) : 0.0; } - Message *get_req() const { return request; } void mark_event(const string &event); virtual const char *state_string() const { diff --git a/src/osd/OpRequest.cc b/src/osd/OpRequest.cc index a8b9b743754c..603f85830667 100644 --- a/src/osd/OpRequest.cc +++ b/src/osd/OpRequest.cc @@ -15,8 +15,8 @@ OpRequest::OpRequest(Message *req, OpTracker *tracker) : - TrackedOp(req, tracker, req->get_recv_stamp()), - rmw_flags(0), + TrackedOp(tracker, req->get_recv_stamp()), + rmw_flags(0), request(req), hit_flag_points(0), latest_flag_point(0) { if (req->get_priority() < tracker->cct->_conf->osd_client_op_priority) { // don't warn as quickly for low priority ops diff --git a/src/osd/OpRequest.h b/src/osd/OpRequest.h index 3840d0e6fb54..36a17321eed3 100644 --- a/src/osd/OpRequest.h +++ b/src/osd/OpRequest.h @@ -75,6 +75,7 @@ struct OpRequest : public TrackedOp { void _dump(utime_t now, Formatter *f) const; private: + Message *request; /// the logical request we are tracking osd_reqid_t reqid; uint8_t hit_flag_points; uint8_t latest_flag_point; @@ -93,6 +94,10 @@ protected: void _unregistered(); public: + ~OpRequest() { + request->put(); + } + Message *get_req() const { return request; } bool been_queued_for_pg() { return hit_flag_points & flag_queued_for_pg; } bool been_reached_pg() { return hit_flag_points & flag_reached_pg; } bool been_delayed() { return hit_flag_points & flag_delayed; }