diff --git a/src/redis-cli.c b/src/redis-cli.c index 88f39a6e..7c086cfb 100644 --- a/src/redis-cli.c +++ b/src/redis-cli.c @@ -1399,6 +1399,7 @@ static void getRDB(void) { * Bulk import (pipe) mode *--------------------------------------------------------------------------- */ +#define PIPEMODE_WRITE_LOOP_MAX_BYTES (128*1024) static void pipeMode(void) { int fd = context->fd; long long errors = 0, replies = 0, obuf_len = 0, obuf_pos = 0; @@ -1475,6 +1476,8 @@ static void pipeMode(void) { /* Handle the writable state: we can send protocol to the server. */ if (mask & AE_WRITABLE) { + ssize_t loop_nwritten = 0; + while(1) { /* Transfer current buffer to server. */ if (obuf_len != 0) { @@ -1491,6 +1494,7 @@ static void pipeMode(void) { } obuf_len -= nwritten; obuf_pos += nwritten; + loop_nwritten += nwritten; if (obuf_len != 0) break; /* Can't accept more data. */ } /* If buffer is empty, load from stdin. */ @@ -1526,7 +1530,8 @@ static void pipeMode(void) { obuf_pos = 0; } } - if (obuf_len == 0 && eof) break; + if ((obuf_len == 0 && eof) || + loop_nwritten > PIPEMODE_WRITE_LOOP_MAX_BYTES) break; } }