| 583 | } |
| 584 | |
| 585 | long defragZsetSkiplist(redisDb *db, dictEntry *kde) { |
| 586 | robj *ob = (robj*)dictGetVal(kde); |
| 587 | long defragged = 0; |
| 588 | zset *zs = (zset*)ptrFromObj(ob); |
| 589 | zset *newzs; |
| 590 | zskiplist *newzsl; |
| 591 | dict *newdict; |
| 592 | dictEntry *de; |
| 593 | struct zskiplistNode *newheader; |
| 594 | serverAssert(ob->type == OBJ_ZSET && ob->encoding == OBJ_ENCODING_SKIPLIST); |
| 595 | if ((newzs = (zset*)activeDefragAlloc(zs))) |
| 596 | defragged++, ob->m_ptr = zs = newzs; |
| 597 | if ((newzsl = (zskiplist*)activeDefragAlloc(zs->zsl))) |
| 598 | defragged++, zs->zsl = newzsl; |
| 599 | if ((newheader = (zskiplistNode*)activeDefragAlloc(zs->zsl->header))) |
| 600 | defragged++, zs->zsl->header = newheader; |
| 601 | if (dictSize(zs->dict) > cserver.active_defrag_max_scan_fields) |
| 602 | defragLater(db, kde); |
| 603 | else { |
| 604 | dictIterator *di = dictGetIterator(zs->dict); |
| 605 | while((de = dictNext(di)) != NULL) { |
| 606 | defragged += activeDefragZsetEntry(zs, de); |
| 607 | } |
| 608 | dictReleaseIterator(di); |
| 609 | } |
| 610 | /* handle the dict struct */ |
| 611 | if ((newdict = (dict*)activeDefragAlloc(zs->dict))) |
| 612 | defragged++, zs->dict = newdict; |
| 613 | /* defrag the dict tables */ |
| 614 | defragged += dictDefragTables(zs->dict); |
| 615 | return defragged; |
| 616 | } |
| 617 | |
| 618 | long defragHash(redisDb *db, dictEntry *kde) { |
| 619 | long defragged = 0; |
no test coverage detected