diff options
author | antirez <antirez@gmail.com> | 2016-09-15 17:43:13 +0200 |
---|---|---|
committer | antirez <antirez@gmail.com> | 2016-09-15 17:43:13 +0200 |
commit | adcfb77b5bf273f5e4fc463edcc91045defb5cd9 (patch) | |
tree | 68ac06293eda3b7e840f423a2eb708a2bb55094b /src/object.c | |
parent | e9629e148bb445474e172134c1bc0d248adf2454 (diff) | |
download | redis-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.
Diffstat (limited to 'src/object.c')
-rw-r--r-- | src/object.c | 12 |
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"); |