summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHuang Zhw <huang_zhw@126.com>2021-07-11 18:00:17 +0800
committerOran Agra <oran@redislabs.com>2021-07-21 21:06:49 +0300
commit5b8e39517481eeb6aab3f50e6be46b35885fc797 (patch)
tree120232b52d400d52f528c50d8d90881592e6fefb
parent9914b676b35c629e6a147b6d0c4d82a1f00ff7bb (diff)
downloadredis-5b8e39517481eeb6aab3f50e6be46b35885fc797.tar.gz
Do not install a file event to send data to rewrite child when parent stop sending diff to child in aof rewrite. (#8767)
In aof rewrite, when parent stop sending data to child, if there is new rewrite data, aofChildWriteDiffData write event will be installed. Then this event is issued and deletes the file event without do anyting. This will happen over and over again until aof rewrite finish. This bug used to waste a few system calls per excessive wake-up (epoll_ctl and epoll_wait) per cycle, each cycle triggered by receiving a write command from a client. (cherry picked from commit cb961d8c8e10ff3b619f1579a03336a15e9e6f45)
-rw-r--r--src/aof.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/src/aof.c b/src/aof.c
index 0d2971eac..566a98640 100644
--- a/src/aof.c
+++ b/src/aof.c
@@ -162,7 +162,9 @@ void aofRewriteBufferAppend(unsigned char *s, unsigned long len) {
/* Install a file event to send data to the rewrite child if there is
* not one already. */
- if (aeGetFileEvents(server.el,server.aof_pipe_write_data_to_child) == 0) {
+ if (!server.aof_stop_sending_diff &&
+ aeGetFileEvents(server.el,server.aof_pipe_write_data_to_child) == 0)
+ {
aeCreateFileEvent(server.el, server.aof_pipe_write_data_to_child,
AE_WRITABLE, aofChildWriteDiffData, NULL);
}