Use single add_used_space call instead of unmark+mark allocated_block

This commit is contained in:
Vitaliy Filippov
2025-12-02 01:52:11 +03:00
parent 85e61c9c31
commit bfd5575425
2 changed files with 20 additions and 37 deletions
+19 -35
View File
@@ -654,12 +654,12 @@ skip_object:
memset(copy+block_offset, 0, dsk->meta_block_size-block_offset); memset(copy+block_offset, 0, dsk->meta_block_size-block_offset);
} }
block_info[block_num] = { block_info[block_num] = {
.used_space = used_space, .used_space = 0,
.data = copy, .data = copy,
}; };
if (block_offset > 0) if (block_offset > 0)
{ {
mark_allocated_block(block_num); add_used_space(block_num, used_space);
} }
} }
return entries_loaded; return entries_loaded;
@@ -804,10 +804,7 @@ bool blockstore_heap_t::recheck_small_writes(std::function<void(uint64_t, uint64
uint32_t freed = free_writes(obj->get_writes(), next_wr); uint32_t freed = free_writes(obj->get_writes(), next_wr);
obj->write_pos = next_wr ? (uint8_t*)next_wr - (uint8_t*)obj : NULL; obj->write_pos = next_wr ? (uint8_t*)next_wr - (uint8_t*)obj : NULL;
obj->crc32c = obj->calc_crc32c(); obj->crc32c = obj->calc_crc32c();
auto & inf = block_info.at(block_num); add_used_space(block_num, -freed);
unmark_allocated_block(block_num);
inf.used_space -= freed;
mark_allocated_block(block_num);
} }
} }
} }
@@ -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->size = sizeof(heap_object_t);
new_entry->crc32c = new_entry->calc_crc32c(); new_entry->crc32c = new_entry->calc_crc32c();
unmark_allocated_block(block_num); add_used_space(block_num, sizeof(heap_object_t) + wr_size);
inf.used_space += sizeof(heap_object_t) + wr_size;
mark_allocated_block(block_num);
return 0; 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 }); compact_queue.push_back({ .oid = oid, .lsn = new_wr->lsn });
} }
// Change block free space // Change block free space
unmark_allocated_block(block_num); add_used_space(block_num, used_delta);
inf.used_space += used_delta;
mark_allocated_block(block_num);
return 0; 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()) if (unstable_big_wr && unstable_big_wr->next())
{ {
// Remove previous stable entry series // Remove previous stable entry series
unmark_allocated_block(block_num);
free_object_space(obj->inode, unstable_big_wr->next(), NULL); free_object_space(obj->inode, unstable_big_wr->next(), NULL);
inf.used_space -= free_writes(unstable_big_wr->next(), NULL); add_used_space(block_num, -free_writes(unstable_big_wr->next(), NULL));
mark_allocated_block(block_num);
unstable_big_wr->next_pos = 0; unstable_big_wr->next_pos = 0;
} }
// Set the stability flag // Set the stability flag
@@ -1560,14 +1551,12 @@ int blockstore_heap_t::post_rollback(object_id oid, uint64_t version, uint32_t *
} }
else else
{ {
unmark_allocated_block(block_num);
// Erase head versions // Erase head versions
heap_write_t *first_wr = obj->get_writes(); heap_write_t *first_wr = obj->get_writes();
free_object_space(obj->inode, first_wr, wr); 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->write_pos = ((uint8_t*)wr - (uint8_t*)obj);
obj->crc32c = obj->calc_crc32c(); obj->crc32c = obj->calc_crc32c();
mark_allocated_block(block_num);
} }
return 0; return 0;
} }
@@ -1613,14 +1602,11 @@ int blockstore_heap_t::compact_object(object_id oid, uint64_t compact_lsn, uint8
return ENOENT; return ENOENT;
} }
mvcc_save_copy(obj); mvcc_save_copy(obj);
auto & inf = block_info.at(block_num);
int res = EAGAIN; int res = EAGAIN;
uint32_t freed = compact_object_to(obj, compact_lsn, new_csums); uint32_t freed = compact_object_to(obj, compact_lsn, new_csums);
if (freed) if (freed)
{ {
unmark_allocated_block(block_num); add_used_space(block_num, -freed);
inf.used_space -= freed;
mark_allocated_block(block_num);
res = 0; res = 0;
} }
return res; 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) 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 object
erase_block_index(obj->inode, obj->stripe); erase_block_index(obj->inode, obj->stripe);
free_object_space(obj->inode, obj->get_writes(), NULL); 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; auto obj_size = obj->size;
memset((uint8_t*)obj, 0, obj_size); memset((uint8_t*)obj, 0, obj_size);
*((uint16_t*)obj) = FREE_SPACE_BIT | obj_size; *((uint16_t*)obj) = FREE_SPACE_BIT | obj_size;
inf.used_space -= obj_size; add_used_space(block_num, -obj_size-freed);
mark_allocated_block(block_num);
} }
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); 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) if (inf.used_space > dsk->meta_block_size-target_block_free_space)
{ {
meta_alloc_count--; 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), .free_space = (uint32_t)(dsk->meta_block_size-inf.used_space),
}); });
} }
} inf.used_space += used_delta;
void blockstore_heap_t::mark_allocated_block(uint32_t block_num)
{
auto & inf = block_info.at(block_num);
meta_used_space += inf.used_space;
if (inf.used_space > dsk->meta_block_size-target_block_free_space) if (inf.used_space > dsk->meta_block_size-target_block_free_space)
{ {
meta_alloc_count++; meta_alloc_count++;
+1 -2
View File
@@ -179,8 +179,7 @@ class blockstore_heap_t
void reindex_block(uint32_t block_num, heap_object_t *from_obj); void reindex_block(uint32_t block_num, heap_object_t *from_obj);
void erase_block_index(inode_t inode, uint64_t stripe); 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 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 add_used_space(uint32_t block_num, int32_t used_delta);
void mark_allocated_block(uint32_t block_num);
public: public:
blockstore_heap_t(blockstore_disk_t *dsk, uint8_t *buffer_area, int log_level = 0); blockstore_heap_t(blockstore_disk_t *dsk, uint8_t *buffer_area, int log_level = 0);