From: Xiubo Li Date: Tue, 29 Mar 2022 08:45:12 +0000 (+0800) Subject: client: stop forwarding the request when exceeding 256 times X-Git-Tag: v16.2.11~103^2~101^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=152d84f670af5b1bdd32cdb209a920bff948e759;p=ceph.git client: stop forwarding the request when exceeding 256 times The type of 'num_fwd' in ceph 'MClientRequestForward' is 'int32_t', while in 'ceph_mds_request_head' the type is '__u8'. So in case the request bounces between MDSes exceeding 256 times, the client will get stuck. In this case it's ususally a bug in MDS and continue bouncing the request makes no sense. Fixes: https://tracker.ceph.com/issues/55129 Signed-off-by: Xiubo Li (cherry picked from commit ad61e1dd1a56cd27be17886e8338133196e75a2a) --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 1250249b65c0b..f2cdb975f6af9 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -2437,6 +2437,36 @@ void Client::handle_client_request_forward(const MConstRefnum_fwd); + max_fwd = 1 << (max_fwd * CHAR_BIT) - 1; + auto num_fwd = fwd->get_num_fwd(); + if (num_fwd <= request->num_fwd || num_fwd >= max_fwd) { + if (request->num_fwd >= max_fwd || num_fwd >= max_fwd) { + request->abort(-EMULTIHOP); + request->caller_cond->notify_all(); + ldout(cct, 1) << __func__ << " tid " << tid << " seq overflow" + << ", abort it" << dendl; + } else { + ldout(cct, 10) << __func__ << " tid " << tid + << " old fwd seq " << fwd->get_num_fwd() + << " <= req fwd " << request->num_fwd + << ", ignore it" << dendl; + } + return; + } + // reset retry counter request->retry_attempt = 0; @@ -2450,7 +2480,7 @@ void Client::handle_client_request_forward(const MConstRefmds = -1; request->item.remove_myself(); - request->num_fwd = fwd->get_num_fwd(); + request->num_fwd = num_fwd; request->resend_mds = fwd->get_dest_mds(); request->caller_cond->notify_all(); }