From f0b64adb32ab0e31b3560c0e81e9057ed6ff87c2 Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Sat, 7 Feb 2026 02:48:49 +0300 Subject: [PATCH] Fix removed inodes not disappearing from statistics in the new store --- src/blockstore/blockstore_heap.cpp | 8 +++++++- src/test/test_heap.cpp | 21 +++++++++++++++++++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/blockstore/blockstore_heap.cpp b/src/blockstore/blockstore_heap.cpp index 56b9bdb4..cb66c63a 100644 --- a/src/blockstore/blockstore_heap.cpp +++ b/src/blockstore/blockstore_heap.cpp @@ -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; } diff --git a/src/test/test_heap.cpp b/src/test/test_heap.cpp index dd06e9c2..80251c65 100644 --- a/src/test/test_heap.cpp +++ b/src/test/test_heap.cpp @@ -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");