Skip to content

Commit

Permalink
mds: skip forwarding request if the session were removed
Browse files Browse the repository at this point in the history
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 d0bfbbe)
  • Loading branch information
lxbsz committed Aug 7, 2023
1 parent 43fa494 commit b0126c0
Show file tree
Hide file tree
Showing 4 changed files with 10 additions and 4 deletions.
2 changes: 1 addition & 1 deletion src/mds/MDCache.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
8 changes: 7 additions & 1 deletion src/mds/MDSRank.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1465,10 +1465,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,
Expand All @@ -1480,6 +1482,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);
}
Expand Down
2 changes: 1 addition & 1 deletion src/mds/MDSRank.h
Original file line number Diff line number Diff line change
Expand Up @@ -323,7 +323,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);
Expand Down
2 changes: 1 addition & 1 deletion src/mds/Server.cc
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ class Batch_Getattr_Lookup : public BatchOp {
}
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)
Expand Down

0 comments on commit b0126c0

Please sign in to comment.