Fix removed inodes not disappearing from statistics in the new store
This commit is contained in:
@@ -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
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user