From 91e05e1618a2db22b93d125d4f2b43daa6fe99d1 Mon Sep 17 00:00:00 2001 From: antirez Date: Mon, 14 Apr 2014 15:55:21 +0200 Subject: Added assertion in hllSparseAdd() when promotion to dense occurs. If we converted to dense, a register must be updated in the dense representation. --- src/hyperloglog.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/hyperloglog.c b/src/hyperloglog.c index fe1321513..b7c4b6cfe 100644 --- a/src/hyperloglog.c +++ b/src/hyperloglog.c @@ -865,7 +865,17 @@ updated: promote: /* Promote to dense representation. */ if (hllSparseToDense(o) == REDIS_ERR) return -1; /* Corrupted HLL. */ hdr = o->ptr; - return hllDenseAdd(hdr->registers, ele, elesize); + + /* We need to call hllDenseAdd() to perform the operation after the + * conversion. However the result must be 1, since if we need to + * convert from sparse to dense a register requires to be updated. + * + * Note that this in turn means that PFADD will make sure the command + * is propagated to slaves / AOF, so if there is a sparse -> dense + * convertion, it will be performed in all the slaves as well. */ + int dense_retval = hllDenseAdd(hdr->registers, ele, elesize); + redisAssert(dense_retval == 1); + return dense_retval; } /* Compute SUM(2^-reg) in the sparse representation. -- cgit v1.2.1