]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: fix possible inifinite loop when getting an ESTALE from MDS 46557/head
authorXiubo Li <xiubli@redhat.com>
Tue, 7 Dec 2021 03:36:23 +0000 (11:36 +0800)
committerXiubo Li <xiubli@redhat.com>
Wed, 8 Jun 2022 01:54:54 +0000 (09:54 +0800)
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 <xiubli@redhat.com>
(cherry picked from commit aabd5e9c578c2c6da9542bcb935bc36678503359)

src/client/Client.cc

index 1250249b65c0b0f8223da1a1796c08a671cbbb7b..6ffcfdbe1d5d4e77d2f10f80ad17add893f619a4 100644 (file)
@@ -2496,25 +2496,6 @@ void Client::handle_client_reply(const MConstRef<MClientReply>& 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<mds_rank_t, Cap>::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);