diff options
author | antirez <antirez@gmail.com> | 2018-12-07 16:41:54 +0100 |
---|---|---|
committer | antirez <antirez@gmail.com> | 2018-12-07 16:41:54 +0100 |
commit | 5a0b7212c9c3a672cb47fa2a773bc6cf1c2c4f17 (patch) | |
tree | a8a84b6d9f29bc2be45f2e77360f170bb11a4ef9 | |
parent | e9400e8efdad01c93b80624805b7ddb2d7ec99ec (diff) | |
download | redis-5a0b7212c9c3a672cb47fa2a773bc6cf1c2c4f17.tar.gz |
DEBUG DIGEST-VALUE implemented.
-rw-r--r-- | src/debug.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/src/debug.c b/src/debug.c index 3c2e7fd55..5b4c803db 100644 --- a/src/debug.c +++ b/src/debug.c @@ -304,6 +304,7 @@ void debugCommand(client *c) { "CHANGE-REPL-ID -- Change the replication IDs of the instance. Dangerous, should be used only for testing the replication subsystem.", "CRASH-AND-RECOVER <milliseconds> -- Hard crash and restart after <milliseconds> delay.", "DIGEST -- Output a hex signature representing the current DB content.", +"DIGEST-VALUE <key-1> ... <key-N>-- Output a hex signature of the values of all the specified keys.", "ERROR <string> -- Return a Redis protocol error with <string> as message. Useful for clients unit tests to simulate Redis errors.", "LOG <message> -- write message to the server log.", "HTSTATS <dbid> -- Return hash table statistics of the specified Redis database.", @@ -506,15 +507,28 @@ NULL } addReply(c,shared.ok); } else if (!strcasecmp(c->argv[1]->ptr,"digest") && c->argc == 2) { + /* DEBUG DIGEST (form without keys specified) */ unsigned char digest[20]; sds d = sdsempty(); - int j; computeDatasetDigest(digest); - for (j = 0; j < 20; j++) - d = sdscatprintf(d, "%02x",digest[j]); + for (int i = 0; i < 20; i++) d = sdscatprintf(d, "%02x",digest[i]); addReplyStatus(c,d); sdsfree(d); + } else if (!strcasecmp(c->argv[1]->ptr,"digest-value") && c->argc >= 2) { + /* DEBUG DIGEST-VALUE key key key ... key. */ + addReplyMultiBulkLen(c,c->argc-2); + for (int j = 2; j < c->argc; j++) { + unsigned char digest[20]; + memset(digest,0,20); /* Start with a clean result */ + robj *o = lookupKeyReadWithFlags(c->db,c->argv[j],LOOKUP_NOTOUCH); + if (o) xorObjectDigest(c->db,c->argv[j],digest,o); + + sds d = sdsempty(); + for (int i = 0; i < 20; i++) d = sdscatprintf(d, "%02x",digest[i]); + addReplyStatus(c,d); + sdsfree(d); + } } else if (!strcasecmp(c->argv[1]->ptr,"sleep") && c->argc == 3) { double dtime = strtod(c->argv[2]->ptr,NULL); long long utime = dtime*1000000; |