MCPcopy Create free account
hub / github.com/Snapchat/KeyDB / objectComputeSize

Function objectComputeSize

src/object.cpp:892–1054  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

890 * are checked and averaged to estimate the total size. */
891#define OBJ_COMPUTE_SIZE_DEF_SAMPLES 5 /* Default sample size. */
892size_t objectComputeSize(robj_roptr o, size_t sample_size) {
893 sds ele, ele2;
894 dict *d;
895 dictIterator *di;
896 struct dictEntry *de;
897 size_t asize = 0, elesize = 0, samples = 0;
898
899 if (o->type == OBJ_STRING) {
900 if(o->encoding == OBJ_ENCODING_INT) {
901 asize = sizeof(*o);
902 } else if(o->encoding == OBJ_ENCODING_RAW) {
903 asize = sdsZmallocSize((sds)szFromObj(o))+sizeof(*o);
904 } else if(o->encoding == OBJ_ENCODING_EMBSTR) {
905 asize = sdslen(szFromObj(o))+2+sizeof(*o);
906 } else {
907 serverPanic("Unknown string encoding");
908 }
909 } else if (o->type == OBJ_LIST) {
910 if (o->encoding == OBJ_ENCODING_QUICKLIST) {
911 quicklist *ql = (quicklist*)ptrFromObj(o);
912 quicklistNode *node = ql->head;
913 asize = sizeof(*o)+sizeof(quicklist);
914 do {
915 elesize += sizeof(quicklistNode)+ziplistBlobLen(node->zl);
916 samples++;
917 } while ((node = node->next) && samples < sample_size);
918 asize += (double)elesize/samples*ql->len;
919 } else if (o->encoding == OBJ_ENCODING_ZIPLIST) {
920 asize = sizeof(*o)+ziplistBlobLen((unsigned char*)ptrFromObj(o));
921 } else {
922 serverPanic("Unknown list encoding");
923 }
924 } else if (o->type == OBJ_SET) {
925 if (o->encoding == OBJ_ENCODING_HT) {
926 d = (dict*)ptrFromObj(o);
927 di = dictGetIterator(d);
928 asize = sizeof(*o)+sizeof(dict)+(sizeof(struct dictEntry*)*dictSlots(d));
929 while((de = dictNext(di)) != NULL && samples < sample_size) {
930 ele = (sds)dictGetKey(de);
931 elesize += sizeof(struct dictEntry) + sdsZmallocSize(ele);
932 samples++;
933 }
934 dictReleaseIterator(di);
935 if (samples) asize += (double)elesize/samples*dictSize(d);
936 } else if (o->encoding == OBJ_ENCODING_INTSET) {
937 intset *is = (intset*)ptrFromObj(o);
938 asize = sizeof(*o)+sizeof(*is)+(size_t)is->encoding*is->length;
939 } else {
940 serverPanic("Unknown set encoding");
941 }
942 } else if (o->type == OBJ_ZSET) {
943 if (o->encoding == OBJ_ENCODING_ZIPLIST) {
944 asize = sizeof(*o)+(ziplistBlobLen((unsigned char*)ptrFromObj(o)));
945 } else if (o->encoding == OBJ_ENCODING_SKIPLIST) {
946 d = ((zset*)ptrFromObj(o))->dict;
947 zskiplist *zsl = ((zset*)ptrFromObj(o))->zsl;
948 zskiplistNode *znode = zsl->header->level(0)->forward;
949 asize = sizeof(*o)+sizeof(zset)+sizeof(zskiplist)+sizeof(dict)+

Callers 1

memoryCommandFunction · 0.85

Calls 15

sdsZmallocSizeFunction · 0.85
szFromObjFunction · 0.85
sdslenFunction · 0.85
ptrFromObjFunction · 0.85
ziplistBlobLenFunction · 0.85
zmalloc_sizeFunction · 0.85
raxStartFunction · 0.85
raxSeekFunction · 0.85
raxNextFunction · 0.85
lpBytesFunction · 0.85
raxStopFunction · 0.85

Tested by

no test coverage detected