]> git.saurik.com Git - redis.git/commitdiff
blocking SAVE implemented
authorantirez <antirez@gmail.com>
Fri, 7 Jan 2011 23:09:57 +0000 (00:09 +0100)
committerantirez <antirez@gmail.com>
Fri, 7 Jan 2011 23:09:57 +0000 (00:09 +0100)
src/diskstore.c
src/rdb.c
src/redis.h

index 057bfc689c0121c5e5de82664794eec3594058b5..382afb4fb14300d3376813a24ca69d6013eee985 100644 (file)
@@ -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;
+}
index 6372254c90d216269ff7a9c0421ee131e28ce70c..83fe81e503146c231083aa3a388b62c807a9a6aa 100644 (file)
--- 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) {
index 6ff62916bd060ba0fced7e9eaec6b58e591d57c7..4caccb88c00cdeb633dc86a4e8cb481c90d5e5bc 100644 (file)
@@ -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 */