]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: advance clientreplay when replying 7216/head
authorJohn Spray <john.spray@redhat.com>
Wed, 13 Jan 2016 11:38:17 +0000 (11:38 +0000)
committerJohn Spray <john.spray@redhat.com>
Wed, 13 Jan 2016 12:04:33 +0000 (12:04 +0000)
...not just at the end of _dispatch.  Often we reply
to clients (i.e. complete a request) outside of
_dispatch, and currently in these cases we fail
to check for clientreplay completion (only hitting
that next time someone talks to _dispatch)

Fixes: #14357
Signed-off-by: John Spray <john.spray@redhat.com>
src/mds/MDSRank.cc
src/mds/MDSRank.h
src/mds/Server.cc

index 7a1f0d42117215c3cf6a45dbb422ef680cf4b9d9..03b8429fb581aa3961374087642ac07f37f192e4 100644 (file)
@@ -1236,6 +1236,19 @@ void MDSRank::clientreplay_start()
   queue_one_replay();
 }
 
+bool MDSRank::queue_one_replay()
+{
+  if (replay_queue.empty()) {
+    if (mdcache->get_num_client_requests() == 0) {
+      clientreplay_done();
+    }
+    return false;
+  }
+  queue_waiter(replay_queue.front());
+  replay_queue.pop_front();
+  return true;
+}
+
 void MDSRank::clientreplay_done()
 {
   dout(1) << "clientreplay_done" << dendl;
index 5cb8d2eec0cc6c7f3c998f7cc2b198fa935ec21d..5d334a21624108cd200065dad8b3f3d41d226f1f 100644 (file)
@@ -347,13 +347,7 @@ class MDSRank {
       replay_queue.push_back(c);
     }
 
-    bool queue_one_replay() {
-      if (replay_queue.empty())
-        return false;
-      queue_waiter(replay_queue.front());
-      replay_queue.pop_front();
-      return true;
-    }
+    bool queue_one_replay();
 
     void set_osd_epoch_barrier(epoch_t e);
     epoch_t get_osd_epoch_barrier() const {return osd_epoch_barrier;}
index ba4fe1540bda439eaae299892c056a68862a903b..7efb2ffb5ba7d28ce48e1bd039062548b2e49a9d 100644 (file)
@@ -1165,8 +1165,7 @@ void Server::reply_client_request(MDRequestRef& mdr, MClientReply *reply)
     client_con->send_message(reply);
   }
 
-  if (mdr->has_completed && mds->is_clientreplay())
-    mds->queue_one_replay();
+  const bool completed = mdr->has_completed;
 
   // clean up request
   mdcache->request_finish(mdr);
@@ -1177,6 +1176,11 @@ void Server::reply_client_request(MDRequestRef& mdr, MClientReply *reply)
       tracedn->get_projected_linkage()->is_remote()) {
     mdcache->eval_remote(tracedn);
   }
+
+  // Advance clientreplay process if we're in it
+  if (completed && mds->is_clientreplay()) {
+    mds->queue_one_replay();
+  }
 }