utime_t age = now - i->get_initiated();
stringstream ss;
ss << "slow request " << age << " seconds old, received at "
- << i->get_initiated() << ": ";
- i->_dump_op_descriptor_unlocked(ss);
- ss << " currently "
+ << i->get_initiated() << ": " << i->get_desc()
+ << " currently "
<< (i->current.size() ? i->current : i->state_string());
warning_vector.push_back(ss.str());
}
}
-void OpTracker::mark_event(TrackedOp *op, const char *evt,
- utime_t time)
-{
- if (!op->state)
- return;
- dout(5);
- *_dout << "seq: " << op->seq
- << ", time: " << time << ", event: " << evt
- << ", op: ";
- op->_dump_op_descriptor_unlocked(*_dout);
- *_dout << dendl;
-}
+#undef dout_context
+#define dout_context tracker->cct
void TrackedOp::mark_event_string(const string &event, utime_t stamp)
{
Mutex::Locker l(lock);
events.push_back(Event(stamp, event));
}
- tracker->mark_event(this, event.c_str());
+ dout(5) << "seq: " << seq
+ << ", time: " << stamp
+ << ", event: " << event
+ << ", op: " << get_desc()
+ << dendl;
_event_marked();
}
{
Mutex::Locker l(lock);
events.push_back(Event(stamp, event));
+ current = event;
}
- tracker->mark_event(this, event);
+ dout(5) << "seq: " << seq
+ << ", time: " << stamp
+ << ", event: " << event
+ << ", op: " << get_desc()
+ << dendl;
_event_marked();
}
// Ignore if still in the constructor
if (!state)
return;
- stringstream name;
- _dump_op_descriptor_unlocked(name);
- f->dump_string("description", name.str().c_str()); // this TrackedOp
+ f->dump_string("description", get_desc());
f->dump_stream("initiated_at") << get_initiated();
f->dump_float("age", now - get_initiated());
f->dump_float("duration", get_duration());
bool check_ops_in_flight(std::vector<string> &warning_strings,
int *slow = NULL);
- void mark_event(TrackedOp *op, const char *evt,
- utime_t time = ceph_clock_now());
-
void on_shutdown() {
history.on_shutdown();
}
};
atomic<int> state = {STATE_UNTRACKED};
+ mutable string desc_str; ///< protected by lock
+ mutable const char *desc = nullptr; ///< readable without lock
+
TrackedOp(OpTracker *_tracker, const utime_t& initiated) :
tracker(_tracker),
initiated_at(initiated),
}
}
+ const char *get_desc() const {
+ if (!desc) {
+ Mutex::Locker l(lock);
+ _gen_desc();
+ }
+ return desc;
+ }
+ void _gen_desc() const {
+ ostringstream ss;
+ _dump_op_descriptor_unlocked(ss);
+ desc_str = ss.str();
+ desc = desc_str.c_str();
+ }
+ void reset_desc() {
+ desc = nullptr;
+ }
+
const utime_t& get_initiated() const {
return initiated_at;
}
partial_decode_needed = false;
}
- void finish_decode() {
+ bool finish_decode() {
assert(!partial_decode_needed); // partial decoding required
if (!final_decode_needed)
- return; // Message is already final decoded
+ return false; // Message is already final decoded
assert(header.version >= 7);
::decode(client_inc, p);
OSDOp::split_osd_op_vector_in_data(ops, data);
final_decode_needed = false;
+ return true;
}
void clear_buffers() {