diff --git a/src/blockstore/blockstore_impl.cpp b/src/blockstore/blockstore_impl.cpp index c05d1fc2..80c95b29 100644 --- a/src/blockstore/blockstore_impl.cpp +++ b/src/blockstore/blockstore_impl.cpp @@ -200,7 +200,7 @@ void blockstore_impl_t::loop() for (auto & block_num: pending_modified_blocks) { heap->start_block_write(block_num); - modified_blocks.insert(block_num); + modified_blocks[block_num] = true; } pending_modified_blocks.clear(); if ((initial_ring_space - ringloop->space_left()) > 0) diff --git a/src/blockstore/blockstore_impl.h b/src/blockstore/blockstore_impl.h index fa2c1113..a05d0c90 100644 --- a/src/blockstore/blockstore_impl.h +++ b/src/blockstore/blockstore_impl.h @@ -117,7 +117,7 @@ public: uint8_t *zero_object = NULL; std::vector pending_modified_blocks; - robin_hood::unordered_flat_set modified_blocks; + robin_hood::unordered_flat_map modified_blocks; journal_flusher_t *flusher; int write_iodepth = 0; diff --git a/src/blockstore/blockstore_write.cpp b/src/blockstore/blockstore_write.cpp index 44b88b61..5b91c16a 100644 --- a/src/blockstore/blockstore_write.cpp +++ b/src/blockstore/blockstore_write.cpp @@ -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) { - //assert(modified_blocks.find(modified_block) == modified_blocks.end()); - for (auto & block_num: pending_modified_blocks) - { - if (block_num == modified_block) - return; - } + if (modified_blocks.find(modified_block) != modified_blocks.end()) + return; io_uring_sqe *sqe = get_sqe(); - assert(sqe != NULL); // FIXME + assert(sqe != NULL); pending_modified_blocks.push_back(modified_block); + modified_blocks[modified_block] = false; 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->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) { auto mb_it = modified_blocks.find(modified_block); - if (mb_it != modified_blocks.end()) - return true; - for (auto & block_num: pending_modified_blocks) - { - if (block_num == modified_block) - return true; - } - return false; + return mb_it != modified_blocks.end(); } bool blockstore_impl_t::intent_write_allowed(blockstore_op_t *op, heap_entry_t *obj)