From 65311a3360728dda9688ee7756db87cc2c9cb8b4 Mon Sep 17 00:00:00 2001 From: Yossi Gottlieb Date: Mon, 29 Mar 2021 18:53:20 +0300 Subject: [PATCH] Fix config rewrite with an empty "save" parameter. (#8719) --- src/config.c | 19 ++++++++++++------- tests/unit/introspection.tcl | 12 ++++++++++++ 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/config.c b/src/config.c index fbf3ca1ff..b7381c670 100644 --- a/src/config.c +++ b/src/config.c @@ -1381,14 +1381,19 @@ void rewriteConfigSaveOption(struct rewriteConfigState *state) { return; } - /* Note that if there are no save parameters at all, all the current - * config line with "save" will be detected as orphaned and deleted, - * resulting into no RDB persistence as expected. */ - for (j = 0; j < server.saveparamslen; j++) { - line = sdscatprintf(sdsempty(),"save %ld %d", - (long) server.saveparams[j].seconds, server.saveparams[j].changes); - rewriteConfigRewriteLine(state,"save",line,1); + /* Rewrite save parameters, or an empty 'save ""' line to avoid the + * defaults from being used. + */ + if (!server.saveparamslen) { + rewriteConfigRewriteLine(state,"save",sdsnew("save \"\""),0); + } else { + for (j = 0; j < server.saveparamslen; j++) { + line = sdscatprintf(sdsempty(),"save %ld %d", + (long) server.saveparams[j].seconds, server.saveparams[j].changes); + rewriteConfigRewriteLine(state,"save",line,1); + } } + /* Mark "save" as processed in case server.saveparamslen is zero. */ rewriteConfigMarkAsProcessed(state,"save"); } diff --git a/tests/unit/introspection.tcl b/tests/unit/introspection.tcl index 698ed7789..bf4addbe5 100644 --- a/tests/unit/introspection.tcl +++ b/tests/unit/introspection.tcl @@ -180,6 +180,18 @@ start_server {tags {"introspection"}} { } } + test {CONFIG REWRITE handles save properly} { + r config set save "3600 1 300 100 60 10000" + r config rewrite + restart_server 0 true false + assert_equal [r config get save] {save {3600 1 300 100 60 10000}} + + r config set save "" + r config rewrite + restart_server 0 true false + assert_equal [r config get save] {save {}} + } + # Config file at this point is at a wierd state, and includes all # known keywords. Might be a good idea to avoid adding tests here. }