From 5c86d9e7b03dbe6f10548d24ca92b6c96418fd3e Mon Sep 17 00:00:00 2001 From: antirez Date: Sun, 13 Apr 2014 23:01:21 +0200 Subject: PFDEBUG added, PFGETREG removed. PFDEBUG will be the interface to do debugging tasks with a key containing an HLL object. --- src/hyperloglog.c | 30 +++++++++++++++++++++++------- src/redis.c | 2 +- src/redis.h | 2 +- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/hyperloglog.c b/src/hyperloglog.c index 0f92ff50a..f99d188f8 100644 --- a/src/hyperloglog.c +++ b/src/hyperloglog.c @@ -1214,26 +1214,42 @@ cleanup: sdsfree(bitcounters); } -/* PFGETREG - * Return the registers values of the specified HLL. */ -void pfgetregCommand(redisClient *c) { - robj *o = lookupKeyRead(c->db,c->argv[1]); +/* PFDEBUG ... args ... + * Different debugging related operations about the HLL implementation. */ +void pfdebugCommand(redisClient *c) { + char *cmd = c->argv[1]->ptr; struct hllhdr *hdr; + robj *o; int j; + o = lookupKeyRead(c->db,c->argv[2]); if (o == NULL) { addReplyError(c,"The specified key does not exist"); return; - } else { - if (isHLLObjectOrReply(c,o) != REDIS_OK) return; + } + if (isHLLObjectOrReply(c,o) != REDIS_OK) return; + o = dbUnshareStringValue(c->db,c->argv[2],o); + hdr = o->ptr; + + /* PFDEBUG GETREG */ + if (!strcasecmp(cmd,"getreg")) { + if (c->argc != 3) goto arityerr; - hdr = o->ptr; addReplyMultiBulkLen(c,HLL_REGISTERS); + hllSparseToDense(o); for (j = 0; j < HLL_REGISTERS; j++) { uint8_t val; HLL_DENSE_GET_REGISTER(val,hdr->registers,j); addReplyLongLong(c,val); } + } else { + addReplyErrorFormat(c,"Unknown PFDEBUG subcommand '%s'", cmd); } + return; + +arityerr: + addReplyErrorFormat(c, + "Wrong number of arguments for the '%s' subcommand",cmd); } + diff --git a/src/redis.c b/src/redis.c index f34b648fa..8d1506116 100644 --- a/src/redis.c +++ b/src/redis.c @@ -265,7 +265,7 @@ struct redisCommand redisCommandTable[] = { {"pfadd",pfaddCommand,-2,"wm",0,NULL,1,1,1,0,0}, {"pfcount",pfcountCommand,2,"w",0,NULL,1,1,1,0,0}, {"pfmerge",pfmergeCommand,-2,"wm",0,NULL,1,-1,1,0,0}, - {"pfgetreg",pfgetregCommand,2,"r",0,NULL,0,0,0,0,0} + {"pfdebug",pfdebugCommand,-3,"r",0,NULL,0,0,0,0,0} }; /*============================ Utility functions ============================ */ diff --git a/src/redis.h b/src/redis.h index 418b0b23d..0c40a7f4f 100644 --- a/src/redis.h +++ b/src/redis.h @@ -1363,7 +1363,7 @@ void pfselftestCommand(redisClient *c); void pfaddCommand(redisClient *c); void pfcountCommand(redisClient *c); void pfmergeCommand(redisClient *c); -void pfgetregCommand(redisClient *c); +void pfdebugCommand(redisClient *c); #if defined(__GNUC__) void *calloc(size_t count, size_t size) __attribute__ ((deprecated)); -- cgit v1.2.1