]> git.saurik.com Git - redis.git/commitdiff
more work towards diskstore bgsave
authorantirez <antirez@gmail.com>
Fri, 7 Jan 2011 18:31:42 +0000 (19:31 +0100)
committerantirez <antirez@gmail.com>
Fri, 7 Jan 2011 18:31:42 +0000 (19:31 +0100)
TODO
src/aof.c
src/diskstore.c
src/rdb.c
src/redis.c
src/redis.h

diff --git a/TODO b/TODO
index 2402a9d413034a345e33a0a08531c71c4ac6b3eb..d7ba4a2f38da21ae99834bfd61a1385ef070688e 100644 (file)
--- a/TODO
+++ b/TODO
@@ -17,6 +17,9 @@ DISKSTORE TODO
 * Implement MULTI/EXEC as transaction abstract API to diskstore.c, with transaction_start, transaction_end, and a journal to recover.
 * Stop BGSAVE thread on shutdown and any other condition where the child is killed during normal bgsave.
 * Use a mutex to log on the file, so that we don't get overlapping messages, or even better make sure to use a single write against it.
+* Fix RANDOMKEY to really do something interesting
+* Fix DBSIZE to really do something interesting
+* Add a DEBUG command to check if an entry is or not in memory currently
 
 REPLICATION
 ===========
index 723d845f64297a5c3b84203fac5694560e828cbc..0c25cf6c62213a4ddfb38d2c89a412f592c574dc 100644 (file)
--- a/src/aof.c
+++ b/src/aof.c
@@ -633,7 +633,7 @@ void backgroundRewriteDoneHandler(int exitcode, int bysignal) {
     } else {
         redisLog(REDIS_WARNING,
             "Background append only file rewriting terminated by signal %d",
-            bysitnal);
+            bysignal);
     }
 cleanup:
     sdsfree(server.bgrewritebuf);
index 0aa8e37fe60b35cf0de4885910793789181695bc..d5abf0e660205cd38c878600f3b7d682490c7353 100644 (file)
@@ -349,10 +349,17 @@ void dsFlushDb(int dbid) {
     }
 }
 
+void dsRdbSaveSetState(int state) {
+    pthread_mutex_lock(&server.bgsavethread_mutex);
+    server.bgsavethread_state = state;
+    pthread_mutex_unlock(&server.bgsavethread_mutex);
+}
+
 void *dsRdbSave_thread(void *arg) {
     char tmpfile[256], *filename = (char*)arg;
     int j, i;
     time_t now = time(NULL);
+    FILE *fp;
 
     /* Change state to ACTIVE, to signal there is a saving thead working. */
     pthread_mutex_lock(&server.bgsavethread_mutex);
@@ -362,11 +369,16 @@ void *dsRdbSave_thread(void *arg) {
     snprintf(tmpfile,256,"temp-%d.rdb", (int) getpid());
     fp = fopen(tmpfile,"w");
     if (!fp) {
-        redisLog(REDIS_WARNING, "Failed saving the DB: %s", strerror(errno));
-        return REDIS_ERR;
+        redisLog(REDIS_WARNING, "Failed opening .rdb for saving: %s",
+            strerror(errno));
+        dsRdbSaveSetState(REDIS_BGSAVE_THREAD_DONE_ERR);
+        return NULL;
     }
     if (fwrite("REDIS0001",9,1,fp) == 0) goto werr;
 
+    sleep(5);
+
+#if 0
     /* Scan all diskstore dirs looking for keys */
     for (j = 0; j < 256; j++) {
         for (i = 0; i < 256; i++) {
@@ -377,6 +389,7 @@ void *dsRdbSave_thread(void *arg) {
             if (rdbSaveLen(fp,j) == -1) goto werr;
         }
     }
+#endif
 
     /* Make sure data will not remain on the OS's output buffers */
     fflush(fp);
@@ -389,16 +402,20 @@ void *dsRdbSave_thread(void *arg) {
     if (rename(tmpfile,filename) == -1) {
         redisLog(REDIS_WARNING,"Error moving temp DB file on the final destination: %s", strerror(errno));
         unlink(tmpfile);
-        return REDIS_ERR;
+        dsRdbSaveSetState(REDIS_BGSAVE_THREAD_DONE_ERR);
+        return NULL;
     }
     redisLog(REDIS_NOTICE,"DB saved on disk");
-    return REDIS_OK;
+    dsRdbSaveSetState(REDIS_BGSAVE_THREAD_DONE_OK);
+    return NULL;
 
 werr:
     zfree(filename);
     fclose(fp);
     unlink(tmpfile);
+    dsRdbSaveSetState(REDIS_BGSAVE_THREAD_DONE_ERR);
     redisLog(REDIS_WARNING,"Write error saving DB on disk: %s", strerror(errno));
+    return NULL;
 }
 
 int dsRdbSave(char *filename) {
index 62756d3047252c9ac04149ce4384c1a3f1f77985..6372254c90d216269ff7a9c0421ee131e28ce70c 100644 (file)
--- a/src/rdb.c
+++ b/src/rdb.c
@@ -437,7 +437,8 @@ int rdbSave(char *filename) {
     snprintf(tmpfile,256,"temp-%d.rdb", (int) getpid());
     fp = fopen(tmpfile,"w");
     if (!fp) {
-        redisLog(REDIS_WARNING, "Failed saving the DB: %s", strerror(errno));
+        redisLog(REDIS_WARNING, "Failed opening .rdb for saving: %s",
+            strerror(errno));
         return REDIS_ERR;
     }
     if (fwrite("REDIS0001",9,1,fp) == 0) goto werr;
@@ -973,7 +974,7 @@ void backgroundSaveDoneHandler(int exitcode, int bysignal) {
 }
 
 void saveCommand(redisClient *c) {
-    if (server.bgsavechildpid != -1 || server.bgsavethread != (pthread-t)-1) {
+    if (server.bgsavechildpid != -1 || server.bgsavethread != (pthread_t)-1) {
         addReplyError(c,"Background save already in progress");
         return;
     }
@@ -985,7 +986,7 @@ void saveCommand(redisClient *c) {
 }
 
 void bgsaveCommand(redisClient *c) {
-    if (server.bgsavechildpid != -1 || server.bgsavethread != (pthread-t)-1) {
+    if (server.bgsavechildpid != -1 || server.bgsavethread != (pthread_t)-1) {
         addReplyError(c,"Background save already in progress");
         return;
     }
index 2fd3ee39e3c8843f1f5e56c991e195c11b8aaf10..f800018050ab03095f3cfef23659258760ca3489 100644 (file)
@@ -608,10 +608,11 @@ int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) {
             state = server.bgsavethread_state;
             pthread_mutex_unlock(&server.bgsavethread_mutex);
 
-            if (state == REDIS_BGSAVE_DONE_OK || state == REDIS_BGSAVE_DONE_ERR)
+            if (state == REDIS_BGSAVE_THREAD_DONE_OK ||
+                state == REDIS_BGSAVE_THREAD_DONE_ERR)
             {
                 backgroundSaveDoneHandler(
-                    (state == REDIS_BGSAVE_DONE_OK) ? 0 : 1, 0);
+                    (state == REDIS_BGSAVE_THREAD_DONE_OK) ? 0 : 1, 0);
             }
         }
     } else if (!server.ds_enabled) {
index c87613349deff2e6e1db99d17a497bde95b3c33d..a117c1fc9d84c8cf0ffc91c17408c61f18065e22 100644 (file)
@@ -756,7 +756,7 @@ int rdbSaveObject(FILE *fp, robj *o);
 off_t rdbSavedObjectLen(robj *o);
 off_t rdbSavedObjectPages(robj *o);
 robj *rdbLoadObject(int type, FILE *fp);
-void backgroundSaveDoneHandler(int exitcode, int bysignal) {
+void backgroundSaveDoneHandler(int exitcode, int bysignal);
 int rdbSaveKeyValuePair(FILE *fp, redisDb *db, robj *key, robj *val, time_t now);
 int rdbLoadType(FILE *fp);
 time_t rdbLoadTime(FILE *fp);
@@ -800,6 +800,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 dsRdbSave(char *filename);
 
 /* Disk Store Cache */
 void dsInit(void);