From 3effb0c6d08354c2305802c83500bb3072ab9fbc Mon Sep 17 00:00:00 2001 From: fengquyoumo <1455117463@qq.com> Date: Tue, 3 Dec 2024 22:11:36 +0800 Subject: [PATCH] fix dead loop when transfer large data (size>20474) by rdma --- src/rdma.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/rdma.c b/src/rdma.c index de7ea396a12..83c3c238b58 100644 --- a/src/rdma.c +++ b/src/rdma.c @@ -678,6 +678,7 @@ static connection *connCreateAcceptedRdma(int fd, void *priv) { static void connRdmaEventHandler(struct aeEventLoop *el, int fd, void *clientData, int mask) { rdma_connection *rdma_conn = (rdma_connection *)clientData; connection *conn = &rdma_conn->c; + client *c = connGetPrivateData(conn); struct rdma_cm_id *cm_id = rdma_conn->cm_id; RdmaContext *ctx = cm_id->context; int ret = 0; @@ -694,6 +695,9 @@ static void connRdmaEventHandler(struct aeEventLoop *el, int fd, void *clientDat /* uplayer should read all */ while (ctx->rx.pos < ctx->rx.offset) { + if (c->io_read_state == CLIENT_COMPLETED_IO || c->io_write_state == CLIENT_COMPLETED_IO) { + break; + } if (conn->read_handler && (callHandler(conn, conn->read_handler) == C_ERR)) { return; }