@@ -1623,21 +1623,30 @@ 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) {
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
16431652bool CompactObj::FlatJsonT::DefragIfNeeded (PageUsage* page_usage) {
0 commit comments