]> git.saurik.com Git - redis.git/commitdiff
fixed bugs on diskstore cache
authorantirez <antirez@gmail.com>
Thu, 30 Dec 2010 16:21:54 +0000 (17:21 +0100)
committerantirez <antirez@gmail.com>
Thu, 30 Dec 2010 16:21:54 +0000 (17:21 +0100)
src/dscache.c

index b37a8cd3bb0e67e1eedc911f2a8c346ffe8faed0..fc358c5290e57899ae59dfc8941c600de6fc540e 100644 (file)
@@ -471,7 +471,7 @@ void cacheScheduleForFlush(redisDb *db, robj *key) {
     dk->key = key;
     incrRefCount(key);
     dk->ctime = time(NULL);
-    listAddNodeTail(server.cache_flush_queue, key);
+    listAddNodeTail(server.cache_flush_queue, dk);
 }
 
 void cacheCron(void) {
@@ -488,8 +488,10 @@ void cacheCron(void) {
 
             redisLog(REDIS_DEBUG,"Creating IO Job to save key %s",dk->key->ptr);
 
-            /* Lookup the key. We need to check if it's still here and
-             * possibly access to the value. */
+            /* Lookup the key, in order to put the current value in the IO
+             * Job and mark ti as DS_SAVING.
+             * Otherwise if the key does not exists we schedule a disk store
+             * delete operation, setting the value to NULL. */
             de = dictFind(dk->db->dict,dk->key->ptr);
             if (de) {
                 val = dictGetEntryVal(de);
@@ -502,6 +504,8 @@ void cacheCron(void) {
             }
             dsCreateIOJob(REDIS_IOJOB_SAVE,dk->db,dk->key,val);
             listDelNode(server.cache_flush_queue,ln);
+            decrRefCount(dk->key);
+            zfree(dk);
         } else {
             break; /* too early */
         }