}
waiting_for_osdmap.push_back(op);
- op->mark_delayed();
+ op->mark_delayed("wait for new map");
}
if (osdmap->get_pg_acting_role(pgid, whoami) >= 0) {
dout(7) << "we are valid target for op, waiting" << dendl;
waiting_for_pg[pgid].push_back(op);
- op->mark_delayed();
+ op->mark_delayed("waiting for pg to exist locally");
return;
}
utime_t age = now - (*i)->received_time;
stringstream ss;
ss << "slow request " << age << " seconds old, received at " << (*i)->received_time
- << ": " << *((*i)->request) << " currently " << (*i)->state_string();
+ << ": " << *((*i)->request) << " currently "
+ << ((*i)->current.size() ? (*i)->current : (*i)->state_string());
warning_vector.push_back(ss.str());
// only those that have been shown will backoff
private:
list<pair<utime_t, string> > events;
+ string current;
Mutex lock;
OpTracker *tracker;
osd_reqid_t reqid;
void mark_queued_for_pg() {
mark_event("queued_for_pg");
+ current = "queued for pg";
hit_flag_points |= flag_queued_for_pg;
latest_flag_point = flag_queued_for_pg;
}
void mark_reached_pg() {
mark_event("reached_pg");
+ current = "reached pg";
hit_flag_points |= flag_reached_pg;
latest_flag_point = flag_reached_pg;
}
- void mark_delayed() {
+ void mark_delayed(string s) {
+ mark_event(s);
+ current = s;
hit_flag_points |= flag_delayed;
latest_flag_point = flag_delayed;
}
void mark_started() {
mark_event("started");
+ current = "started";
hit_flag_points |= flag_started;
latest_flag_point = flag_started;
}
- void mark_sub_op_sent() {
- mark_event("sub_op_sent");
+ void mark_sub_op_sent(string s) {
+ mark_event(s);
+ current = s;
hit_flag_points |= flag_sub_op_sent;
latest_flag_point = flag_sub_op_sent;
}
void mark_commit_sent() {
mark_event("commit_sent");
+ current = "commit sent";
hit_flag_points |= flag_commit_sent;
latest_flag_point = flag_commit_sent;
}
dout(7) << " queueing replay at " << m->get_version()
<< " for " << *m << dendl;
replay_queue[m->get_version()] = op;
- op->mark_delayed();
+ op->mark_delayed("waiting for replay");
return true;
}
}
pull(soid, v, g_conf->osd_client_op_priority);
}
waiting_for_missing_object[soid].push_back(op);
- op->mark_delayed();
+ op->mark_delayed("waiting for missing object");
}
void ReplicatedPG::wait_for_all_missing(OpRequestRef op)
recover_object_replicas(soid, v, g_conf->osd_client_op_priority);
}
waiting_for_degraded_object[soid].push_back(op);
- op->mark_delayed();
+ op->mark_delayed("waiting for degraded object");
}
void ReplicatedPG::wait_for_backfill_pos(OpRequestRef op)
if (op->may_write() && scrubber.write_blocked_by_scrub(head)) {
dout(20) << __func__ << ": waiting for scrub" << dendl;
waiting_for_active.push_back(op);
- op->mark_delayed();
+ op->mark_delayed("waiting for scrub");
return;
}
if (!ok) {
dout(10) << "do_op waiting on mode " << mode << dendl;
mode.waiting.push_back(op);
- op->mark_delayed();
+ op->mark_delayed("waiting on pg mode");
return;
}
}
dout(10) << " waiting for " << oldv << " to commit" << dendl;
waiting_for_ondisk[oldv].push_back(op); // always queue ondisk waiters, so that we can requeue if needed
- op->mark_delayed();
+ op->mark_delayed("waiting for ondisk");
}
return;
}
int acks_wanted = CEPH_OSD_FLAG_ACK | CEPH_OSD_FLAG_ONDISK;
+ if (ctx->op && acting.size() > 1) {
+ ostringstream ss;
+ ss << "waiting for subops from " << vector<int>(acting.begin() + 1, acting.end());
+ ctx->op->mark_sub_op_sent(ss.str());
+ }
for (unsigned i=1; i<acting.size(); i++) {
- if (ctx->op)
- ctx->op->mark_sub_op_sent();
int peer = acting[i];
pg_info_t &pinfo = peer_info[peer];