Skip to content

Commit 16f261d

Browse files
committed
core: Add defrag support for json objects
Signed-off-by: Abhijat Malviya <[email protected]>
1 parent 7e00d99 commit 16f261d

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

src/core/compact_object.cc

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
15881619
constexpr 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},

src/core/compact_object.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -491,18 +491,24 @@ class CompactObj {
491491
struct JsonConsT {
492492
JsonType* json_ptr;
493493
size_t bytes_used;
494+
495+
bool DefragIfNeeded(PageUsage* page_usage);
494496
};
495497

496498
struct FlatJsonT {
497499
uint32_t json_len;
498500
uint8_t* flat_ptr;
501+
502+
bool DefragIfNeeded(PageUsage* page_usage);
499503
};
500504

501505
struct JsonWrapper {
502506
union {
503507
JsonConsT cons;
504508
FlatJsonT flat;
505509
};
510+
511+
bool DefragIfNeeded(PageUsage* page_usage);
506512
};
507513

508514
// My main data structure. Union of representations.

0 commit comments

Comments
 (0)