mirror of https://mirror.osredm.com/root/redis.git
Memory Usage command LIST accuracy fix (#13783)
MEMORY USAGE on a List samples quicklist entries, but does not account to how many elements are in each sampled node. This can skew the calculation when the sampled nodes are not balanced. The fix calculate the average element size in the sampled nodes instead of the average node size.
This commit is contained in:
parent
7f5f588232
commit
57807cd338
|
@ -988,7 +988,7 @@ size_t objectComputeSize(robj *key, robj *o, size_t sample_size, int dbid) {
|
|||
dict *d;
|
||||
dictIterator *di;
|
||||
struct dictEntry *de;
|
||||
size_t asize = 0, elesize = 0, samples = 0;
|
||||
size_t asize = 0, elesize = 0, elecount = 0, samples = 0;
|
||||
|
||||
if (o->type == OBJ_STRING) {
|
||||
if(o->encoding == OBJ_ENCODING_INT) {
|
||||
|
@ -1007,9 +1007,10 @@ size_t objectComputeSize(robj *key, robj *o, size_t sample_size, int dbid) {
|
|||
asize = sizeof(*o)+sizeof(quicklist);
|
||||
do {
|
||||
elesize += sizeof(quicklistNode)+zmalloc_size(node->entry);
|
||||
elecount += node->count;
|
||||
samples++;
|
||||
} while ((node = node->next) && samples < sample_size);
|
||||
asize += (double)elesize/samples*ql->len;
|
||||
asize += (double)elesize/elecount*ql->count;
|
||||
} else if (o->encoding == OBJ_ENCODING_LISTPACK) {
|
||||
asize = sizeof(*o)+zmalloc_size(o->ptr);
|
||||
} else {
|
||||
|
|
Loading…
Reference in New Issue