X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/fab43727b43de73add99dfc3f25a69ac0777fd67..fda32cb6013c65f765fa9b203bed23e07d35ba59:/redis.c diff --git a/redis.c b/redis.c index 721a9125..380924de 100644 --- a/redis.c +++ b/redis.c @@ -27,7 +27,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#define REDIS_VERSION "1.3.12" +#define REDIS_VERSION "2.1.0" #include "fmacros.h" #include "config.h" @@ -2927,8 +2927,8 @@ static robj *createStringObjectFromLongLong(long long value) { incrRefCount(shared.integers[value]); o = shared.integers[value]; } else { - o = createObject(REDIS_STRING, NULL); if (value >= LONG_MIN && value <= LONG_MAX) { + o = createObject(REDIS_STRING, NULL); o->encoding = REDIS_ENCODING_INT; o->ptr = (void*)((long)value); } else { @@ -4180,7 +4180,6 @@ static int prepareForShutdown() { if (server.daemonize) unlink(server.pidfile); redisLog(REDIS_WARNING,"%zu bytes used at exit",zmalloc_used_memory()); - redisLog(REDIS_WARNING,"Server exit now, bye bye..."); } else { /* Ooops.. error saving! The best we can do is to continue * operating. Note that if there was a background saving process, @@ -4191,6 +4190,7 @@ static int prepareForShutdown() { return REDIS_ERR; } } + redisLog(REDIS_WARNING,"Server exit now, bye bye..."); return REDIS_OK; } @@ -5412,8 +5412,10 @@ static zskiplistNode *zslCreateNode(int level, double score, robj *obj) { zskiplistNode *zn = zmalloc(sizeof(*zn)); zn->forward = zmalloc(sizeof(zskiplistNode*) * level); - if (level > 0) + if (level > 1) zn->span = zmalloc(sizeof(unsigned int) * (level - 1)); + else + zn->span = NULL; zn->score = score; zn->obj = obj; return zn; @@ -10432,18 +10434,23 @@ static void computeDatasetDigest(unsigned char *final) { /* Iterate this DB writing every entry */ while((de = dictNext(di)) != NULL) { - robj *key, *o; + robj *key, *o, *kcopy; time_t expiretime; memset(digest,0,20); /* This key-val digest */ key = dictGetEntryKey(de); - mixObjectDigest(digest,key); - if (!server.vm_enabled || key->storage == REDIS_VM_MEMORY || - key->storage == REDIS_VM_SWAPPING) { + + if (!server.vm_enabled) { + mixObjectDigest(digest,key); o = dictGetEntryVal(de); - incrRefCount(o); } else { - o = vmPreviewObject(key); + /* Don't work with the key directly as when VM is active + * this is unsafe: TODO: fix decrRefCount to check if the + * count really reached 0 to avoid this mess */ + kcopy = dupStringObject(key); + mixObjectDigest(digest,kcopy); + o = lookupKeyRead(db,kcopy); + decrRefCount(kcopy); } aux = htonl(o->type); mixDigest(digest,&aux,sizeof(aux)); @@ -10512,7 +10519,6 @@ static void computeDatasetDigest(unsigned char *final) { } else { redisPanic("Unknown object type"); } - decrRefCount(o); /* If the key has an expire, add it to the mix */ if (expiretime != -1) xorDigest(digest,"!!expire!!",10); /* We can finally xor the key-val digest to the final digest */