X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/83f39c7ab26e7f7cfa5fb59ca51b768e9ac0facb..16d778780eb865deefb2bfa024aef50926917eac:/src/db.c?ds=sidebyside diff --git a/src/db.c b/src/db.c index 470310a3..8ce5d673 100644 --- a/src/db.c +++ b/src/db.c @@ -11,30 +11,24 @@ robj *lookupKey(redisDb *db, robj *key) { if (de) { robj *val = dictGetEntryVal(de); - if (server.vm_enabled) { - if (val->storage == REDIS_VM_MEMORY || - val->storage == REDIS_VM_SWAPPING) - { - /* If we were swapping the object out, cancel the operation */ - if (val->storage == REDIS_VM_SWAPPING) - vmCancelThreadedIOJob(val); - /* Update the access time for the aging algorithm. */ - val->lru = server.lruclock; - } else { - int notify = (val->storage == REDIS_VM_LOADING); - - /* Our value was swapped on disk. Bring it at home. */ - redisAssert(val->type == REDIS_VMPOINTER); - val = vmLoadObject(val); - dictGetEntryVal(de) = val; - - /* Clients blocked by the VM subsystem may be waiting for - * this key... */ - if (notify) handleClientsBlockedOnSwappedKey(db,key); - } + /* Update the access time for the aging algorithm. + * Don't do it if we have a saving child, as this will trigger + * a copy on write madness. */ + if (server.bgsavechildpid == -1 && server.bgrewritechildpid == -1) + val->lru = server.lruclock; + + if (server.ds_enabled && val->storage == REDIS_DS_SAVING) { + /* FIXME: change this code to just wait for our object to + * get out of the IO Job. */ + waitEmptyIOJobsQueue(); + redisAssert(val->storage != REDIS_DS_SAVING); } + 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. */ + server.stat_keyspace_misses++; return NULL; } } @@ -127,7 +121,11 @@ int dbDelete(redisDb *db, robj *key) { * deleting the key will kill the I/O thread bringing the key from swap * to memory, so the client will never be notified and unblocked if we * don't do it now. */ - if (server.vm_enabled) handleClientsBlockedOnSwappedKey(db,key); + if (server.ds_enabled) handleClientsBlockedOnSwappedKey(db,key); + + /* FIXME: we need to delete the IO Job loading the key, or simply we can + * wait for it to finish. */ + /* Deleting an entry from the expires dict will not free the sds of * the key, because it is shared with the main dictionary. */ if (dictSize(db->expires) > 0) dictDelete(db->expires,key->ptr); @@ -429,16 +427,14 @@ time_t getExpire(redisDb *db, robj *key) { * will be consistent even if we allow write operations against expiring * keys. */ void propagateExpire(redisDb *db, robj *key) { - struct redisCommand *cmd; robj *argv[2]; - cmd = lookupCommand("del"); argv[0] = createStringObject("DEL",3); argv[1] = key; incrRefCount(key); if (server.appendonly) - feedAppendOnlyFile(cmd,db->id,argv,2); + feedAppendOnlyFile(server.delCommand,db->id,argv,2); if (listLength(server.slaves)) replicationFeedSlaves(server.slaves,db->id,argv,2); @@ -467,7 +463,6 @@ int expireIfNeeded(redisDb *db, robj *key) { /* Delete the key */ server.stat_expiredkeys++; - server.dirty++; propagateExpire(db,key); return dbDelete(db,key); } @@ -478,7 +473,7 @@ int expireIfNeeded(redisDb *db, robj *key) { void expireGenericCommand(redisClient *c, robj *key, robj *param, long offset) { dictEntry *de; - time_t seconds; + long seconds; if (getLongFromObjectOrReply(c, param, &seconds, NULL) != REDIS_OK) return;