Give it to the OpRequest (currently, the only TrackedOp implementation).
Signed-off-by: Greg Farnum <greg@inktank.com>
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());
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) {
friend class OpTracker;
xlist<TrackedOp*>::item xitem;
protected:
- Message *request; /// the logical request we are tracking
OpTracker *tracker; /// the tracker we are associated with
utime_t initiated_at;
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"),
virtual void _unregistered() {};
public:
- virtual ~TrackedOp() { assert(request); request->put(); }
+ virtual ~TrackedOp() {}
const utime_t& get_initiated() const {
return initiated_at;
(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 {
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
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;
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; }