summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2016-09-15 17:43:13 +0200
committerantirez <antirez@gmail.com>2016-09-15 17:43:13 +0200
commitadcfb77b5bf273f5e4fc463edcc91045defb5cd9 (patch)
tree68ac06293eda3b7e840f423a2eb708a2bb55094b
parente9629e148bb445474e172134c1bc0d248adf2454 (diff)
downloadredis-adcfb77b5bf273f5e4fc463edcc91045defb5cd9.tar.gz
objectComputeSize(): skiplist nodes have different sizes.
The size of the node depends on the node level, however it is not stored into the node itself, is an implicit information, so we use zmalloc_size() in order to compute the sorted set size.
-rw-r--r--src/object.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/src/object.c b/src/object.c
index 02d023248..cfeba5a43 100644
--- a/src/object.c
+++ b/src/object.c
@@ -754,15 +754,15 @@ size_t objectComputeSize(robj *o, size_t sample_size) {
asize = sizeof(*o)+(ziplistBlobLen(o->ptr));
} else if (o->encoding == OBJ_ENCODING_SKIPLIST) {
d = ((zset*)o->ptr)->dict;
- di = dictGetIterator(d);
+ zskiplist *zsl = ((zset*)o->ptr)->zsl;
+ zskiplistNode *znode = zsl->header->level[0].forward;
asize = sizeof(*o)+sizeof(zset)+(sizeof(struct dictEntry*)*dictSlots(d));
- while((de = dictNext(di)) != NULL && samples < sample_size) {
- ele = dictGetKey(de);
- elesize += sdsAllocSize(ele);
- elesize += sizeof(struct dictEntry) + sizeof(zskiplistNode);
+ while(znode != NULL && samples < sample_size) {
+ elesize += sdsAllocSize(znode->ele);
+ elesize += sizeof(struct dictEntry) + zmalloc_size(znode);
samples++;
+ znode = znode->level[0].forward;
}
- dictReleaseIterator(di);
if (samples) asize += (double)elesize/samples*dictSize(d);
} else {
serverPanic("Unknown sorted set encoding");