diff options
author | sundb <sundbcn@gmail.com> | 2021-12-31 20:08:04 +0800 |
---|---|---|
committer | Oran Agra <oran@redislabs.com> | 2022-04-27 16:31:52 +0300 |
commit | aab9b12786dc23588806b1864a878053d6975979 (patch) | |
tree | be8b629c361c7e8410578831f42acd278d80a428 | |
parent | 066b68328e65c6352f742b7c1f3326056791a33a (diff) | |
download | redis-aab9b12786dc23588806b1864a878053d6975979.tar.gz |
Fix when the master connection is disconnected, replication retry read indefinitely (#10032)
Now if redis is still loading when we receive sigterm, we will wait for the loading to reach the event
loop (once in 2mb) before actually shutting down. See #10003.
This change caused valgrind CI to fail.
See https://github.com/redis/redis/runs/4662901673?check_suite_focus=true
This pr is mainly to solve the problem that redis process cannot be exited normally.
When the master is disconnected, if repl is processing diskless loading and using `connRead` to read data from master,
it may enter an infinite retry state, which does not handle `connRead` returning 0(master connection disconnected).
(cherry picked from commit 73951abe7b86a565e3123fc1b8033efdcd1c0c04)
-rw-r--r-- | src/rio.c | 4 |
1 files changed, 3 insertions, 1 deletions
@@ -211,7 +211,9 @@ static size_t rioConnRead(rio *r, void *buf, size_t len) { int retval = connRead(r->io.conn.conn, (char*)r->io.conn.buf + sdslen(r->io.conn.buf), toread); - if (retval <= 0) { + if (retval == 0) { + return 0; + } else if (retval < 0) { if (errno == EWOULDBLOCK) errno = ETIMEDOUT; return 0; } |