]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: fix possible inifinite loop when getting an ESTALE from MDS 46558/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:56:16 +0000 (09:56 +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 33253ed10c0d1ae5e726e367ee39a1f157d3277b..466ae760dd666b1cc91d68d0920cc68edba58686 100644 (file)
@@ -2536,25 +2536,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.get());