summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2010-09-03 11:38:23 +0200
committerantirez <antirez@gmail.com>2010-09-03 11:38:23 +0200
commiteaaf62f6a4268d95f63265dc2cc3c3fe8b47689c (patch)
tree71e4ec60aa16b44e6e21a67ee9210dcdfd5ad5e6
parenteff09a7bd89d198c2fd7454083b71cd6ba08149f (diff)
downloadredis-eaaf62f6a4268d95f63265dc2cc3c3fe8b47689c.tar.gz
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)
-rw-r--r--redis.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/redis.c b/redis.c
index 59f84f17d..fe6d88043 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();