From: Xiubo Li Date: Tue, 7 Dec 2021 03:36:23 +0000 (+0800) Subject: client: fix possible inifinite loop when getting an ESTALE from MDS X-Git-Tag: v17.2.6~130^2~37^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=660aa2961ac90967af242c77f7462c9719ed5119;p=ceph.git client: fix possible inifinite loop when getting an ESTALE from MDS In the MDS side, when one inode is under purging or couldn't find in all the peer MDSes, it will return ESTALE error. So retrying it makes no sense in any other MDS. Or the client will be inifinite loop retrying. Fixes: https://tracker.ceph.com/issues/53504 Signed-off-by: Xiubo Li (cherry picked from commit aabd5e9c578c2c6da9542bcb935bc36678503359) --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 33253ed10c0d1..466ae760dd666 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -2536,25 +2536,6 @@ void Client::handle_client_reply(const MConstRef& reply) return; } - if (-CEPHFS_ESTALE == reply->get_result()) { // see if we can get to proper MDS - ldout(cct, 20) << "got ESTALE on tid " << request->tid - << " from mds." << request->mds << dendl; - request->send_to_auth = true; - request->resend_mds = choose_target_mds(request); - Inode *in = request->inode(); - std::map::const_iterator it; - if (request->resend_mds >= 0 && - request->resend_mds == request->mds && - (in == NULL || - (it = in->caps.find(request->resend_mds)) != in->caps.end() || - request->sent_on_mseq == it->second.mseq)) { - ldout(cct, 20) << "have to return ESTALE" << dendl; - } else { - request->caller_cond->notify_all(); - return; - } - } - ceph_assert(!request->reply); request->reply = reply; insert_trace(request, session.get());