Fix removed inodes not disappearing from statistics in the new store

This commit is contained in:
Vitaliy Filippov
2026-02-07 02:48:49 +03:00
parent f06d64d879
commit f0b64adb32
2 changed files with 26 additions and 3 deletions
+7 -1
View File
@@ -2027,7 +2027,13 @@ void blockstore_heap_t::free_data(inode_t inode, uint64_t location)
inode = (INODE_POOL(inode) << POOL_ID_BITS);
assert(data_alloc->get(location / dsk->data_block_size));
data_alloc->set(location / dsk->data_block_size, false);
inode_space_stats[inode] -= dsk->data_block_size;
auto sp_it = inode_space_stats.find(inode);
if (sp_it != inode_space_stats.end())
{
sp_it->second -= dsk->data_block_size;
if (sp_it->second == 0)
inode_space_stats.erase(sp_it);
}
data_used_space -= dsk->data_block_size;
}
+19 -2
View File
@@ -260,19 +260,36 @@ void test_delete(bool csum)
obj = heap.read_entry(oid);
assert(obj);
assert(heap.get_meta_block_used_space(0) == heap.get_big_entry_size() + heap.get_simple_entry_size());
oid = { .inode = INODE_WITH_POOL(1, 1), .stripe = 0x20000 };
obj = heap.read_entry(oid);
res = heap.add_delete(obj, &mblock);
assert(mblock == 0);
assert(res == 0);
heap.start_block_write(mblock);
heap.complete_block_write(mblock);
// Now the trickiest part - check that the delete entry itself disappears
// when all previous entries disappear from the disk too. It happens only
// during block defragmentation so we fill the block 0 to 100%
assert(heap.get_meta_block_used_space(0) == heap.get_big_entry_size() + heap.get_simple_entry_size());
assert(heap.get_meta_block_used_space(0) == heap.get_simple_entry_size());
int i = 0;
while (dsk.meta_block_size-heap.get_meta_block_used_space(0) >= heap.get_big_entry_size())
{
_test_big_write(heap, dsk, 1, 0x40000+0x20000*i, 1, 0x60000+0x20000*i, true, 0, 0, buffer_area.data());
_test_big_write(heap, dsk, 2, 0x40000+0x20000*i, 1, 0x60000+0x20000*i, true, 0, 0, buffer_area.data());
i++;
}
oid = { .inode = INODE_WITH_POOL(1, 1), .stripe = 0 };
obj = heap.read_entry(oid);
assert(!obj);
oid = { .inode = INODE_WITH_POOL(1, 1), .stripe = 0x20000 };
obj = heap.read_entry(oid);
assert(!obj);
// Check that inode 1 is removed from statistics
assert(space.find(INODE_WITH_POOL(1, 1)) == space.end());
}
printf("OK test_delete %s\n", csum ? "csum" : "no_csum");