From 06e5209f05d27733ba24cd655e2e9cc5e91ced68 Mon Sep 17 00:00:00 2001 From: Jerry Zhao Date: Sat, 29 Aug 2026 07:22:45 +0000 Subject: [PATCH] fix: handle partial Redis rejection writes --- src/brpc/acceptor.cpp | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/brpc/acceptor.cpp b/src/brpc/acceptor.cpp index a049b9bb..fdf5f952 100644 --- a/src/brpc/acceptor.cpp +++ b/src/brpc/acceptor.cpp @@ -250,13 +250,21 @@ void Acceptor::RejectRedisConnection(int fd) { static const char response[] = "-ERR max number of clients reached\r\n"; - ssize_t nwritten; - do { - nwritten = send(fd, - response, - sizeof(response) - 1, - MSG_DONTWAIT | MSG_NOSIGNAL); - } while (nwritten < 0 && errno == EINTR); + const size_t response_size = sizeof(response) - 1; + size_t offset = 0; + while (offset < response_size) { + const ssize_t nwritten = send(fd, + response + offset, + response_size - offset, + MSG_DONTWAIT | MSG_NOSIGNAL); + if (nwritten > 0) { + offset += nwritten; + } else if (nwritten < 0 && errno == EINTR) { + continue; + } else { + break; + } + } } void Acceptor::ListConnections(std::vector* conn_list,