mirror of
https://codeberg.org/redict/redict.git
synced 2025-01-22 16:18:28 -05:00
Disable rehash when redis has child process (#8007)
In redisFork(), we don't set child pid, so updateDictResizePolicy()
doesn't take effect, that isn't friendly for copy-on-write.
The bug was introduced this in redis 6.0: 56258c6
This commit is contained in:
parent
f210e197f3
commit
89c78a9808
@ -1715,6 +1715,7 @@ int rewriteAppendOnlyFileBackground(void) {
|
||||
server.aof_rewrite_scheduled = 0;
|
||||
server.aof_rewrite_time_start = time(NULL);
|
||||
server.aof_child_pid = childpid;
|
||||
updateDictResizePolicy();
|
||||
/* We set appendseldb to -1 in order to force the next call to the
|
||||
* feedAppendOnlyFile() to issue a SELECT command, so the differences
|
||||
* accumulated by the parent into server.aof_rewrite_buf will start
|
||||
|
@ -7001,6 +7001,7 @@ int RM_Fork(RedisModuleForkDoneHandler cb, void *user_data) {
|
||||
server.module_child_pid = childpid;
|
||||
moduleForkInfo.done_handler = cb;
|
||||
moduleForkInfo.done_handler_user_data = user_data;
|
||||
updateDictResizePolicy();
|
||||
serverLog(LL_VERBOSE, "Module fork started pid: %d ", childpid);
|
||||
}
|
||||
return childpid;
|
||||
|
@ -1412,6 +1412,7 @@ int rdbSaveBackground(char *filename, rdbSaveInfo *rsi) {
|
||||
server.rdb_save_time_start = time(NULL);
|
||||
server.rdb_child_pid = childpid;
|
||||
server.rdb_child_type = RDB_CHILD_TYPE_DISK;
|
||||
updateDictResizePolicy();
|
||||
return C_OK;
|
||||
}
|
||||
return C_OK; /* unreached */
|
||||
@ -2618,6 +2619,7 @@ int rdbSaveToSlavesSockets(rdbSaveInfo *rsi) {
|
||||
server.rdb_save_time_start = time(NULL);
|
||||
server.rdb_child_pid = childpid;
|
||||
server.rdb_child_type = RDB_CHILD_TYPE_SOCKET;
|
||||
updateDictResizePolicy();
|
||||
close(rdb_pipe_write); /* close write in parent so that it can detect the close on the child. */
|
||||
if (aeCreateFileEvent(server.el, server.rdb_pipe_read, AE_READABLE, rdbPipeReadHandler,NULL) == AE_ERR) {
|
||||
serverPanic("Unrecoverable error creating server.rdb_pipe_read file event.");
|
||||
|
@ -2052,6 +2052,9 @@ int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) {
|
||||
}
|
||||
}
|
||||
}
|
||||
/* Just for the sake of defensive programming, to avoid forgeting to
|
||||
* call this function when need. */
|
||||
updateDictResizePolicy();
|
||||
|
||||
|
||||
/* AOF postponed flush: Try at every cron cycle if the slow fsync
|
||||
@ -5072,7 +5075,6 @@ int redisFork(int purpose) {
|
||||
if (childpid == -1) {
|
||||
return -1;
|
||||
}
|
||||
updateDictResizePolicy();
|
||||
}
|
||||
return childpid;
|
||||
}
|
||||
|
@ -250,3 +250,23 @@ start_server {tags {"other"}} {
|
||||
r save
|
||||
} {OK}
|
||||
}
|
||||
|
||||
start_server {tags {"other"}} {
|
||||
test {Don't rehash if redis has child proecess} {
|
||||
r config set save ""
|
||||
r config set rdb-key-save-delay 1000000
|
||||
|
||||
populate 4096 "" 1
|
||||
r bgsave
|
||||
r mset k1 v1 k2 v2
|
||||
# Hash table should not rehash
|
||||
assert_no_match "*table size: 8192*" [r debug HTSTATS 9]
|
||||
exec kill -9 [get_child_pid 0]
|
||||
after 200
|
||||
|
||||
# Hash table should rehash since there is no child process,
|
||||
# size is power of two and over 4098, so it is 16384
|
||||
r set k3 v3
|
||||
assert_match "*table size: 16384*" [r debug HTSTATS 9]
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user