summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2014-04-03 10:45:30 +0200
committerantirez <antirez@gmail.com>2014-04-16 15:26:09 +0200
commitb3baa5140350a2eac3a9ac0fcf424749754ee4a9 (patch)
treec52f2787d784060129360e8fb37953246cb8c7e2
parent348d5ea246b4fabb042c07aea777e4221b0be5b7 (diff)
downloadredis-b3baa5140350a2eac3a9ac0fcf424749754ee4a9.tar.gz
PFGETREG added for testing purposes.
The new command allows to get a dump of the registers stored into an HyperLogLog data structure for testing / debugging purposes.
-rw-r--r--src/hyperloglog.c40
-rw-r--r--src/redis.c3
-rw-r--r--src/redis.h1
3 files changed, 42 insertions, 2 deletions
diff --git a/src/hyperloglog.c b/src/hyperloglog.c
index 7fad34d5b..e3621ac95 100644
--- a/src/hyperloglog.c
+++ b/src/hyperloglog.c
@@ -630,7 +630,10 @@ void pfmergeCommand(redisClient *c) {
addReply(c,shared.ok);
}
-/* This command performs a self-test of the HLL registers implementation.
+/* ========================== Testing / Debugging ========================== */
+
+/* PFSELFTEST
+ * This command performs a self-test of the HLL registers implementation.
* Something that is not easy to test from within the outside. */
#define REDIS_HLL_TEST_CYCLES 1000
void pfselftestCommand(redisClient *c) {
@@ -701,3 +704,38 @@ void pfselftestCommand(redisClient *c) {
cleanup:
sdsfree(bitcounters);
}
+
+/* PFGETREG
+ * Return the registers values of the specified HLL. */
+void pfgetregCommand(redisClient *c) {
+ robj *o = lookupKeyRead(c->db,c->argv[1]);
+ uint8_t *registers;
+ int j;
+
+ if (o == NULL) {
+ addReplyError(c,"The specified key does not exist");
+ return;
+ } else {
+ /* Key exists, check type */
+ if (checkType(c,o,REDIS_STRING))
+ return;
+
+ /* If this is a string representing an HLL, the size should match
+ * exactly. */
+ if (stringObjectLen(o) != REDIS_HLL_SIZE) {
+ addReplyErrorFormat(c,
+ "PFCOUNT target key must contain a %d bytes string.",
+ REDIS_HLL_SIZE);
+ return;
+ }
+
+ registers = o->ptr;
+ addReplyMultiBulkLen(c,REDIS_HLL_REGISTERS);
+ for (j = 0; j < REDIS_HLL_REGISTERS; j++) {
+ uint8_t val;
+
+ HLL_GET_REGISTER(val,registers,j);
+ addReplyLongLong(c,val);
+ }
+ }
+}
diff --git a/src/redis.c b/src/redis.c
index 3e3d840c6..0df24a2b6 100644
--- a/src/redis.c
+++ b/src/redis.c
@@ -262,7 +262,8 @@ struct redisCommand redisCommandTable[] = {
{"pfselftest",pfselftestCommand,1,"r",0,NULL,0,0,0,0,0},
{"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}
+ {"pfmerge",pfmergeCommand,-2,"wm",0,NULL,1,-1,1,0,0},
+ {"pfgetreg",pfgetregCommand,2,"r",0,NULL,0,0,0,0,0}
};
/*============================ Utility functions ============================ */
diff --git a/src/redis.h b/src/redis.h
index 4f651a25e..536e1181a 100644
--- a/src/redis.h
+++ b/src/redis.h
@@ -1355,6 +1355,7 @@ void pfselftestCommand(redisClient *c);
void pfaddCommand(redisClient *c);
void pfcountCommand(redisClient *c);
void pfmergeCommand(redisClient *c);
+void pfgetregCommand(redisClient *c);
#if defined(__GNUC__)
void *calloc(size_t count, size_t size) __attribute__ ((deprecated));