From 7ad5d56bd0893df98a89cfe1d936177f1cebf257 Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Tue, 21 Apr 2026 01:53:00 +0300 Subject: [PATCH] Do not use too small end of the RDMA send buffer --- src/client/msgr_rdma.cpp | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/client/msgr_rdma.cpp b/src/client/msgr_rdma.cpp index 9831a1de..9354bf3a 100644 --- a/src/client/msgr_rdma.cpp +++ b/src/client/msgr_rdma.cpp @@ -590,7 +590,36 @@ void osd_messenger_t::try_send_rdma(osd_client_t *cl) while (!rc->send_out_full && copied > 0 && rc->cur_send < rc->max_send) { dst = (uint8_t*)rc->send_out.buf + rc->send_out_pos; - dst_len = (rc->send_out_pos < rc->send_out_size ? rc->send_out_size-rc->send_out_pos : rc->send_done_pos-rc->send_out_pos); + if (rc->send_out_pos >= rc->send_done_pos) + { + dst_len = rc->send_out_size-rc->send_out_pos; + if (dst_len < 4096) + { + // free end of the buffer is too small, skip + rc->send_out_pos = 0; + if (rc->send_out_pos >= rc->send_done_pos) + rc->send_out_full = true; + if (!rc->send_sizes.size()) + { + rc->send_done_pos += dst_len; + rc->send_out_full = false; + if (rc->send_done_pos == rc->send_out_size) + rc->send_done_pos = 0; + } + else + rc->send_sizes.back() += dst_len; + continue; + } + } + else + { + dst_len = rc->send_done_pos-rc->send_out_pos; + if (dst_len < 4096) + { + // too small buffer, stop + break; + } + } if (dst_len > rc->max_msg) dst_len = rc->max_msg; copied = copy_ops_to(cl, dst, dst_len);