From abd5cbfbe46388d56d1d6e82f6d92af85641ebdc Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Tue, 7 Jan 2025 18:56:23 +0300 Subject: [PATCH] Pass clean_bitmap explicitly --- src/blockstore/blockstore_flush.cpp | 16 ++++++------ src/blockstore/blockstore_impl.h | 4 +-- src/blockstore/blockstore_read.cpp | 38 ++++++++++++++--------------- src/blockstore/blockstore_write.cpp | 2 +- 4 files changed, 28 insertions(+), 32 deletions(-) diff --git a/src/blockstore/blockstore_flush.cpp b/src/blockstore/blockstore_flush.cpp index 47e55c67..8313fa5a 100644 --- a/src/blockstore/blockstore_flush.cpp +++ b/src/blockstore/blockstore_flush.cpp @@ -427,13 +427,6 @@ stop_flusher: printf("Flushing %jx:%jx v%ju\n", cur.oid.inode, cur.oid.stripe, cur.version); #endif flusher->active_flushers++; - // Find it in clean_db - { - auto & clean_db = bs->clean_db_shard(cur.oid); - auto clean_it = clean_db.find(cur.oid); - old_clean_ver = (clean_it != clean_db.end() ? clean_it->second.version : 0); - old_clean_loc = (clean_it != clean_db.end() ? clean_it->second.location : UINT64_MAX); - } // Scan dirty versions of the object to determine what we need to read scan_dirty(); // Writes and deletes shouldn't happen at the same time @@ -912,6 +905,12 @@ void journal_flusher_co::calc_block_checksums(uint32_t *new_data_csums, bool ski void journal_flusher_co::scan_dirty() { + // Find it in clean_db + auto & clean_db = bs->clean_db_shard(cur.oid); + auto clean_it = clean_db.find(cur.oid); + old_clean_ver = (clean_it != clean_db.end() ? clean_it->second.version : 0); + old_clean_loc = (clean_it != clean_db.end() ? clean_it->second.location : UINT64_MAX); + auto old_clean_bitmap = (clean_it != clean_db.end() ? bs->get_clean_entry_bitmap(clean_it, 0) : NULL); dirty_it = dirty_start = dirty_end; v.clear(); copy_count = 0; @@ -1037,13 +1036,12 @@ void journal_flusher_co::scan_dirty() read_to_fill_incomplete = 0; return; } - uint8_t *bmp_ptr = bs->get_clean_entry_bitmap(old_clean_loc, 0); uint64_t fulfilled = 0; int last = v.size()-1; while (last >= 0 && (v[last].copy_flags & COPY_BUF_CSUM_FILL)) last--; read_to_fill_incomplete = bs->fill_partial_checksum_blocks( - v, fulfilled, bmp_ptr, NULL, false, NULL, v[0].offset/bs->dsk.csum_block_size * bs->dsk.csum_block_size, + v, fulfilled, old_clean_bitmap, NULL, false, NULL, v[0].offset/bs->dsk.csum_block_size * bs->dsk.csum_block_size, ((v[last].offset+v[last].len-1) / bs->dsk.csum_block_size + 1) * bs->dsk.csum_block_size ); } diff --git a/src/blockstore/blockstore_impl.h b/src/blockstore/blockstore_impl.h index e3743542..3b830a42 100644 --- a/src/blockstore/blockstore_impl.h +++ b/src/blockstore/blockstore_impl.h @@ -317,7 +317,7 @@ class blockstore_impl_t void open_data(); void open_meta(); void open_journal(); - uint8_t* get_clean_entry_bitmap(uint64_t block_loc, int offset); + uint8_t* get_clean_entry_bitmap(blockstore_clean_db_t::iterator clean_it, int offset); blockstore_clean_db_t& clean_db_shard(object_id oid); void reshard_clean_db(pool_id_t pool_id, uint32_t pg_count, uint32_t pg_stripe_size); @@ -346,7 +346,7 @@ class blockstore_impl_t uint32_t item_state, uint64_t item_version, uint64_t item_location, uint64_t journal_sector, uint8_t *csum, int *dyn_data); bool fulfill_clean_read(blockstore_op_t *read_op, uint64_t & fulfilled, - uint8_t *clean_entry_bitmap, int *dyn_data, + bool from_journal, uint8_t *clean_entry_bitmap, int *dyn_data, uint32_t item_start, uint32_t item_end, uint64_t clean_loc, uint64_t clean_ver); int fill_partial_checksum_blocks(std::vector & rv, uint64_t & fulfilled, uint8_t *clean_entry_bitmap, int *dyn_data, bool from_journal, uint8_t *read_buf, uint64_t read_offset, uint64_t read_end); diff --git a/src/blockstore/blockstore_read.cpp b/src/blockstore/blockstore_read.cpp index ce9ec787..ec376429 100644 --- a/src/blockstore/blockstore_read.cpp +++ b/src/blockstore/blockstore_read.cpp @@ -148,10 +148,10 @@ int blockstore_impl_t::fulfill_read(blockstore_op_t *read_op, return r; } -uint8_t* blockstore_impl_t::get_clean_entry_bitmap(uint64_t block_loc, int offset) +uint8_t* blockstore_impl_t::get_clean_entry_bitmap(blockstore_clean_db_t::iterator clean_it, int offset) { uint8_t *clean_entry_bitmap; - uint64_t meta_loc = block_loc >> dsk.block_order; + uint64_t meta_loc = clean_it->second.location >> dsk.block_order; if (inmemory_meta) { uint64_t sector = (meta_loc / (dsk.meta_block_size / dsk.clean_entry_size)) * dsk.meta_block_size; @@ -433,7 +433,7 @@ int blockstore_impl_t::dequeue_read(blockstore_op_t *read_op) if (!IS_JOURNAL(dirty.state)) { // Read from data disk, possibly checking checksums - if (!fulfill_clean_read(read_op, fulfilled, bmp_ptr, dyn_data, + if (!fulfill_clean_read(read_op, fulfilled, true, bmp_ptr, dyn_data, dirty.offset, dirty.offset+dirty.len, dirty.location, dirty_it->first.version)) { goto undo_read; @@ -464,13 +464,13 @@ int blockstore_impl_t::dequeue_read(blockstore_op_t *read_op) result_version = clean_it->second.version; if (read_op->bitmap) { - void *bmp_ptr = get_clean_entry_bitmap(clean_it->second.location, dsk.clean_entry_bitmap_size); + void *bmp_ptr = get_clean_entry_bitmap(clean_it, dsk.clean_entry_bitmap_size); memcpy(read_op->bitmap, bmp_ptr, dsk.clean_entry_bitmap_size); } } if (fulfilled < read_op->len) { - if (!fulfill_clean_read(read_op, fulfilled, NULL, NULL, 0, dsk.data_block_size, + if (!fulfill_clean_read(read_op, fulfilled, false, get_clean_entry_bitmap(clean_it, 0), NULL, 0, dsk.data_block_size, clean_it->second.location, clean_it->second.version)) { goto undo_read; @@ -582,15 +582,8 @@ int blockstore_impl_t::pad_journal_read(std::vector & rv, copy_bu } bool blockstore_impl_t::fulfill_clean_read(blockstore_op_t *read_op, uint64_t & fulfilled, - uint8_t *clean_entry_bitmap, int *dyn_data, uint32_t item_start, uint32_t item_end, uint64_t clean_loc, uint64_t clean_ver) + bool from_journal, uint8_t *clean_entry_bitmap, int *dyn_data, uint32_t item_start, uint32_t item_end, uint64_t clean_loc, uint64_t clean_ver) { - bool from_journal = clean_entry_bitmap != NULL; - if (!clean_entry_bitmap) - { - // NULL clean_entry_bitmap means we're reading from data, not from the journal, - // and the bitmap location is obvious - clean_entry_bitmap = get_clean_entry_bitmap(clean_loc, 0); - } if (dsk.csum_block_size > dsk.bitmap_granularity) { auto & rv = PRIV(read_op)->read_vec; @@ -807,11 +800,6 @@ bool blockstore_impl_t::verify_clean_padded_checksums(blockstore_op_t *op, uint6 if (from_journal) return verify_padded_checksums(dyn_data, dyn_data + dsk.clean_entry_bitmap_size, offset, iov, n_iov, bad_block_cb); clean_loc = (clean_loc >> dsk.block_order) << dsk.block_order; - if (!dyn_data) - { - assert(inmemory_meta); - dyn_data = get_clean_entry_bitmap(clean_loc, 0); - } return verify_padded_checksums(dyn_data, dyn_data + 2*dsk.clean_entry_bitmap_size, offset, iov, n_iov, bad_block_cb); } @@ -869,8 +857,18 @@ void blockstore_impl_t::handle_read_event(ring_data_t *data, blockstore_op_t *op auto & uo = used_clean_objects.at((rv[i].disk_offset >> dsk.block_order) << dsk.block_order); if (!uo.was_changed) { + bool from_journal = (rv[i].copy_flags & COPY_BUF_JOURNALED_BIG); + auto csum_buf = rv[i].csum_buf; + if (!from_journal && !csum_buf) + { + assert(inmemory_meta); + auto & clean_db = clean_db_shard(op->oid); + auto clean_it = clean_db.find(op->oid); + assert(clean_it != clean_db.end()); + csum_buf = get_clean_entry_bitmap(clean_it, 0); + } verify_clean_padded_checksums( - op, rv[i].disk_offset, rv[i].csum_buf, (rv[i].copy_flags & COPY_BUF_JOURNALED_BIG), iov, n_iov, + op, rv[i].disk_offset, csum_buf, from_journal, iov, n_iov, [&](uint32_t bad_block, uint32_t calc_csum, uint32_t stored_csum) { ok = false; @@ -1019,7 +1017,7 @@ int blockstore_impl_t::read_bitmap(object_id oid, uint64_t target_version, void *result_version = clean_it->second.version; if (bitmap) { - void *bmp_ptr = get_clean_entry_bitmap(clean_it->second.location, dsk.clean_entry_bitmap_size); + void *bmp_ptr = get_clean_entry_bitmap(clean_it, dsk.clean_entry_bitmap_size); memcpy(bitmap, bmp_ptr, dsk.clean_entry_bitmap_size); } return 0; diff --git a/src/blockstore/blockstore_write.cpp b/src/blockstore/blockstore_write.cpp index b77d3602..659f4cb9 100644 --- a/src/blockstore/blockstore_write.cpp +++ b/src/blockstore/blockstore_write.cpp @@ -57,7 +57,7 @@ bool blockstore_impl_t::enqueue_write(blockstore_op_t *op) version = clean_it->second.version + 1; if (!is_del) { - void *bmp_ptr = get_clean_entry_bitmap(clean_it->second.location, dsk.clean_entry_bitmap_size); + void *bmp_ptr = get_clean_entry_bitmap(clean_it, dsk.clean_entry_bitmap_size); memcpy(dyn_ptr, bmp_ptr, dsk.clean_entry_bitmap_size); } }