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)
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) {
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,
// 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);
}
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);
}
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)