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: v16.2.14~17^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=b0126c090c680975753a170ade69cc2d8afd02d2;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 dc06d059670ab..95dd8484b3323 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -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) { diff --git a/src/mds/MDSRank.cc b/src/mds/MDSRank.cc index 2f496bec59654..7ae94971e3dd1 100644 --- a/src/mds/MDSRank.cc +++ b/src/mds/MDSRank.cc @@ -1465,10 +1465,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, @@ -1480,6 +1482,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 847e949eabbe3..d674917b48a76 100644 --- a/src/mds/MDSRank.h +++ b/src/mds/MDSRank.h @@ -323,7 +323,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 5e67d931fc304..0aa6bd2182412 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -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)