]> git.saurik.com Git - redis.git/commitdiff
blocking load fixed with the new design
authorantirez <antirez@gmail.com>
Sat, 1 Jan 2011 20:39:48 +0000 (21:39 +0100)
committerantirez <antirez@gmail.com>
Sat, 1 Jan 2011 20:39:48 +0000 (21:39 +0100)
src/db.c

index c985794d4aececaa026b827ffc90f68a4bb46dd3..8684bb1ab0b7e9bca7418dfbc157558ca065d014 100644 (file)
--- a/src/db.c
+++ b/src/db.c
@@ -34,12 +34,18 @@ robj *lookupKey(redisDb *db, robj *key) {
 
         /* Key not found in the in memory hash table, but if disk store is
          * enabled we may have this key on disk. If so load it in memory
-         * in a blocking way.
-         * 
-         * FIXME: race condition here. If there was an already scheduled
-         * async loading of this key, what may happen is that the old
-         * key is loaded in memory if this gets deleted in the meantime. */
+         * in a blocking way. */
         if (server.ds_enabled && cacheKeyMayExist(db,key)) {
+            if (cacheScheduleIOGetFlags(db,key) &
+                 (REDIS_IO_SAVE|REDIS_IO_SAVEINPROG))
+            {
+                /* There is a save in progress for this object!
+                 * Wait for it to get out. */
+                waitEmptyIOJobsQueue();
+                processAllPendingIOJobs();
+                redisAssert((cacheScheduleIOGetFlags(db,key) & (REDIS_IO_SAVE|REDIS_IO_SAVEINPROG)) == 0);
+            }
+
             redisLog(REDIS_DEBUG,"Force loading key %s via lookup",
                 key->ptr);
             val = dsGet(db,key,&expire);