ss << "slow request " << age << " seconds old, received at "
<< op.get_initiated() << ": " << op.get_desc()
<< " currently "
- << (op.current ? op.current : op.state_string());
+ << op.state_string();
warnings.push_back(ss.str());
// only those that have been shown will backoff
op.warn_interval_multiplier *= 2;
#undef dout_context
#define dout_context tracker->cct
-void TrackedOp::mark_event_string(const string &event, utime_t stamp)
+void TrackedOp::mark_event(std::string_view event, utime_t stamp)
{
if (!state)
return;
{
std::lock_guard l(lock);
events.emplace_back(stamp, event);
- current = events.back().c_str();
- }
- dout(6) << " seq: " << seq
- << ", time: " << stamp
- << ", event: " << event
- << ", op: " << get_desc()
- << dendl;
- _event_marked();
-}
-
-void TrackedOp::mark_event(const char *event, utime_t stamp)
-{
- if (!state)
- return;
-
- {
- std::lock_guard l(lock);
- events.emplace_back(stamp, event);
- current = event;
}
dout(6) << " seq: " << seq
<< ", time: " << stamp
struct Event {
utime_t stamp;
- string str;
- const char *cstr = nullptr;
+ std::string str;
- Event(utime_t t, const string& s) : stamp(t), str(s) {}
- Event(utime_t t, const char *s) : stamp(t), cstr(s) {}
+ Event(utime_t t, std::string_view s) : stamp(t), str(s) {}
int compare(const char *s) const {
- if (cstr)
- return strcmp(cstr, s);
- else
- return str.compare(s);
+ return str.compare(s);
}
const char *c_str() const {
- if (cstr)
- return cstr;
- else
- return str.c_str();
+ return str.c_str();
}
void dump(Formatter *f) const {
f->dump_stream("time") << stamp;
- f->dump_string("event", c_str());
+ f->dump_string("event", str);
}
};
vector<Event> events; ///< list of events and their times
mutable ceph::mutex lock = ceph::make_mutex("TrackedOp::lock"); ///< to protect the events list
- const char *current = 0; ///< the current state the event is in
uint64_t seq = 0; ///< a unique value set by the OpTracker
uint32_t warn_interval_multiplier = 1; //< limits output of a given op warning
return ceph_clock_now() - get_initiated();
}
- void mark_event_string(const string &event,
- utime_t stamp=ceph_clock_now());
- void mark_event(const char *event,
- utime_t stamp=ceph_clock_now());
+ void mark_event(std::string_view event, utime_t stamp=ceph_clock_now());
void mark_nowarn() {
warn_interval_multiplier = 0;
}
- virtual const char *state_string() const {
+ virtual std::string_view state_string() const {
std::lock_guard l(lock);
- return events.rbegin()->c_str();
+ return events.empty() ? std::string_view() : std::string_view(events.rbegin()->str);
}
void dump(utime_t now, Formatter *f) const;
}
void Server::submit_mdlog_entry(LogEvent *le, MDSLogContextBase *fin, MDRequestRef& mdr,
- const char *event)
+ std::string_view event)
{
if (mdr) {
string event_str("submit entry: ");
event_str += event;
- mdr->mark_event_string(event_str);
+ mdr->mark_event(event_str);
}
mdlog->submit_entry(le, fin);
}
void journal_and_reply(MDRequestRef& mdr, CInode *tracei, CDentry *tracedn,
LogEvent *le, MDSLogContextBase *fin);
void submit_mdlog_entry(LogEvent *le, MDSLogContextBase *fin,
- MDRequestRef& mdr, const char *evt);
+ MDRequestRef& mdr, std::string_view event);
void dispatch_client_request(MDRequestRef& mdr);
void perf_gather_op_latency(const MClientRequest::const_ref &req, utime_t lat);
void early_reply(MDRequestRef& mdr, CInode *tracei, CDentry *tracedn);
void mark_svc_event(const string &service, const string &event) {
string s = service;
s.append(":").append(event);
- mark_event_string(s);
+ mark_event(s);
}
void mark_logmon_event(const string &event) {
void mark_op_event(const string &event) {
if (op)
- op->mark_event_string(event);
+ op->mark_event(event);
}
virtual void _finish(int r) = 0;
*/
void wait_for_finished_proposal(MonOpRequestRef op, Context *c) {
if (op)
- op->mark_event_string(service_name + ":wait_for_finished_proposal");
+ op->mark_event(service_name + ":wait_for_finished_proposal");
waiting_for_finished_proposal.push_back(c);
}
void wait_for_finished_proposal_ctx(Context *c) {
*/
void wait_for_active(MonOpRequestRef op, Context *c) {
if (op)
- op->mark_event_string(service_name + ":wait_for_active");
+ op->mark_event(service_name + ":wait_for_active");
if (!is_proposing()) {
paxos->wait_for_active(op, c);
* happens to be readable at that specific point in time.
*/
if (op)
- op->mark_event_string(service_name + ":wait_for_readable");
+ op->mark_event(service_name + ":wait_for_readable");
if (is_proposing() ||
ver > get_last_committed() ||
wait_for_finished_proposal(op, c);
else {
if (op)
- op->mark_event_string(service_name + ":wait_for_readable/paxos");
+ op->mark_event(service_name + ":wait_for_readable/paxos");
paxos->wait_for_readable(op, c);
}
*/
void wait_for_writeable(MonOpRequestRef op, Context *c) {
if (op)
- op->mark_event_string(service_name + ":wait_for_writeable");
+ op->mark_event(service_name + ":wait_for_writeable");
if (is_proposing())
wait_for_finished_proposal(op, c);
#ifdef WITH_LTTNG
uint8_t old_flags = hit_flag_points;
#endif
- mark_event_string(s);
+ mark_event(s);
hit_flag_points |= flag;
latest_flag_point = flag;
tracepoint(oprequest, mark_flag_point, reqid.name._type,
}
}
- const char *state_string() const override {
+ std::string_view state_string() const override {
switch(latest_flag_point) {
case flag_queued_for_pg: return "queued for pg";
case flag_reached_pg: return "reached pg";
ceph_assert(ip_op.waiting_for_commit.count(from));
ip_op.waiting_for_commit.erase(from);
if (ip_op.op) {
- ip_op.op->mark_event_string("sub_op_commit_rec");
+ ip_op.op->mark_event("sub_op_commit_rec");
ip_op.op->pg_trace.event("sub_op_commit_rec");
}
} else {