]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mds: skip forwarding request if the session were removed
authorXiubo Li <xiubli@redhat.com>
Mon, 10 Jul 2023 03:48:55 +0000 (11:48 +0800)
committerXiubo Li <xiubli@redhat.com>
Tue, 11 Jul 2023 11:56:25 +0000 (19:56 +0800)
When forwarding the requests, the corresponding session could be
already closed.

https://tracker.ceph.com/issues/60625
Signed-off-by: Xiubo Li <xiubli@redhat.com>
src/mds/MDCache.cc
src/mds/MDSRank.cc
src/mds/MDSRank.h
src/mds/Server.cc

index 77303ddd8adabaee97d59ba94323f81893e9511c..e86b47bfb8b1780c9993f54c822652404e4bf75b 100644 (file)
@@ -9756,7 +9756,7 @@ void MDCache::request_forward(MDRequestRef& mdr, mds_rank_t who, int port)
     if (mdr->is_batch_head()) {
       mdr->release_batch_op()->forward(who);
     } else {
-      mds->forward_message_mds(mdr->release_client_request(), who);
+      mds->forward_message_mds(mdr, who);
     }
     if (mds->logger) mds->logger->inc(l_mds_forward);
   } else if (mdr->internal_op >= 0) {
index 5fe47198445ae51e96db261c9db90fe98170467f..8dd3f8e8e42d1db54f98b445081c1400dd1ed257 100644 (file)
@@ -1471,10 +1471,12 @@ void MDSRank::send_message_mds(const ref_t<Message>& m, const entity_addrvec_t &
   messenger->send_to_mds(ref_t<Message>(m).detach(), addr);
 }
 
-void MDSRank::forward_message_mds(const cref_t<MClientRequest>& m, mds_rank_t mds)
+void MDSRank::forward_message_mds(MDRequestRef& mdr, mds_rank_t mds)
 {
   ceph_assert(mds != whoami);
 
+  auto m = mdr->release_client_request();
+
   /*
    * don't actually forward if non-idempotent!
    * client has to do it.  although the MDS will ignore duplicate requests,
@@ -1486,6 +1488,10 @@ void MDSRank::forward_message_mds(const cref_t<MClientRequest>& m, mds_rank_t md
 
   // tell the client where it should go
   auto session = get_session(m);
+  if (!session) {
+    dout(1) << "no session found, failed to forward client request " << mdr << dendl;
+    return;
+  }
   auto f = make_message<MClientRequestForward>(m->get_tid(), mds, m->get_num_fwd()+1, client_must_resend);
   send_message_client(f, session);
 }
index 3e353cf962bc971a5de5b0403ca9f6a05c464cbe..1658fe17a5cd8d5b068c24bf6b93d1e7a7f52f8f 100644 (file)
@@ -322,7 +322,7 @@ class MDSRank {
 
     void send_message_mds(const ref_t<Message>& m, mds_rank_t mds);
     void send_message_mds(const ref_t<Message>& m, const entity_addrvec_t &addr);
-    void forward_message_mds(const cref_t<MClientRequest>& req, mds_rank_t mds);
+    void forward_message_mds(MDRequestRef& mdr, mds_rank_t mds);
     void send_message_client_counted(const ref_t<Message>& m, client_t client);
     void send_message_client_counted(const ref_t<Message>& m, Session* session);
     void send_message_client_counted(const ref_t<Message>& m, const ConnectionRef& connection);
index 94397d9f067e8c07eb0a3a30986940cb6ce16343..a6669f04cf46e197b86e094b74d4d867b27339ca 100644 (file)
@@ -118,7 +118,7 @@ public:
   }
   void _forward(mds_rank_t t) override {
     MDCache* mdcache = server->mdcache;
-    mdcache->mds->forward_message_mds(mdr->release_client_request(), t);
+    mdcache->mds->forward_message_mds(mdr, t);
     mdr->set_mds_stamp(ceph_clock_now());
     for (auto& m : batch_reqs) {
       if (!m->killed)