From: John Spray Date: Wed, 13 Jan 2016 11:38:17 +0000 (+0000) Subject: mds: advance clientreplay when replying X-Git-Tag: v10.0.3~56^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F7216%2Fhead;p=ceph.git mds: advance clientreplay when replying ...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 --- diff --git a/src/mds/MDSRank.cc b/src/mds/MDSRank.cc index 7a1f0d42117..03b8429fb58 100644 --- a/src/mds/MDSRank.cc +++ b/src/mds/MDSRank.cc @@ -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; diff --git a/src/mds/MDSRank.h b/src/mds/MDSRank.h index 5cb8d2eec0c..5d334a21624 100644 --- a/src/mds/MDSRank.h +++ b/src/mds/MDSRank.h @@ -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;} diff --git a/src/mds/Server.cc b/src/mds/Server.cc index ba4fe1540bd..7efb2ffb5ba 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -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(); + } }