diff --git a/src/core/compact_object.cc b/src/core/compact_object.cc index 6859991cc68d..d8dc08403df1 100644 --- a/src/core/compact_object.cc +++ b/src/core/compact_object.cc @@ -1623,11 +1623,18 @@ MemoryResource* CompactObj::memory_resource() { } bool CompactObj::JsonConsT::DefragIfNeeded(PageUsage* page_usage) { - if (JsonType* old = json_ptr; ShouldDefragment(page_usage)) { + JsonType* old = json_ptr; + if (const bool should_defragment = ShouldDefragment(page_usage); should_defragment) { + const MiMemoryResource* mr = static_cast(memory_resource()); + const ssize_t before = mr->used(); json_ptr = AllocateMR(DeepCopyJSON(old, memory_resource())); DeleteMR(old); + if (const ssize_t delta = mr->used() - before; delta != 0) { + bytes_used += delta; + } return true; } + return false; } diff --git a/src/server/engine_shard.cc b/src/server/engine_shard.cc index c6e32fe1b005..5870af502375 100644 --- a/src/server/engine_shard.cc +++ b/src/server/engine_shard.cc @@ -268,14 +268,19 @@ std::optional EngineShard::DoDefrag(CollectPageStats collect uint64_t attempts = 0; PageUsage page_usage{collect_page_stats, threshold}; + DbTableStats& table_stats = slice.GetDBTable(defrag_state_.dbid)->stats; do { cur = prime_table->Traverse(cur, [&](PrimeIterator it) { // for each value check whether we should move it because it // seats on underutilized page of memory, and if so, do it. - bool did = it->second.DefragIfNeeded(&page_usage); + const ssize_t original_size = it->second.MallocUsed(); + const bool did = it->second.DefragIfNeeded(&page_usage); attempts++; if (did) { reallocations++; + if (const ssize_t delta = it->second.MallocUsed() - original_size; delta != 0) { + table_stats.AddTypeMemoryUsage(it->second.ObjType(), delta); + } } }); traverses_count++;