tick_event(NULL),
monclient(mc), messenger(m), whoami(m->get_myname().num()),
cap_epoch_barrier(0),
+ last_tid(0), oldest_tid(0), last_flush_seq(0),
initialized(false), authenticated(false),
mounted(false), unmounting(false),
local_osd(-1), local_osd_epoch(0),
{
monclient->set_messenger(m);
- last_tid = 0;
- last_flush_seq = 0;
-
cwd = NULL;
//
// make note
mds_requests[tid] = request->get();
+ if (oldest_tid == 0 && request->get_op() != CEPH_MDS_OP_SETFILELOCK)\
+ oldest_tid = tid;
+
if (uid < 0) {
uid = geteuid();
gid = getegid();
ldout(cct, 20) << __func__ << " injecting fixed oldest_client_tid(1)" << dendl;
request->set_oldest_client_tid(1);
} else {
- if (!mds_requests.empty())
- request->set_oldest_client_tid(mds_requests.begin()->first);
- else
- request->set_oldest_client_tid(tid); // this one is the oldest.
+ request->set_oldest_client_tid(oldest_tid);
}
// hack target mds?
assert(request->aborted);
assert(!request->got_unsafe);
request->item.remove_myself();
- mds_requests.erase(tid);
- put_request(request); // request map's
+ unregister_request(request);
put_request(request); // ours
return -ETIMEDOUT;
}
return r;
}
+void Client::unregister_request(MetaRequest *req)
+{
+ mds_requests.erase(req->tid);
+ if (req->tid == oldest_tid) {
+ map<ceph_tid_t, MetaRequest*>::iterator p = mds_requests.upper_bound(oldest_tid);
+ while (true) {
+ if (p == mds_requests.end()) {
+ oldest_tid = 0;
+ break;
+ }
+ if (p->second->get_op() != CEPH_MDS_OP_SETFILELOCK) {
+ oldest_tid = p->first;
+ break;
+ }
+ ++p;
+ }
+ }
+ put_request(req);
+}
+
void Client::put_request(MetaRequest *request)
{
if (request->_put()) {
request->unsafe_item.remove_myself();
}
request->item.remove_myself();
- mds_requests.erase(tid);
- put_request(request);
+ unregister_request(request);
}
if (unmounting)
mount_cond.Signal();
if (req->got_unsafe) {
lderr(cct) << "kick_requests_closed removing unsafe request " << req->get_tid() << dendl;
req->unsafe_item.remove_myself();
- mds_requests.erase(req->get_tid());
- put_request(req);
+ unregister_request(req);
}
}
}
void resend_unsafe_requests(MetaSession *s);
// mds requests
- ceph_tid_t last_tid, last_flush_seq;
+ ceph_tid_t last_tid;
+ ceph_tid_t oldest_tid; // oldest incomplete mds request, excluding setfilelock requests
+ ceph_tid_t last_flush_seq;
map<ceph_tid_t, MetaRequest*> mds_requests;
void dump_mds_requests(Formatter *f);
Inode **ptarget = 0, bool *pcreated = 0,
int use_mds=-1, bufferlist *pdirbl=0);
void put_request(MetaRequest *request);
+ void unregister_request(MetaRequest *request);
int verify_reply_trace(int r, MetaRequest *request, MClientReply *reply,
Inode **ptarget, bool *pcreated, int uid, int gid);