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: v19.0.0~793^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=d0bfbbea44e22fc545363cd6af47d28e18e353b0;p=ceph-ci.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 --- diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 77303ddd8ad..e86b47bfb8b 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 5fe47198445..8dd3f8e8e42 100644 --- a/src/mds/MDSRank.cc +++ b/src/mds/MDSRank.cc @@ -1471,10 +1471,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, @@ -1486,6 +1488,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 3e353cf962b..1658fe17a5c 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 94397d9f067..a6669f04cf4 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)