From 24de350d936e5ed70835d0ab2ad6b0b4f506123f Mon Sep 17 00:00:00 2001 From: John Spray Date: Wed, 13 Jan 2016 11:38:17 +0000 Subject: [PATCH] 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 --- src/mds/MDSRank.cc | 13 +++++++++++++ src/mds/MDSRank.h | 8 +------- src/mds/Server.cc | 8 ++++++-- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/mds/MDSRank.cc b/src/mds/MDSRank.cc index 7a1f0d421172..03b8429fb581 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 5cb8d2eec0cc..5d334a216241 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 ba4fe1540bda..7efb2ffb5ba7 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(); + } } -- 2.47.3