From 55cf8433e32f0e6e99cd136b289c404134143746 Mon Sep 17 00:00:00 2001 From: antirez Date: Tue, 5 Jan 2010 07:28:06 -0500 Subject: [PATCH] load key from swap on key lookup --- redis.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/redis.c b/redis.c index 8d1b91d3..1b93c58c 100644 --- a/redis.c +++ b/redis.c @@ -488,6 +488,7 @@ static void unblockClient(redisClient *c); static int handleClientsWaitingListPush(redisClient *c, robj *key, robj *ele); static void vmInit(void); static void vmMarkPagesFree(off_t page, off_t count); +static robj *vmLoadObject(robj *key); static void authCommand(redisClient *c); static void pingCommand(redisClient *c); @@ -2359,11 +2360,21 @@ static void decrRefCount(void *obj) { static robj *lookupKey(redisDb *db, robj *key) { dictEntry *de = dictFind(db->dict,key); if (de) { - robj *o = dictGetEntryVal(de); + robj *key = dictGetEntryKey(de); + robj *val = dictGetEntryVal(de); - /* Update the access time of the key for the aging algorithm. */ - if (server.vm_enabled) o->vm.atime = server.unixtime; - return o; + if (server.vm_enabled) { + if (key->storage == REDIS_VM_MEMORY) { + /* Update the access time of the key for the aging algorithm. */ + key->vm.atime = server.unixtime; + } else { + /* Our value was swapped on disk. Bring it at home. */ + assert(val == NULL); + val = vmLoadObject(key); + dictGetEntryVal(de) = val; + } + } + return val; } else { return NULL; }