@@ -1623,21 +1623,31 @@ MemoryResource* CompactObj::memory_resource() {
16231623}
16241624
16251625bool 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
16431653bool CompactObj::FlatJsonT::DefragIfNeeded (PageUsage* page_usage) {
0 commit comments