]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: exclude setfilelock requests when calculating oldest tid
authorYan, Zheng <zyan@redhat.com>
Fri, 22 May 2015 01:38:06 +0000 (09:38 +0800)
committerYan, Zheng <zyan@redhat.com>
Fri, 29 May 2015 01:45:03 +0000 (09:45 +0800)
setfilelock requests can block for a long time, which can prevent
client from advancing its oldest tid.

Signed-off-by: Yan, Zheng <zyan@redhat.com>
src/client/Client.cc
src/client/Client.h

index 24e135cdeb1fefb484b263f0ad8a26ea2f5a42e4..ea50991971e7677150630e9109de4e277e0a2bc9 100644 (file)
@@ -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<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()) {
@@ -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);
       }
     }
   }
index 5c0b9fcaa8cb78cbc8cc7a6b084fb6fd7aba9e8d..abfc7add6514186f37658f9d8024464e2eac25c6 100644 (file)
@@ -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<ceph_tid_t, MetaRequest*> 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);