summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2011-01-08 00:09:57 +0100
committerantirez <antirez@gmail.com>2011-01-08 00:09:57 +0100
commitcc2750670f1cb2fafde3e7d1a340f6674dab1749 (patch)
tree9c4d154491cb29271cf52386ccf3681598aa6584
parent43574a72c373d787b2e1d22c45f242a04165996f (diff)
downloadredis-cc2750670f1cb2fafde3e7d1a340f6674dab1749.tar.gz
blocking SAVE implemented
-rw-r--r--src/diskstore.c23
-rw-r--r--src/rdb.c2
-rw-r--r--src/redis.h1
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;
+}
diff --git a/src/rdb.c b/src/rdb.c
index 6372254c9..83fe81e50 100644
--- a/src/rdb.c
+++ b/src/rdb.c
@@ -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 */