From eaaf62f6a4268d95f63265dc2cc3c3fe8b47689c Mon Sep 17 00:00:00 2001 From: antirez Date: Fri, 3 Sep 2010 11:38:23 +0200 Subject: [PATCH] Fix for a race in BGSAVE that may result in some data not being saved as soon as possible (when the configured saving triggers should fire). Also known as Issue 313, more details there in the google code issue. (backported from master) --- redis.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/redis.c b/redis.c index 59f84f17..fe6d8804 100644 --- a/redis.c +++ b/redis.c @@ -347,6 +347,7 @@ struct redisServer { int fd; redisDb *db; long long dirty; /* changes to DB from the last save */ + long long dirty_before_bgsave; /* used to restore dirty on failed BGSAVE */ list *clients; list *slaves, *monitors; char neterr[ANET_ERR_LEN]; @@ -1320,7 +1321,7 @@ void backgroundSaveDoneHandler(int statloc) { if (!bysignal && exitcode == 0) { redisLog(REDIS_NOTICE, "Background saving terminated with success"); - server.dirty = 0; + server.dirty = server.dirty - server.dirty_before_bgsave; server.lastsave = time(NULL); } else if (!bysignal && exitcode != 0) { redisLog(REDIS_WARNING, "Background saving error"); @@ -3790,6 +3791,7 @@ static int rdbSaveBackground(char *filename) { if (server.bgsavechildpid != -1) return REDIS_ERR; if (server.vm_enabled) waitEmptyIOJobsQueue(); + server.dirty_before_bgsave = server.dirty; if ((childpid = fork()) == 0) { /* Child */ if (server.vm_enabled) vmReopenSwapFile();