]> git.saurik.com Git - redis.git/commitdiff
fixed diskstore race condition
authorantirez <antirez@gmail.com>
Thu, 10 Mar 2011 15:39:19 +0000 (16:39 +0100)
committerantirez <antirez@gmail.com>
Thu, 10 Mar 2011 15:46:58 +0000 (16:46 +0100)
src/dscache.c

index 2dbc1134d8f7c62489b0fd7b3ffccaca72814df1..cbe9bb016cac41e8637d9c49ef512ad45aafe70d 100644 (file)
@@ -890,8 +890,16 @@ int waitForSwappedKey(redisClient *c, robj *key) {
     listAddNodeTail(l,c);
 
     /* Are we already loading the key from disk? If not create a job */
-    if (de == NULL)
-        cacheScheduleIO(c->db,key,REDIS_IO_LOAD);
+    if (de == NULL) {
+        int flags = cacheScheduleIOGetFlags(c->db,key);
+
+        /* It is possible that even if there are no clients waiting for
+         * a load operation, still we have a load operation in progress.
+         * For instance think to a client performing a GET and then
+         * closing the connection */
+        if ((flags & (REDIS_IO_LOAD|REDIS_IO_LOADINPROG)) == 0)
+            cacheScheduleIO(c->db,key,REDIS_IO_LOAD);
+    }
     return 1;
 }