@@ -1094,6 +1094,8 @@ bool CompactObj::DefragIfNeeded(PageUsage* page_usage) {
10941094 return false ;
10951095 case SMALL_TAG:
10961096 return u_.small_str .DefragIfNeeded (page_usage);
1097+ case JSON_TAG:
1098+ return u_.json_obj .DefragIfNeeded (page_usage);
10971099 case INT_TAG:
10981100 page_usage->RecordNotRequired ();
10991101 // this is not relevant in this case
@@ -1585,6 +1587,35 @@ MemoryResource* CompactObj::memory_resource() {
15851587 return tl.local_mr ;
15861588}
15871589
1590+ bool CompactObj::JsonConsT::DefragIfNeeded (PageUsage* page_usage) {
1591+ if (JsonType* old = json_ptr; page_usage->IsPageForObjectUnderUtilized (old)) {
1592+ json_ptr = AllocateMR<JsonType>(std::move (*old));
1593+ DeleteMR<JsonType>(old);
1594+ return true ;
1595+ }
1596+ return false ;
1597+ }
1598+
1599+ bool CompactObj::FlatJsonT::DefragIfNeeded (PageUsage* page_usage) {
1600+ if (uint8_t * old = flat_ptr; page_usage->IsPageForObjectUnderUtilized (old)) {
1601+ const uint32_t size = json_len;
1602+ flat_ptr = static_cast <uint8_t *>(tl.local_mr ->allocate (size, kAlignSize ));
1603+ memcpy (flat_ptr, old, size);
1604+ tl.local_mr ->deallocate (old, size, kAlignSize );
1605+ return true ;
1606+ }
1607+
1608+ return false ;
1609+ }
1610+
1611+ bool CompactObj::JsonWrapper::DefragIfNeeded (PageUsage* page_usage) {
1612+ if (JsonEnconding () == kEncodingJsonCons ) {
1613+ return cons.DefragIfNeeded (page_usage);
1614+ }
1615+
1616+ return flat.DefragIfNeeded (page_usage);
1617+ }
1618+
15881619constexpr std::pair<CompactObjType, std::string_view> kObjTypeToString [8 ] = {
15891620 {OBJ_STRING, " string" sv}, {OBJ_LIST, " list" sv}, {OBJ_SET, " set" sv},
15901621 {OBJ_ZSET, " zset" sv}, {OBJ_HASH, " hash" sv}, {OBJ_STREAM, " stream" sv},
0 commit comments