Skip to content

Commit 3ff681f

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

File tree

3 files changed

+22
-8
lines changed

3 files changed

+22
-8
lines changed

src/core/compact_object.cc

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1623,21 +1623,31 @@ 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) {
1628+
const MiMemoryResource* mr = static_cast<MiMemoryResource*>(CompactObj::memory_resource());
1629+
const ssize_t before = mr->used();
16271630
json_ptr = AllocateMR<JsonType>(DeepCopyJSON(old, memory_resource()));
16281631
DeleteMR<JsonType>(old);
1632+
const ssize_t after = mr->used();
1633+
if (const ssize_t delta = after - before; delta != 0) {
1634+
bytes_used += delta;
1635+
page_usage->RecordChangeInSize(OBJ_JSON, delta);
1636+
}
16291637
return true;
16301638
}
1639+
16311640
return false;
16321641
}
16331642

1634-
bool CompactObj::JsonConsT::ShouldDefragment(PageUsage* page_usage) const {
1643+
std::pair<bool, ssize_t> CompactObj::JsonConsT::ShouldDefragment(PageUsage* page_usage) const {
16351644
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;
1645+
const size_t old_size =
1646+
json_ptr->compute_memory_size([&page_usage, &should_defragment](const void* p) {
1647+
should_defragment |= page_usage->IsPageForObjectUnderUtilized(const_cast<void*>(p));
1648+
return p ? mi_usable_size(p) : 0;
1649+
});
1650+
return {should_defragment, old_size};
16411651
}
16421652

16431653
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)