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: v18.0.0~746^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=aabd5e9c578c2c6da9542bcb935bc36678503359;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 --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 988a62e66d63..617778a44f3a 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -2598,25 +2598,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());