diff options
author | antirez <antirez@gmail.com> | 2011-01-08 00:09:57 +0100 |
---|---|---|
committer | antirez <antirez@gmail.com> | 2011-01-08 00:09:57 +0100 |
commit | cc2750670f1cb2fafde3e7d1a340f6674dab1749 (patch) | |
tree | 9c4d154491cb29271cf52386ccf3681598aa6584 | |
parent | 43574a72c373d787b2e1d22c45f242a04165996f (diff) | |
download | redis-cc2750670f1cb2fafde3e7d1a340f6674dab1749.tar.gz |
blocking SAVE implemented
-rw-r--r-- | src/diskstore.c | 23 | ||||
-rw-r--r-- | src/rdb.c | 2 | ||||
-rw-r--r-- | src/redis.h | 1 |
3 files changed, 24 insertions, 2 deletions
diff --git a/src/diskstore.c b/src/diskstore.c index 057bfc689..382afb4fb 100644 --- a/src/diskstore.c +++ b/src/diskstore.c @@ -474,7 +474,7 @@ werr: return NULL; } -int dsRdbSave(char *filename) { +int dsRdbSaveBackground(char *filename) { pthread_t thread; if (pthread_create(&thread,NULL,dsRdbSave_thread,zstrdup(filename)) != 0) { @@ -486,3 +486,24 @@ int dsRdbSave(char *filename) { return REDIS_OK; } } + +int dsRdbSave(char *filename) { + /* A blocking save is actually a non blocking save... just we wait + * for it to terminate in a non-busy loop. */ + + redisLog(REDIS_NOTICE,"Starting a blocking SAVE (BGSAVE + blocking wait)"); + server.dirty_before_bgsave = server.dirty; + if (dsRdbSaveBackground(filename) == REDIS_ERR) return REDIS_ERR; + while(1) { + usleep(1000); + int state; + + pthread_mutex_lock(&server.bgsavethread_mutex); + state = server.bgsavethread_state; + pthread_mutex_unlock(&server.bgsavethread_mutex); + + if (state == REDIS_BGSAVE_THREAD_DONE_OK || + state == REDIS_BGSAVE_THREAD_DONE_ERR) break; + } + return REDIS_OK; +} @@ -504,7 +504,7 @@ int rdbSaveBackground(char *filename) { if (server.ds_enabled) { cacheForcePointInTime(); - return dsRdbSave(filename); + return dsRdbSaveBackground(filename); } if ((childpid = fork()) == 0) { diff --git a/src/redis.h b/src/redis.h index 6ff62916b..4caccb88c 100644 --- a/src/redis.h +++ b/src/redis.h @@ -802,6 +802,7 @@ robj *dsGet(redisDb *db, robj *key, time_t *expire); int dsDel(redisDb *db, robj *key); int dsExists(redisDb *db, robj *key); void dsFlushDb(int dbid); +int dsRdbSaveBackground(char *filename); int dsRdbSave(char *filename); /* Disk Store Cache */ |