From: Yan, Zheng Date: Fri, 22 May 2015 01:38:06 +0000 (+0800) Subject: client: exclude setfilelock requests when calculating oldest tid X-Git-Tag: v9.0.2~39^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ae0863888da4b965f5d75320ccb414a596f338d5;p=ceph.git client: exclude setfilelock requests when calculating oldest tid setfilelock requests can block for a long time, which can prevent client from advancing its oldest tid. Signed-off-by: Yan, Zheng --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 24e135cdeb1f..ea50991971e7 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -174,6 +174,7 @@ Client::Client(Messenger *m, MonClient *mc) 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), @@ -182,9 +183,6 @@ Client::Client(Messenger *m, MonClient *mc) { monclient->set_messenger(m); - last_tid = 0; - last_flush_seq = 0; - cwd = NULL; // @@ -1477,6 +1475,9 @@ int Client::make_request(MetaRequest *request, // 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(); @@ -1488,10 +1489,7 @@ int Client::make_request(MetaRequest *request, 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? @@ -1564,8 +1562,7 @@ int Client::make_request(MetaRequest *request, 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; } @@ -1602,6 +1599,26 @@ int Client::make_request(MetaRequest *request, return r; } +void Client::unregister_request(MetaRequest *req) +{ + mds_requests.erase(req->tid); + if (req->tid == oldest_tid) { + map::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()) { @@ -2097,8 +2114,7 @@ void Client::handle_client_reply(MClientReply *reply) request->unsafe_item.remove_myself(); } request->item.remove_myself(); - mds_requests.erase(tid); - put_request(request); + unregister_request(request); } if (unmounting) mount_cond.Signal(); @@ -2468,8 +2484,7 @@ void Client::kick_requests_closed(MetaSession *session) 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); } } } diff --git a/src/client/Client.h b/src/client/Client.h index 5c0b9fcaa8cb..abfc7add6514 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -290,7 +290,9 @@ public: 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 mds_requests; void dump_mds_requests(Formatter *f); @@ -301,6 +303,7 @@ public: 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);