From bfd5575425fd5954c2555085af2cebf04e4d7554 Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Sat, 28 Jun 2025 17:21:32 +0300 Subject: [PATCH] Use single add_used_space call instead of unmark+mark allocated_block --- src/blockstore/blockstore_heap.cpp | 54 +++++++++++------------------- src/blockstore/blockstore_heap.h | 3 +- 2 files changed, 20 insertions(+), 37 deletions(-) diff --git a/src/blockstore/blockstore_heap.cpp b/src/blockstore/blockstore_heap.cpp index 2b3f22fe..50bb8b4c 100644 --- a/src/blockstore/blockstore_heap.cpp +++ b/src/blockstore/blockstore_heap.cpp @@ -654,12 +654,12 @@ skip_object: memset(copy+block_offset, 0, dsk->meta_block_size-block_offset); } block_info[block_num] = { - .used_space = used_space, + .used_space = 0, .data = copy, }; if (block_offset > 0) { - mark_allocated_block(block_num); + add_used_space(block_num, used_space); } } return entries_loaded; @@ -804,10 +804,7 @@ bool blockstore_heap_t::recheck_small_writes(std::functionget_writes(), next_wr); obj->write_pos = next_wr ? (uint8_t*)next_wr - (uint8_t*)obj : NULL; obj->crc32c = obj->calc_crc32c(); - auto & inf = block_info.at(block_num); - unmark_allocated_block(block_num); - inf.used_space -= freed; - mark_allocated_block(block_num); + add_used_space(block_num, -freed); } } } @@ -1277,9 +1274,7 @@ int blockstore_heap_t::add_object(object_id oid, heap_write_t *wr, uint32_t *mod } new_entry->size = sizeof(heap_object_t); new_entry->crc32c = new_entry->calc_crc32c(); - unmark_allocated_block(block_num); - inf.used_space += sizeof(heap_object_t) + wr_size; - mark_allocated_block(block_num); + add_used_space(block_num, sizeof(heap_object_t) + wr_size); return 0; } @@ -1429,9 +1424,7 @@ int blockstore_heap_t::update_object(uint32_t block_num, heap_object_t *obj, hea compact_queue.push_back({ .oid = oid, .lsn = new_wr->lsn }); } // Change block free space - unmark_allocated_block(block_num); - inf.used_space += used_delta; - mark_allocated_block(block_num); + add_used_space(block_num, used_delta); return 0; } @@ -1492,10 +1485,8 @@ int blockstore_heap_t::post_stabilize(object_id oid, uint64_t version, uint32_t if (unstable_big_wr && unstable_big_wr->next()) { // Remove previous stable entry series - unmark_allocated_block(block_num); free_object_space(obj->inode, unstable_big_wr->next(), NULL); - inf.used_space -= free_writes(unstable_big_wr->next(), NULL); - mark_allocated_block(block_num); + add_used_space(block_num, -free_writes(unstable_big_wr->next(), NULL)); unstable_big_wr->next_pos = 0; } // Set the stability flag @@ -1560,14 +1551,12 @@ int blockstore_heap_t::post_rollback(object_id oid, uint64_t version, uint32_t * } else { - unmark_allocated_block(block_num); // Erase head versions heap_write_t *first_wr = obj->get_writes(); free_object_space(obj->inode, first_wr, wr); - inf.used_space -= free_writes(first_wr, wr); + add_used_space(block_num, -free_writes(first_wr, wr)); obj->write_pos = ((uint8_t*)wr - (uint8_t*)obj); obj->crc32c = obj->calc_crc32c(); - mark_allocated_block(block_num); } return 0; } @@ -1613,14 +1602,11 @@ int blockstore_heap_t::compact_object(object_id oid, uint64_t compact_lsn, uint8 return ENOENT; } mvcc_save_copy(obj); - auto & inf = block_info.at(block_num); int res = EAGAIN; uint32_t freed = compact_object_to(obj, compact_lsn, new_csums); if (freed) { - unmark_allocated_block(block_num); - inf.used_space -= freed; - mark_allocated_block(block_num); + add_used_space(block_num, -freed); res = 0; } return res; @@ -1694,23 +1680,26 @@ void blockstore_heap_t::erase_block_index(inode_t inode, uint64_t stripe) void blockstore_heap_t::erase_object(uint32_t block_num, heap_object_t *obj) { - auto & inf = block_info.at(block_num); - unmark_allocated_block(block_num); // Erase object erase_block_index(obj->inode, obj->stripe); free_object_space(obj->inode, obj->get_writes(), NULL); - inf.used_space -= free_writes(obj->get_writes(), NULL); + auto freed = free_writes(obj->get_writes(), NULL); auto obj_size = obj->size; memset((uint8_t*)obj, 0, obj_size); *((uint16_t*)obj) = FREE_SPACE_BIT | obj_size; - inf.used_space -= obj_size; - mark_allocated_block(block_num); + add_used_space(block_num, -obj_size-freed); } -void blockstore_heap_t::unmark_allocated_block(uint32_t block_num) +void blockstore_heap_t::add_used_space(uint32_t block_num, int32_t used_delta) { auto & inf = block_info.at(block_num); - meta_used_space -= inf.used_space; + meta_used_space += used_delta; + if (inf.used_space <= dsk->meta_block_size-target_block_free_space && + inf.used_space+used_delta <= dsk->meta_block_size-target_block_free_space) + { + inf.used_space += used_delta; + return; + } if (inf.used_space > dsk->meta_block_size-target_block_free_space) { meta_alloc_count--; @@ -1720,12 +1709,7 @@ void blockstore_heap_t::unmark_allocated_block(uint32_t block_num) .free_space = (uint32_t)(dsk->meta_block_size-inf.used_space), }); } -} - -void blockstore_heap_t::mark_allocated_block(uint32_t block_num) -{ - auto & inf = block_info.at(block_num); - meta_used_space += inf.used_space; + inf.used_space += used_delta; if (inf.used_space > dsk->meta_block_size-target_block_free_space) { meta_alloc_count++; diff --git a/src/blockstore/blockstore_heap.h b/src/blockstore/blockstore_heap.h index 9eb342e4..9224b060 100644 --- a/src/blockstore/blockstore_heap.h +++ b/src/blockstore/blockstore_heap.h @@ -179,8 +179,7 @@ class blockstore_heap_t void reindex_block(uint32_t block_num, heap_object_t *from_obj); void erase_block_index(inode_t inode, uint64_t stripe); void free_object_space(inode_t inode, heap_write_t *from, heap_write_t *to, int mode = 0); - void unmark_allocated_block(uint32_t block_num); - void mark_allocated_block(uint32_t block_num); + void add_used_space(uint32_t block_num, int32_t used_delta); public: blockstore_heap_t(blockstore_disk_t *dsk, uint8_t *buffer_area, int log_level = 0);