X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/5ef640986bc507079506bf77fd22ab31ea3f4fc4..8218db3dae220409f239a5a0adb47d106b178bf9:/src/debug.c diff --git a/src/debug.c b/src/debug.c index 88c88ca9..c1fc26cf 100644 --- a/src/debug.c +++ b/src/debug.c @@ -177,7 +177,26 @@ void computeDatasetDigest(unsigned char *final) { 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; @@ -198,30 +217,25 @@ void debugCommand(redisClient *c) { 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; @@ -268,10 +282,12 @@ void _redisAssert(char *estr, char *file, int line) { } 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 }