request->resend_mds = use_mds;
while (1) {
+ if (request->aborted)
+ break;
+
// set up wait cond
Cond caller_cond;
request->caller_cond = &caller_cond;
break;
}
+ if (!request->reply) {
+ assert(request->aborted);
+ assert(!request->got_unsafe);
+ request->item.remove_myself();
+ mds_requests.erase(tid);
+ put_request(request); // request map's
+ put_request(request); // ours
+ return -ETIMEDOUT;
+ }
+
// got it!
MClientReply *reply = request->reply;
request->reply = NULL;
utime_t now = ceph_clock_now(cct);
+ if (!mounted && !mds_requests.empty()) {
+ MetaRequest *req = mds_requests.begin()->second;
+ if (req->op_stamp + cct->_conf->client_mount_timeout < now) {
+ req->aborted = true;
+ if (req->caller_cond) {
+ req->kick = true;
+ req->caller_cond->Signal();
+ }
+ signal_cond_list(waiting_for_mdsmap);
+ for (map<mds_rank_t,MetaSession*>::iterator p = mds_sessions.begin();
+ p != mds_sessions.end();
+ ++p)
+ signal_context_list(p->second->waiting_for_open);
+ }
+ }
+
if (mdsmap->get_epoch()) {
// renew caps?
utime_t el = now - last_cap_renew;
MClientReply *reply; // the reply
bool kick;
+ bool aborted;
// readdir result
frag_t readdir_frag;
mds(-1), resend_mds(-1), send_to_auth(false), sent_on_mseq(0),
num_fwd(0), retry_attempt(0),
ref(1), reply(0),
- kick(false),
+ kick(false), aborted(false),
readdir_offset(0), readdir_end(false), readdir_num(0),
got_unsafe(false), item(this), unsafe_item(this),
lock("MetaRequest lock"),