Mark overwritten heap_writes as immediately compacted
This commit is contained in:
@@ -1146,6 +1146,7 @@ void blockstore_heap_t::compact_block(uint32_t block_num)
|
|||||||
*((uint16_t*)cur) = FREE_SPACE_BIT | (dsk->meta_block_size-(cur-new_data));
|
*((uint16_t*)cur) = FREE_SPACE_BIT | (dsk->meta_block_size-(cur-new_data));
|
||||||
memset(cur+2, 0, dsk->meta_block_size-(cur-new_data)-2);
|
memset(cur+2, 0, dsk->meta_block_size-(cur-new_data)-2);
|
||||||
}
|
}
|
||||||
|
free(inf.data);
|
||||||
inf.data = new_data;
|
inf.data = new_data;
|
||||||
inf.free_pos = cur-new_data;
|
inf.free_pos = cur-new_data;
|
||||||
assert(inf.used_space == (cur-new_data));
|
assert(inf.used_space == (cur-new_data));
|
||||||
@@ -1417,13 +1418,23 @@ int blockstore_heap_t::update_object(uint32_t block_num, heap_object_t *obj, hea
|
|||||||
mvcc_buffer_refs[wr->location]++;
|
mvcc_buffer_refs[wr->location]++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
const uint8_t *old_data = inf.data;
|
||||||
const uint32_t offset = find_block_space(block_num, wr_size);
|
const uint32_t offset = find_block_space(block_num, wr_size);
|
||||||
|
if (old_data != inf.data)
|
||||||
|
{
|
||||||
|
obj = read_entry(oid, NULL);
|
||||||
|
}
|
||||||
assert(offset != UINT32_MAX);
|
assert(offset != UINT32_MAX);
|
||||||
memcpy(inf.data + offset, wr, wr_size);
|
memcpy(inf.data + offset, wr, wr_size);
|
||||||
heap_write_t *new_wr = (heap_write_t*)(inf.data + offset);
|
heap_write_t *new_wr = (heap_write_t*)(inf.data + offset);
|
||||||
int32_t used_delta = wr_size;
|
int32_t used_delta = wr_size;
|
||||||
if (is_overwrite)
|
if (is_overwrite)
|
||||||
{
|
{
|
||||||
|
for (auto wr = obj->get_writes(); wr; wr = wr->next())
|
||||||
|
{
|
||||||
|
if (wr->needs_compact(0))
|
||||||
|
mark_lsn_compacted(wr->lsn);
|
||||||
|
}
|
||||||
free_object_space(obj->inode, obj->get_writes(), NULL);
|
free_object_space(obj->inode, obj->get_writes(), NULL);
|
||||||
// Free old write entries
|
// Free old write entries
|
||||||
used_delta -= free_writes(obj->get_writes(), NULL);
|
used_delta -= free_writes(obj->get_writes(), NULL);
|
||||||
@@ -1735,6 +1746,11 @@ 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)
|
||||||
{
|
{
|
||||||
// Erase object
|
// Erase object
|
||||||
|
for (auto wr = obj->get_writes(); wr; wr = wr->next())
|
||||||
|
{
|
||||||
|
if (wr->needs_compact(0))
|
||||||
|
mark_lsn_compacted(wr->lsn);
|
||||||
|
}
|
||||||
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);
|
||||||
auto freed = free_writes(obj->get_writes(), NULL);
|
auto freed = free_writes(obj->get_writes(), NULL);
|
||||||
|
|||||||
Reference in New Issue
Block a user