mixDigest(digest,key,sdslen(key));
/* Make sure the key is loaded if VM is active */
- o = lookupKeyRead(db,keyobj);
+ o = dictGetEntryVal(de);
aux = htonl(o->type);
mixDigest(digest,&aux,sizeof(aux));
}
setTypeReleaseIterator(si);
} else if (o->type == REDIS_ZSET) {
- zset *zs = o->ptr;
- dictIterator *di = dictGetIterator(zs->dict);
- dictEntry *de;
+ unsigned char eledigest[20];
- while((de = dictNext(di)) != NULL) {
- robj *eleobj = dictGetEntryKey(de);
- double *score = dictGetEntryVal(de);
- unsigned char eledigest[20];
+ if (o->encoding == REDIS_ENCODING_ZIPLIST) {
+ unsigned char *zl = o->ptr;
+ unsigned char *eptr, *sptr;
+ unsigned char *vstr;
+ unsigned int vlen;
+ long long vll;
+ double score;
- snprintf(buf,sizeof(buf),"%.17g",*score);
- memset(eledigest,0,20);
- mixObjectDigest(eledigest,eleobj);
- mixDigest(eledigest,buf,strlen(buf));
- xorDigest(digest,eledigest,20);
+ eptr = ziplistIndex(zl,0);
+ redisAssert(eptr != NULL);
+ sptr = ziplistNext(zl,eptr);
+ redisAssert(sptr != NULL);
+
+ while (eptr != NULL) {
+ redisAssert(ziplistGet(eptr,&vstr,&vlen,&vll));
+ score = zzlGetScore(sptr);
+
+ memset(eledigest,0,20);
+ if (vstr != NULL) {
+ mixDigest(eledigest,vstr,vlen);
+ } else {
+ ll2string(buf,sizeof(buf),vll);
+ mixDigest(eledigest,buf,strlen(buf));
+ }
+
+ snprintf(buf,sizeof(buf),"%.17g",score);
+ mixDigest(eledigest,buf,strlen(buf));
+ xorDigest(digest,eledigest,20);
+ zzlNext(zl,&eptr,&sptr);
+ }
+ } else if (o->encoding == REDIS_ENCODING_SKIPLIST) {
+ zset *zs = o->ptr;
+ dictIterator *di = dictGetIterator(zs->dict);
+ dictEntry *de;
+
+ while((de = dictNext(di)) != NULL) {
+ robj *eleobj = dictGetEntryKey(de);
+ double *score = dictGetEntryVal(de);
+
+ snprintf(buf,sizeof(buf),"%.17g",*score);
+ memset(eledigest,0,20);
+ mixObjectDigest(eledigest,eleobj);
+ mixDigest(eledigest,buf,strlen(buf));
+ xorDigest(digest,eledigest,20);
+ }
+ dictReleaseIterator(di);
+ } else {
+ redisPanic("Unknown sorted set encoding");
}
- dictReleaseIterator(di);
} else if (o->type == REDIS_HASH) {
hashTypeIterator *hi;
robj *obj;
void debugCommand(redisClient *c) {
if (!strcasecmp(c->argv[1]->ptr,"segfault")) {
*((char*)-1) = 'x';
+ } else if (!strcasecmp(c->argv[1]->ptr,"flushcache")) {
+ if (!server.ds_enabled) {
+ addReplyError(c, "DEBUG FLUSHCACHE called with diskstore off.");
+ return;
+ } else if (server.bgsavethread != (pthread_t) -1) {
+ addReplyError(c, "Can't flush cache while BGSAVE is in progress.");
+ return;
+ } else {
+ /* To flush the whole cache we need to wait for everything to
+ * be flushed on disk... */
+ cacheForcePointInTime();
+ emptyDb();
+ addReply(c,shared.ok);
+ return;
+ }
} else if (!strcasecmp(c->argv[1]->ptr,"reload")) {
+ if (server.ds_enabled) {
+ addReply(c,shared.ok);
+ return;
+ }
if (rdbSave(server.dbfilename) != REDIS_OK) {
addReply(c,shared.err);
return;
redisLog(REDIS_WARNING,"Append Only File loaded by DEBUG LOADAOF");
addReply(c,shared.ok);
} else if (!strcasecmp(c->argv[1]->ptr,"object") && c->argc == 3) {
- dictEntry *de = dictFind(c->db->dict,c->argv[2]->ptr);
+ dictEntry *de;
robj *val;
char *strenc;
- char *storage;
- if (!de) {
+ if (server.ds_enabled) lookupKeyRead(c->db,c->argv[2]);
+ if ((de = dictFind(c->db->dict,c->argv[2]->ptr)) == NULL) {
addReply(c,shared.nokeyerr);
return;
}
val = dictGetEntryVal(de);
strenc = strEncoding(val->encoding);
- switch(val->storage) {
- case REDIS_DS_MEMORY: storage = "memory"; break;
- case REDIS_DS_DIRTY: storage = "dirty"; break;
- case REDIS_DS_SAVING: storage = "saving"; break;
- default: storage = "unknown"; break;
- }
+
addReplyStatusFormat(c,
"Value at:%p refcount:%d "
"encoding:%s serializedlength:%lld "
- "lru:%d lru_seconds_idle:%lu storage:%s",
+ "lru:%d lru_seconds_idle:%lu",
(void*)val, val->refcount,
strenc, (long long) rdbSavedObjectLen(val),
- val->lru, estimateObjectIdleTime(val), storage);
+ val->lru, estimateObjectIdleTime(val));
} else if (!strcasecmp(c->argv[1]->ptr,"populate") && c->argc == 3) {
long keys, j;
robj *key, *val;
}
void _redisPanic(char *msg, char *file, int line) {
+ redisLog(REDIS_WARNING,"------------------------------------------------");
redisLog(REDIS_WARNING,"!!! Software Failure. Press left mouse button to continue");
redisLog(REDIS_WARNING,"Guru Meditation: %s #%s:%d",msg,file,line);
#ifdef HAVE_BACKTRACE
redisLog(REDIS_WARNING,"(forcing SIGSEGV in order to print the stack trace)");
+ redisLog(REDIS_WARNING,"------------------------------------------------");
*((char*)-1) = 'x';
#endif
}