From a18c91d6423777dffd6afca80d32bf1964f449e6 Mon Sep 17 00:00:00 2001 From: "zhaozhao.zz" <276441700@qq.com> Date: Thu, 2 Jun 2022 19:03:47 +0800 Subject: rewrite alias config to original name (#10811) Redis 7 adds some new alias config like `hash-max-listpack-entries` alias `hash-max-ziplist-entries`. If a config file contains both real name and alias like this: ``` hash-max-listpack-entries 20 hash-max-ziplist-entries 20 ``` after set `hash-max-listpack-entries` to 100 and `config rewrite`, the config file becomes to: ``` hash-max-listpack-entries 100 hash-max-ziplist-entries 20 ``` we can see that the alias config is not modified, and users will get wrong config after restart. 6.0 and 6.2 doesn't have this bug, since they only have the `slave` word alias. Co-authored-by: Oran Agra --- src/config.c | 15 +++++---------- tests/unit/introspection.tcl | 23 +++++++++++++++++++++++ 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/config.c b/src/config.c index 9856af3c0..c714b1994 100644 --- a/src/config.c +++ b/src/config.c @@ -1171,18 +1171,13 @@ struct rewriteConfigState *rewriteConfigReadOldFile(char *path) { * Append the line and populate the option -> line numbers map. */ rewriteConfigAppendLine(state,line); - /* Translate options using the word "slave" to the corresponding name - * "replica", before adding such option to the config name -> lines - * mapping. */ - char *p = strstr(argv[0],"slave"); - if (p) { - sds alt = sdsempty(); - alt = sdscatlen(alt,argv[0],p-argv[0]); - alt = sdscatlen(alt,"replica",7); - alt = sdscatlen(alt,p+5,strlen(p+5)); + /* If this is a alias config, replace it with the original name. */ + standardConfig *s_conf = lookupConfig(argv[0]); + if (s_conf && s_conf->flags & ALIAS_CONFIG) { sdsfree(argv[0]); - argv[0] = alt; + argv[0] = sdsnew(s_conf->alias); } + /* If this is sentinel config, we use sentinel "sentinel " as option to avoid messing up the sequence. */ if (server.sentinel_mode && argc > 1 && !strcasecmp(argv[0],"sentinel")) { diff --git a/tests/unit/introspection.tcl b/tests/unit/introspection.tcl index 2bee01e7c..9b5575d75 100644 --- a/tests/unit/introspection.tcl +++ b/tests/unit/introspection.tcl @@ -594,3 +594,26 @@ test {CONFIG REWRITE handles rename-command properly} { } } {} {external:skip} +test {CONFIG REWRITE handles alias config properly} { + start_server {tags {"introspection"} overrides {hash-max-listpack-entries 20 hash-max-ziplist-entries 21}} { + assert_equal [r config get hash-max-listpack-entries] {hash-max-listpack-entries 21} + assert_equal [r config get hash-max-ziplist-entries] {hash-max-ziplist-entries 21} + r config set hash-max-listpack-entries 100 + + r config rewrite + restart_server 0 true false + + assert_equal [r config get hash-max-listpack-entries] {hash-max-listpack-entries 100} + } + # test the order doesn't matter + start_server {tags {"introspection"} overrides {hash-max-ziplist-entries 20 hash-max-listpack-entries 21}} { + assert_equal [r config get hash-max-listpack-entries] {hash-max-listpack-entries 21} + assert_equal [r config get hash-max-ziplist-entries] {hash-max-ziplist-entries 21} + r config set hash-max-listpack-entries 100 + + r config rewrite + restart_server 0 true false + + assert_equal [r config get hash-max-listpack-entries] {hash-max-listpack-entries 100} + } +} {} {external:skip} -- cgit v1.2.1