]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: skip forwarding request if the session were removed 52844/head
authorXiubo Li <xiubli@redhat.com>
Mon, 10 Jul 2023 03:48:55 +0000 (11:48 +0800)
committerXiubo Li <xiubli@redhat.com>
Mon, 7 Aug 2023 03:19:50 +0000 (11:19 +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>
(cherry picked from commit d0bfbbea44e22fc545363cd6af47d28e18e353b0)

src/mds/MDCache.cc
src/mds/MDSRank.cc
src/mds/MDSRank.h
src/mds/Server.cc

index dc06d059670ab03fe8903872e00b287a91032762..95dd8484b3323bb709493740af3b8940338de25a 100644 (file)
@@ -9581,7 +9581,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 2f496bec59654436eaec74524261f5c44ec78f5c..7ae94971e3dd1524271b27d632508c661649b6f4 100644 (file)
@@ -1465,10 +1465,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,
@@ -1480,6 +1482,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 847e949eabbe3b8c99af565312cc45a365cea7dc..d674917b48a76bfd1b2f04e735ae556b865ed13c 100644 (file)
@@ -323,7 +323,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 5e67d931fc3048acd75a0e8144704bed880ce10f..0aa6bd21824129bf027cae0539679fe1b7c7b526 100644 (file)
@@ -115,7 +115,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)