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);
|
inode = (INODE_POOL(inode) << POOL_ID_BITS);
|
||||||
assert(data_alloc->get(location / dsk->data_block_size));
|
assert(data_alloc->get(location / dsk->data_block_size));
|
||||||
data_alloc->set(location / dsk->data_block_size, false);
|
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;
|
data_used_space -= dsk->data_block_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+19
-2
@@ -260,19 +260,36 @@ void test_delete(bool csum)
|
|||||||
obj = heap.read_entry(oid);
|
obj = heap.read_entry(oid);
|
||||||
assert(obj);
|
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
|
// Now the trickiest part - check that the delete entry itself disappears
|
||||||
// when all previous entries disappear from the disk too. It happens only
|
// when all previous entries disappear from the disk too. It happens only
|
||||||
// during block defragmentation so we fill the block 0 to 100%
|
// 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;
|
int i = 0;
|
||||||
while (dsk.meta_block_size-heap.get_meta_block_used_space(0) >= heap.get_big_entry_size())
|
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++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
oid = { .inode = INODE_WITH_POOL(1, 1), .stripe = 0 };
|
||||||
obj = heap.read_entry(oid);
|
obj = heap.read_entry(oid);
|
||||||
assert(!obj);
|
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");
|
printf("OK test_delete %s\n", csum ? "csum" : "no_csum");
|
||||||
|
|||||||
Reference in New Issue
Block a user