Do not use pending_modified_blocks to check
This commit is contained in:
@@ -200,7 +200,7 @@ void blockstore_impl_t::loop()
|
|||||||
for (auto & block_num: pending_modified_blocks)
|
for (auto & block_num: pending_modified_blocks)
|
||||||
{
|
{
|
||||||
heap->start_block_write(block_num);
|
heap->start_block_write(block_num);
|
||||||
modified_blocks.insert(block_num);
|
modified_blocks[block_num] = true;
|
||||||
}
|
}
|
||||||
pending_modified_blocks.clear();
|
pending_modified_blocks.clear();
|
||||||
if ((initial_ring_space - ringloop->space_left()) > 0)
|
if ((initial_ring_space - ringloop->space_left()) > 0)
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ public:
|
|||||||
uint8_t *zero_object = NULL;
|
uint8_t *zero_object = NULL;
|
||||||
|
|
||||||
std::vector<uint32_t> pending_modified_blocks;
|
std::vector<uint32_t> pending_modified_blocks;
|
||||||
robin_hood::unordered_flat_set<uint32_t> modified_blocks;
|
robin_hood::unordered_flat_map<uint32_t, bool> modified_blocks;
|
||||||
|
|
||||||
journal_flusher_t *flusher;
|
journal_flusher_t *flusher;
|
||||||
int write_iodepth = 0;
|
int write_iodepth = 0;
|
||||||
|
|||||||
@@ -13,15 +13,12 @@ bool blockstore_impl_t::enqueue_write(blockstore_op_t *op)
|
|||||||
|
|
||||||
void blockstore_impl_t::prepare_meta_block_write(uint32_t modified_block)
|
void blockstore_impl_t::prepare_meta_block_write(uint32_t modified_block)
|
||||||
{
|
{
|
||||||
//assert(modified_blocks.find(modified_block) == modified_blocks.end());
|
if (modified_blocks.find(modified_block) != modified_blocks.end())
|
||||||
for (auto & block_num: pending_modified_blocks)
|
return;
|
||||||
{
|
|
||||||
if (block_num == modified_block)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
io_uring_sqe *sqe = get_sqe();
|
io_uring_sqe *sqe = get_sqe();
|
||||||
assert(sqe != NULL); // FIXME
|
assert(sqe != NULL);
|
||||||
pending_modified_blocks.push_back(modified_block);
|
pending_modified_blocks.push_back(modified_block);
|
||||||
|
modified_blocks[modified_block] = false;
|
||||||
ring_data_t *data = ((ring_data_t*)sqe->user_data);
|
ring_data_t *data = ((ring_data_t*)sqe->user_data);
|
||||||
data->iov = (struct iovec){ heap->get_meta_block(modified_block), (size_t)dsk.meta_block_size };
|
data->iov = (struct iovec){ heap->get_meta_block(modified_block), (size_t)dsk.meta_block_size };
|
||||||
data->callback = [this, modified_block](ring_data_t *data)
|
data->callback = [this, modified_block](ring_data_t *data)
|
||||||
@@ -44,14 +41,7 @@ void blockstore_impl_t::prepare_meta_block_write(uint32_t modified_block)
|
|||||||
bool blockstore_impl_t::meta_block_is_pending(uint32_t modified_block)
|
bool blockstore_impl_t::meta_block_is_pending(uint32_t modified_block)
|
||||||
{
|
{
|
||||||
auto mb_it = modified_blocks.find(modified_block);
|
auto mb_it = modified_blocks.find(modified_block);
|
||||||
if (mb_it != modified_blocks.end())
|
return mb_it != modified_blocks.end();
|
||||||
return true;
|
|
||||||
for (auto & block_num: pending_modified_blocks)
|
|
||||||
{
|
|
||||||
if (block_num == modified_block)
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool blockstore_impl_t::intent_write_allowed(blockstore_op_t *op, heap_entry_t *obj)
|
bool blockstore_impl_t::intent_write_allowed(blockstore_op_t *op, heap_entry_t *obj)
|
||||||
|
|||||||
Reference in New Issue
Block a user