]> git.saurik.com Git - redis.git/blobdiff - src/debug.c
redisServer structure fields reordered for clarity
[redis.git] / src / debug.c
index 2f7ab58f1f4b5926186627adc278ced985d4d327..c1fc26cf671312786f789daae33d72ee1ace8dc7 100644 (file)
@@ -121,7 +121,7 @@ void computeDatasetDigest(unsigned char *final) {
             } else if (o->type == REDIS_SET) {
                 setTypeIterator *si = setTypeInitIterator(o);
                 robj *ele;
             } else if (o->type == REDIS_SET) {
                 setTypeIterator *si = setTypeInitIterator(o);
                 robj *ele;
-                while((ele = setTypeNext(si)) != NULL) {
+                while((ele = setTypeNextObject(si)) != NULL) {
                     xorObjectDigest(digest,ele);
                     decrRefCount(ele);
                 }
                     xorObjectDigest(digest,ele);
                     decrRefCount(ele);
                 }
@@ -152,10 +152,10 @@ void computeDatasetDigest(unsigned char *final) {
                     unsigned char eledigest[20];
 
                     memset(eledigest,0,20);
                     unsigned char eledigest[20];
 
                     memset(eledigest,0,20);
-                    obj = hashTypeCurrent(hi,REDIS_HASH_KEY);
+                    obj = hashTypeCurrentObject(hi,REDIS_HASH_KEY);
                     mixObjectDigest(eledigest,obj);
                     decrRefCount(obj);
                     mixObjectDigest(eledigest,obj);
                     decrRefCount(obj);
-                    obj = hashTypeCurrent(hi,REDIS_HASH_VALUE);
+                    obj = hashTypeCurrentObject(hi,REDIS_HASH_VALUE);
                     mixObjectDigest(eledigest,obj);
                     decrRefCount(obj);
                     xorDigest(digest,eledigest,20);
                     mixObjectDigest(eledigest,obj);
                     decrRefCount(obj);
                     xorDigest(digest,eledigest,20);
@@ -177,7 +177,26 @@ void computeDatasetDigest(unsigned char *final) {
 void debugCommand(redisClient *c) {
     if (!strcasecmp(c->argv[1]->ptr,"segfault")) {
         *((char*)-1) = 'x';
 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")) {
     } 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;
         if (rdbSave(server.dbfilename) != REDIS_OK) {
             addReply(c,shared.err);
             return;
@@ -198,60 +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) {
         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;
         robj *val;
+        char *strenc;
 
 
-        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);
             addReply(c,shared.nokeyerr);
             return;
         }
         val = dictGetEntryVal(de);
-        if (!server.vm_enabled || (val->storage == REDIS_VM_MEMORY ||
-                                   val->storage == REDIS_VM_SWAPPING)) {
-            char *strenc;
-
-            strenc = strEncoding(val->encoding);
-            addReplyStatusFormat(c,
-                "Value at:%p refcount:%d "
-                "encoding:%s serializedlength:%lld",
-                (void*)val, val->refcount,
-                strenc, (long long) rdbSavedObjectLen(val,NULL));
-        } else {
-            vmpointer *vp = (vmpointer*) val;
-            addReplyStatusFormat(c,
-                "Value swapped at: page %llu "
-                "using %llu pages",
-                (unsigned long long) vp->page,
-                (unsigned long long) vp->usedpages);
-        }
-    } else if (!strcasecmp(c->argv[1]->ptr,"swapin") && c->argc == 3) {
-        lookupKeyRead(c->db,c->argv[2]);
-        addReply(c,shared.ok);
-    } else if (!strcasecmp(c->argv[1]->ptr,"swapout") && c->argc == 3) {
-        dictEntry *de = dictFind(c->db->dict,c->argv[2]->ptr);
-        robj *val;
-        vmpointer *vp;
-
-        if (!server.vm_enabled) {
-            addReplyError(c,"Virtual Memory is disabled");
-            return;
-        }
-        if (!de) {
-            addReply(c,shared.nokeyerr);
-            return;
-        }
-        val = dictGetEntryVal(de);
-        /* Swap it */
-        if (val->storage != REDIS_VM_MEMORY) {
-            addReplyError(c,"This key is not in memory");
-        } else if (val->refcount != 1) {
-            addReplyError(c,"Object is shared");
-        } else if ((vp = vmSwapObjectBlocking(val)) != NULL) {
-            dictGetEntryVal(de) = vp;
-            addReply(c,shared.ok);
-        } else {
-            addReply(c,shared.err);
-        }
+        strenc = strEncoding(val->encoding);
+
+        addReplyStatusFormat(c,
+            "Value at:%p refcount:%d "
+            "encoding:%s serializedlength:%lld "
+            "lru:%d lru_seconds_idle:%lu",
+            (void*)val, val->refcount,
+            strenc, (long long) rdbSavedObjectLen(val),
+            val->lru, estimateObjectIdleTime(val));
     } else if (!strcasecmp(c->argv[1]->ptr,"populate") && c->argc == 3) {
         long keys, j;
         robj *key, *val;
     } else if (!strcasecmp(c->argv[1]->ptr,"populate") && c->argc == 3) {
         long keys, j;
         robj *key, *val;
@@ -298,10 +282,12 @@ void _redisAssert(char *estr, char *file, int line) {
 }
 
 void _redisPanic(char *msg, 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,"!!! 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
 }
     *((char*)-1) = 'x';
 #endif
 }