]> git.saurik.com Git - redis.git/blobdiff - src/debug.c
DUMP implemented, RESTORE and MIGRATE fixed. Use zcalloc() instead of zmalloc()+memse...
[redis.git] / src / debug.c
index 88c88ca91afeebf61e84742fe26c3f5678b04d12..c1fc26cf671312786f789daae33d72ee1ace8dc7 100644 (file)
@@ -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
 }