From: Xiubo Li Date: Mon, 10 Jul 2023 03:48:55 +0000 (+0800) Subject: mds: skip forwarding request if the session were removed X-Git-Tag: v18.2.1~263^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a6b11113cb149d9f1a7d2dc437d7ef2226d15e87;p=ceph.git mds: skip forwarding request if the session were removed When forwarding the requests, the corresponding session could be already closed. https://tracker.ceph.com/issues/60625 Signed-off-by: Xiubo Li (cherry picked from commit d0bfbbea44e22fc545363cd6af47d28e18e353b0) --- diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index a2aea7a49ab5..64fbfe19ff8c 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -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) { diff --git a/src/mds/MDSRank.cc b/src/mds/MDSRank.cc index a3191cb8072d..9213a4ec7ff2 100644 --- a/src/mds/MDSRank.cc +++ b/src/mds/MDSRank.cc @@ -1470,10 +1470,12 @@ void MDSRank::send_message_mds(const ref_t& m, const entity_addrvec_t & messenger->send_to_mds(ref_t(m).detach(), addr); } -void MDSRank::forward_message_mds(const cref_t& 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, @@ -1485,6 +1487,10 @@ void MDSRank::forward_message_mds(const cref_t& 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(m->get_tid(), mds, m->get_num_fwd()+1, client_must_resend); send_message_client(f, session); } diff --git a/src/mds/MDSRank.h b/src/mds/MDSRank.h index c52c837083b9..21abc9ac9bdc 100644 --- a/src/mds/MDSRank.h +++ b/src/mds/MDSRank.h @@ -322,7 +322,7 @@ class MDSRank { void send_message_mds(const ref_t& m, mds_rank_t mds); void send_message_mds(const ref_t& m, const entity_addrvec_t &addr); - void forward_message_mds(const cref_t& req, mds_rank_t mds); + void forward_message_mds(MDRequestRef& mdr, mds_rank_t mds); void send_message_client_counted(const ref_t& m, client_t client); void send_message_client_counted(const ref_t& m, Session* session); void send_message_client_counted(const ref_t& m, const ConnectionRef& connection); diff --git a/src/mds/Server.cc b/src/mds/Server.cc index bf12cb7e2c8f..ff47972d5bd4 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -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)