]> git.saurik.com Git - redis.git/commitdiff
Fixed VM bugs introduced with the top level keys as sds strings changes
authorantirez <antirez@gmail.com>
Thu, 3 Jun 2010 16:15:56 +0000 (18:15 +0200)
committerantirez <antirez@gmail.com>
Thu, 3 Jun 2010 16:15:56 +0000 (18:15 +0200)
redis.c

diff --git a/redis.c b/redis.c
index 0a50852bb3c2b1d50e08e2c0dcf5e75fe000e3b2..35b9ba252c69070f2abe0966f130828d0460f846 100644 (file)
--- a/redis.c
+++ b/redis.c
@@ -9358,7 +9358,8 @@ static int vmSwapOneObject(int usethreads) {
     struct dictEntry *best = NULL;
     double best_swappability = 0;
     redisDb *best_db = NULL;
-    robj *key, *val;
+    robj *val;
+    sds key;
 
     for (j = 0; j < server.dbnum; j++) {
         redisDb *db = server.db+j;
@@ -9374,7 +9375,6 @@ static int vmSwapOneObject(int usethreads) {
 
             if (maxtries) maxtries--;
             de = dictGetRandomKey(db->dict);
-            key = dictGetEntryKey(de);
             val = dictGetEntryVal(de);
             /* Only swap objects that are currently in memory.
              *
@@ -9399,11 +9399,11 @@ static int vmSwapOneObject(int usethreads) {
     val = dictGetEntryVal(best);
 
     redisLog(REDIS_DEBUG,"Key with best swappability: %s, %f",
-        key->ptr, best_swappability);
+        key, best_swappability);
 
     /* Swap it */
     if (usethreads) {
-        vmSwapObjectThreaded(key,val,best_db);
+        vmSwapObjectThreaded(createStringObject(key,sdslen(key)),val,best_db);
         return REDIS_OK;
     } else {
         vmpointer *vp;
@@ -9489,7 +9489,7 @@ static void vmThreadedIOCompletedJob(aeEventLoop *el, int fd, void *privdata,
         /* Post process it in the main thread, as there are things we
          * can do just here to avoid race conditions and/or invasive locks */
         redisLog(REDIS_DEBUG,"COMPLETED Job type: %d, ID %p, key: %s", j->type, (void*)j->id, (unsigned char*)j->key->ptr);
-        de = dictFind(j->db->dict,j->key);
+        de = dictFind(j->db->dict,j->key->ptr);
         redisAssert(de != NULL);
         if (j->type == REDIS_IOJOB_LOAD) {
             redisDb *db;
@@ -9804,8 +9804,6 @@ static void queueIOJob(iojob *j) {
 static int vmSwapObjectThreaded(robj *key, robj *val, redisDb *db) {
     iojob *j;
 
-    assert(key->storage == REDIS_VM_MEMORY);
-
     j = zmalloc(sizeof(*j));
     j->type = REDIS_IOJOB_PREPARE_SWAP;
     j->db = db;