Skip to content

Commit fc2829d

Browse files
committed
core: Record change in json object size on defragmentation
Signed-off-by: Abhijat Malviya <[email protected]>
1 parent 129d691 commit fc2829d

File tree

3 files changed

+21
-8
lines changed

3 files changed

+21
-8
lines changed

src/core/compact_object.cc

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1623,21 +1623,30 @@ MemoryResource* CompactObj::memory_resource() {
16231623
}
16241624

16251625
bool CompactObj::JsonConsT::DefragIfNeeded(PageUsage* page_usage) {
1626-
if (JsonType* old = json_ptr; ShouldDefragment(page_usage)) {
1626+
JsonType* old = json_ptr;
1627+
if (auto [should_defragment, old_size] = ShouldDefragment(page_usage); should_defragment) {
16271628
json_ptr = AllocateMR<JsonType>(DeepCopyJSON(old, memory_resource()));
16281629
DeleteMR<JsonType>(old);
1630+
const ssize_t new_size =
1631+
json_ptr->compute_memory_size([](const void* p) { return p ? mi_usable_size(p) : 0; });
1632+
if (new_size != old_size) {
1633+
page_usage->RecordChangeInSize(OBJ_JSON, new_size - old_size);
1634+
}
1635+
16291636
return true;
16301637
}
1638+
16311639
return false;
16321640
}
16331641

1634-
bool CompactObj::JsonConsT::ShouldDefragment(PageUsage* page_usage) const {
1642+
std::pair<bool, ssize_t> CompactObj::JsonConsT::ShouldDefragment(PageUsage* page_usage) const {
16351643
bool should_defragment = false;
1636-
json_ptr->compute_memory_size([&page_usage, &should_defragment](const void* p) {
1637-
should_defragment |= page_usage->IsPageForObjectUnderUtilized(const_cast<void*>(p));
1638-
return 0;
1639-
});
1640-
return should_defragment;
1644+
const size_t old_size =
1645+
json_ptr->compute_memory_size([&page_usage, &should_defragment](const void* p) {
1646+
should_defragment |= page_usage->IsPageForObjectUnderUtilized(const_cast<void*>(p));
1647+
return p ? mi_usable_size(p) : 0;
1648+
});
1649+
return {should_defragment, old_size};
16411650
}
16421651

16431652
bool CompactObj::FlatJsonT::DefragIfNeeded(PageUsage* page_usage) {

src/core/compact_object.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -497,7 +497,7 @@ class CompactObj {
497497

498498
// Computes if the contained object should be defragmented, by examining pointers within it and
499499
// returning true if any of them reside in an underutilized page.
500-
bool ShouldDefragment(PageUsage* page_usage) const;
500+
std::pair<bool, ssize_t> ShouldDefragment(PageUsage* page_usage) const;
501501
};
502502

503503
struct FlatJsonT {

src/server/engine_shard.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,7 @@ std::optional<CollectedPageStats> EngineShard::DoDefrag(CollectPageStats collect
268268
uint64_t attempts = 0;
269269

270270
PageUsage page_usage{collect_page_stats, threshold};
271+
DbTableStats& table_stats = slice.GetDBTable(defrag_state_.dbid)->stats;
271272
do {
272273
cur = prime_table->Traverse(cur, [&](PrimeIterator it) {
273274
// for each value check whether we should move it because it
@@ -276,6 +277,9 @@ std::optional<CollectedPageStats> EngineShard::DoDefrag(CollectPageStats collect
276277
attempts++;
277278
if (did) {
278279
reallocations++;
280+
if (const auto [type, delta] = page_usage.FetchAndResetDelta(); delta != 0) {
281+
table_stats.AddTypeMemoryUsage(type, delta);
282+
}
279283
}
280284
});
281285
traverses_count++;

0 commit comments

Comments
 (0)