| 806 | * are checked and averaged to estimate the total size. */ |
| 807 | #define OBJ_COMPUTE_SIZE_DEF_SAMPLES 5 /* Default sample size. */ |
| 808 | size_t objectComputeSize(robj *o, size_t sample_size) { |
| 809 | sds ele, ele2; |
| 810 | dict *d; |
| 811 | dictIterator *di; |
| 812 | struct dictEntry *de; |
| 813 | size_t asize = 0, elesize = 0, samples = 0; |
| 814 | |
| 815 | if (o->type == OBJ_STRING) { |
| 816 | if(o->encoding == OBJ_ENCODING_INT) { |
| 817 | asize = sizeof(*o); |
| 818 | } else if(o->encoding == OBJ_ENCODING_RAW) { |
| 819 | asize = sdsZmallocSize(o->ptr)+sizeof(*o); |
| 820 | } else if(o->encoding == OBJ_ENCODING_EMBSTR) { |
| 821 | asize = sdslen(o->ptr)+2+sizeof(*o); |
| 822 | } else { |
| 823 | serverPanic("Unknown string encoding"); |
| 824 | } |
| 825 | } else if (o->type == OBJ_LIST) { |
| 826 | if (o->encoding == OBJ_ENCODING_QUICKLIST) { |
| 827 | quicklist *ql = o->ptr; |
| 828 | quicklistNode *node = ql->head; |
| 829 | asize = sizeof(*o)+sizeof(quicklist); |
| 830 | do { |
| 831 | elesize += sizeof(quicklistNode)+ziplistBlobLen(node->zl); |
| 832 | samples++; |
| 833 | } while ((node = node->next) && samples < sample_size); |
| 834 | asize += (double)elesize/samples*ql->len; |
| 835 | } else if (o->encoding == OBJ_ENCODING_ZIPLIST) { |
| 836 | asize = sizeof(*o)+ziplistBlobLen(o->ptr); |
| 837 | } else { |
| 838 | serverPanic("Unknown list encoding"); |
| 839 | } |
| 840 | } else if (o->type == OBJ_SET) { |
| 841 | if (o->encoding == OBJ_ENCODING_HT) { |
| 842 | d = o->ptr; |
| 843 | di = dictGetIterator(d); |
| 844 | asize = sizeof(*o)+sizeof(dict)+(sizeof(struct dictEntry*)*dictSlots(d)); |
| 845 | while((de = dictNext(di)) != NULL && samples < sample_size) { |
| 846 | ele = dictGetKey(de); |
| 847 | elesize += sizeof(struct dictEntry) + sdsZmallocSize(ele); |
| 848 | samples++; |
| 849 | } |
| 850 | dictReleaseIterator(di); |
| 851 | if (samples) asize += (double)elesize/samples*dictSize(d); |
| 852 | } else if (o->encoding == OBJ_ENCODING_INTSET) { |
| 853 | intset *is = o->ptr; |
| 854 | asize = sizeof(*o)+sizeof(*is)+(size_t)is->encoding*is->length; |
| 855 | } else { |
| 856 | serverPanic("Unknown set encoding"); |
| 857 | } |
| 858 | } else if (o->type == OBJ_ZSET) { |
| 859 | if (o->encoding == OBJ_ENCODING_ZIPLIST) { |
| 860 | asize = sizeof(*o)+(ziplistBlobLen(o->ptr)); |
| 861 | } else if (o->encoding == OBJ_ENCODING_SKIPLIST) { |
| 862 | d = ((zset*)o->ptr)->dict; |
| 863 | zskiplist *zsl = ((zset*)o->ptr)->zsl; |
| 864 | zskiplistNode *znode = zsl->header->level[0].forward; |
| 865 | asize = sizeof(*o)+sizeof(zset)+sizeof(zskiplist)+sizeof(dict)+ |
no test coverage detected