]> git.saurik.com Git - redis.git/commitdiff
blocking load of keys on lookup -- nor tested, nor finished
authorantirez <antirez@gmail.com>
Thu, 30 Dec 2010 23:18:17 +0000 (00:18 +0100)
committerantirez <antirez@gmail.com>
Thu, 30 Dec 2010 23:18:17 +0000 (00:18 +0100)
src/db.c
src/dscache.c

index 1b0289bcd97d4512b6f6b9359a120545ec95946f..7ae23fa0059ae51ac841bc491ec2f75f57aeea18 100644 (file)
--- a/src/db.c
+++ b/src/db.c
@@ -27,10 +27,26 @@ robj *lookupKey(redisDb *db, robj *key) {
         server.stat_keyspace_hits++;
         return val;
     } else {
-        /* FIXME: Check if the object is on disk, if it is, load it
-         * in a blocking way now. If we are sure there are no collisions
-         * it would be cool to load this directly here without IO thread
-         * help. */
+        time_t expire;
+        robj *val;
+
+        /* 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. */
+        if (server.ds_enabled && cacheKeyMayExist(db,key)) {
+            val = dsGet(db,key,&expire);
+            if (val) {
+                int retval = dbAdd(db,key,val);
+                redisAssert(retval == REDIS_OK);
+                if (expire != -1) setExpire(db,key,expire);
+                server.stat_keyspace_hits++;
+                return val;
+            }
+        }
         server.stat_keyspace_misses++;
         return NULL;
     }
index 9fc0f5e58f7c309aec380beb038eff2dc91e30e6..03be8ffa455418f14ac0c0c572019fe04416cda9 100644 (file)
@@ -292,9 +292,13 @@ void vmThreadedIOCompletedJob(aeEventLoop *el, int fd, void *privdata,
         if (j->type == REDIS_IOJOB_LOAD) {
             /* Create the key-value pair in the in-memory database */
             if (j->val != NULL) {
-                dbAdd(j->db,j->key,j->val);
-                incrRefCount(j->val);
-                if (j->expire != -1) setExpire(j->db,j->key,j->expire);
+                /* Note: the key may already be here if between the time
+                 * this key loading was scheduled and now there was the
+                 * need to blocking load the key for a key lookup. */
+                if (dbAdd(j->db,j->key,j->val) == REDIS_OK) {
+                    incrRefCount(j->val);
+                    if (j->expire != -1) setExpire(j->db,j->key,j->expire);
+                }
             } else {
                 /* The key does not exist. Create a negative cache entry
                  * for this key. */