]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: skip forwarding request if the session were removed 52845/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:21:00 +0000 (11:21 +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 eba2265242b3bca46f7edce46bf31ff4906dc210..a852492a603ed434fe071359da17391bd71ede93 100644 (file)
@@ -9592,7 +9592,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 6eb581723b2e7ed83e47600124435b4fd69458e7..2ab94e74128b0c4204f3766de20a735dc275391e 100644 (file)
@@ -1468,10 +1468,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,
@@ -1483,6 +1485,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 cef9ccc6cfca0bf0a2f90976d894aae59249199e..83a33d13fff0a830dc4c5139d783abf17a10df63 100644 (file)
@@ -298,7 +298,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 105fcf1b26d2836c742beb82eecf926870389897..1b5d30afd1cd7400d516ffd30495dbcc20310aa2 100644 (file)
@@ -116,7 +116,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)