From 1c621b0a596fe306937c9fe9e776b1d22ce5f241 Mon Sep 17 00:00:00 2001 From: Zhang Song Date: Thu, 22 Aug 2024 20:56:01 +0800 Subject: [PATCH] crimson/os/seastore: adapt laddr_offset_t::checked_to_laddr Signed-off-by: Zhang Song --- src/crimson/os/seastore/btree/fixed_kv_btree.h | 8 +++++++- src/crimson/os/seastore/cached_extent.h | 2 +- .../lba_manager/btree/btree_lba_manager.cc | 6 +++--- .../lba_manager/btree/btree_lba_manager.h | 8 ++++---- .../lba_manager/btree/lba_btree_node.cc | 2 +- src/crimson/os/seastore/object_data_handler.cc | 15 ++++++++------- src/crimson/os/seastore/onode.h | 5 +++-- src/crimson/os/seastore/transaction_manager.cc | 4 ++-- src/crimson/os/seastore/transaction_manager.h | 2 +- src/crimson/tools/store_nbd/tm_driver.cc | 2 +- .../crimson/seastore/test_btree_lba_manager.cc | 2 +- .../seastore/test_transaction_manager.cc | 18 +++++++++--------- 12 files changed, 41 insertions(+), 33 deletions(-) diff --git a/src/crimson/os/seastore/btree/fixed_kv_btree.h b/src/crimson/os/seastore/btree/fixed_kv_btree.h index 0671b55a4fb..cb4fff32750 100644 --- a/src/crimson/os/seastore/btree/fixed_kv_btree.h +++ b/src/crimson/os/seastore/btree/fixed_kv_btree.h @@ -226,12 +226,18 @@ public: assert(!is_end()); auto val = get_val(); auto key = get_key(); + node_key_t end{}; + if constexpr (std::is_same_v) { + end = (key + val.len).checked_to_laddr(); + } else { + end = key + val.len; + } return std::make_unique( ctx, leaf.node, leaf.pos, val, - fixed_kv_node_meta_t{ key, key + val.len, 0 }); + fixed_kv_node_meta_t{ key, end, 0 }); } typename leaf_node_t::Ref get_leaf_node() { diff --git a/src/crimson/os/seastore/cached_extent.h b/src/crimson/os/seastore/cached_extent.h index 86d35fd9de0..96cf91b1d43 100644 --- a/src/crimson/os/seastore/cached_extent.h +++ b/src/crimson/os/seastore/cached_extent.h @@ -1325,7 +1325,7 @@ public: void on_rewrite(Transaction&, CachedExtent &extent, extent_len_t off) final { assert(get_type() == extent.get_type()); auto &lextent = (LogicalCachedExtent&)extent; - set_laddr(lextent.get_laddr() + off); + set_laddr((lextent.get_laddr() + off).checked_to_laddr()); } bool has_laddr() const { diff --git a/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc b/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc index e7564ad61b5..ecf4dc66516 100644 --- a/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc +++ b/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc @@ -316,7 +316,7 @@ BtreeLBAManager::_alloc_extents( assert((info.key == L_ADDR_NULL) == (laddr_null)); if (!laddr_null) { assert(info.key >= last_end); - last_end = info.key + info.len; + last_end = (info.key + info.len).checked_to_laddr(); } } #endif @@ -381,7 +381,7 @@ BtreeLBAManager::_alloc_extents( interruptible::ready_future_marker{}, seastar::stop_iteration::yes); } else { - state.last_end = pos.get_key() + pos.get_val().len; + state.last_end = (pos.get_key() + pos.get_val().len).checked_to_laddr(); TRACET("{}~{}, hint={}, state: {}~{}, repeat ... -- {}", t, addr, total_len, hint, pos.get_key(), pos.get_val().len, @@ -431,7 +431,7 @@ BtreeLBAManager::_alloc_extents( return iter.next(c).si_then([&state, &alloc_info](auto it) { state.insert_iter = it; if (alloc_info.key == L_ADDR_NULL) { - state.last_end = state.last_end + alloc_info.len; + state.last_end = (state.last_end + alloc_info.len).checked_to_laddr(); } }); }); diff --git a/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h b/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h index aa6f0fecb31..31576f0a498 100644 --- a/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h +++ b/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h @@ -465,7 +465,7 @@ public: : L_ADDR_NULL; auto remap_offset = remap.offset; auto remap_len = remap.len; - auto remap_laddr = orig_laddr + remap_offset; + auto remap_laddr = (orig_laddr + remap_offset).checked_to_laddr(); ceph_assert(intermediate_base != L_ADDR_NULL); ceph_assert(intermediate_key != L_ADDR_NULL); ceph_assert(remap_len < orig_len); @@ -476,7 +476,7 @@ public: " intermediate_base: {}, intermediate_key: {}", t, remap_laddr, orig_paddr, remap_len, intermediate_base, intermediate_key); - auto remapped_intermediate_key = intermediate_key + remap_offset; + auto remapped_intermediate_key = (intermediate_key + remap_offset).checked_to_laddr(); alloc_infos.emplace_back( alloc_mapping_info_t::create_indirect( remap_laddr, @@ -485,7 +485,7 @@ public: } fut = alloc_cloned_mappings( t, - remaps.front().offset + orig_laddr, + (remaps.front().offset + orig_laddr).checked_to_laddr(), std::move(alloc_infos) ).si_then([&orig_mapping](auto imappings) mutable { std::vector mappings; @@ -504,7 +504,7 @@ public: } else { // !orig_mapping->is_indirect() fut = alloc_extents( t, - remaps.front().offset + orig_laddr, + (remaps.front().offset + orig_laddr).checked_to_laddr(), std::move(extents), EXTENT_DEFAULT_REF_COUNT); } diff --git a/src/crimson/os/seastore/lba_manager/btree/lba_btree_node.cc b/src/crimson/os/seastore/lba_manager/btree/lba_btree_node.cc index 80bfd7a2e20..8bcd494efff 100644 --- a/src/crimson/os/seastore/lba_manager/btree/lba_btree_node.cc +++ b/src/crimson/os/seastore/lba_manager/btree/lba_btree_node.cc @@ -83,7 +83,7 @@ BtreeLBAMappingRef LBALeafNode::get_mapping( this, iter.get_offset(), val, - lba_node_meta_t{laddr, laddr + val.len, 0}); + lba_node_meta_t{laddr, (laddr + val.len).checked_to_laddr(), 0}); } } diff --git a/src/crimson/os/seastore/object_data_handler.cc b/src/crimson/os/seastore/object_data_handler.cc index 8840c08124d..5074b465bbf 100644 --- a/src/crimson/os/seastore/object_data_handler.cc +++ b/src/crimson/os/seastore/object_data_handler.cc @@ -64,7 +64,7 @@ struct extent_to_write_t { } laddr_t get_end_addr() const { - return addr + len; + return (addr + len).checked_to_laddr(); } static extent_to_write_t create_data( @@ -544,7 +544,7 @@ ObjectDataHandler::write_ret do_insertions( off); } iter.copy(extent->get_length(), extent->get_bptr().c_str()); - off = off + extent->get_length(); + off = (off + extent->get_length()).checked_to_laddr(); left -= extent->get_length(); } return ObjectDataHandler::write_iertr::now(); @@ -708,7 +708,7 @@ public: extent_len_t block_size) : data_base(data_base), pin_begin(pins.front()->get_key()), - pin_end(pins.back()->get_key() + pins.back()->get_length()), + pin_end((pins.back()->get_key() + pins.back()->get_length()).checked_to_laddr()), left_paddr(pins.front()->get_val()), right_paddr(pins.back()->get_val()), data_begin(data_base + offset), @@ -1127,7 +1127,7 @@ ObjectDataHandler::clear_ret ObjectDataHandler::trim_data_reservation( pin.get_key(), size - pin_offset)); to_write.push_back(extent_to_write_t::create_zero( - object_data.get_reserved_data_base() + roundup_size, + (object_data.get_reserved_data_base() + roundup_size).checked_to_laddr(), object_data.get_reserved_data_len() - roundup_size)); return clear_iertr::now(); } else { @@ -1152,7 +1152,7 @@ ObjectDataHandler::clear_ret ObjectDataHandler::trim_data_reservation( pin.get_key(), bl)); to_write.push_back(extent_to_write_t::create_zero( - object_data.get_reserved_data_base() + roundup_size, + (object_data.get_reserved_data_base() + roundup_size).checked_to_laddr(), object_data.get_reserved_data_len() - roundup_size)); return clear_iertr::now(); }); @@ -1720,7 +1720,8 @@ ObjectDataHandler::clone_ret ObjectDataHandler::clone_extents( ceph_assert(offset == last_pos); auto fut = TransactionManager::alloc_extent_iertr ::make_ready_future(); - auto addr = object_data.get_reserved_data_base() + offset; + laddr_t addr = (object_data.get_reserved_data_base() + offset) + .checked_to_laddr(); if (pin->get_val().is_zero()) { fut = ctx.tm.reserve_region(ctx.t, addr, pin->get_length()); } else { @@ -1738,7 +1739,7 @@ ObjectDataHandler::clone_ret ObjectDataHandler::clone_extents( if (last_pos != object_data.get_reserved_data_len()) { return ctx.tm.reserve_region( ctx.t, - object_data.get_reserved_data_base() + last_pos, + (object_data.get_reserved_data_base() + last_pos).checked_to_laddr(), object_data.get_reserved_data_len() - last_pos ).si_then([](auto) { return seastar::now(); diff --git a/src/crimson/os/seastore/onode.h b/src/crimson/os/seastore/onode.h index de72a658435..072c57864be 100644 --- a/src/crimson/os/seastore/onode.h +++ b/src/crimson/os/seastore/onode.h @@ -82,8 +82,9 @@ public: assert(default_metadata_offset); assert(default_metadata_range); uint64_t range_blocks = default_metadata_range / block_size; - return get_hint() + default_metadata_offset + - (((uint32_t)std::rand() % range_blocks) * block_size); + auto random_offset = default_metadata_offset + + (((uint32_t)std::rand() % range_blocks) * block_size); + return (get_hint() + random_offset).checked_to_laddr(); } laddr_t get_data_hint() const { return get_hint(); diff --git a/src/crimson/os/seastore/transaction_manager.cc b/src/crimson/os/seastore/transaction_manager.cc index 7e75b8bc497..794783136fb 100644 --- a/src/crimson/os/seastore/transaction_manager.cc +++ b/src/crimson/os/seastore/transaction_manager.cc @@ -585,7 +585,7 @@ TransactionManager::rewrite_logical_extent( if (first_extent) { fut = lba_manager->update_mapping( t, - lextent->get_laddr() + off, + (lextent->get_laddr() + off).checked_to_laddr(), lextent->get_length(), lextent->get_paddr(), nlextent->get_length(), @@ -599,7 +599,7 @@ TransactionManager::rewrite_logical_extent( ceph_assert(refcount != 0); fut = lba_manager->alloc_extent( t, - lextent->get_laddr() + off, + (lextent->get_laddr() + off).checked_to_laddr(), *nlextent, refcount ).si_then([lextent, nlextent, off](auto mapping) { diff --git a/src/crimson/os/seastore/transaction_manager.h b/src/crimson/os/seastore/transaction_manager.h index 2bd41bb5ab6..23636d79d88 100644 --- a/src/crimson/os/seastore/transaction_manager.h +++ b/src/crimson/os/seastore/transaction_manager.h @@ -532,7 +532,7 @@ public: for (auto &remap : remaps) { auto remap_offset = remap.offset; auto remap_len = remap.len; - auto remap_laddr = original_laddr + remap_offset; + auto remap_laddr = (original_laddr + remap_offset).checked_to_laddr(); auto remap_paddr = original_paddr.add_offset(remap_offset); ceph_assert(remap_len < original_len); ceph_assert(remap_offset + remap_len <= original_len); diff --git a/src/crimson/tools/store_nbd/tm_driver.cc b/src/crimson/tools/store_nbd/tm_driver.cc index 44c62fe8b22..77c7557ef61 100644 --- a/src/crimson/tools/store_nbd/tm_driver.cc +++ b/src/crimson/tools/store_nbd/tm_driver.cc @@ -121,7 +121,7 @@ seastar::future TMDriver::read( cur = i.first; } blret.append(i.second->get_bptr()); - cur += i.second->get_bptr().length(); + cur = (cur + i.second->get_bptr().length()).checked_to_laddr(); } if (blret.length() != size) { assert(blret.length() < size); diff --git a/src/test/crimson/seastore/test_btree_lba_manager.cc b/src/test/crimson/seastore/test_btree_lba_manager.cc index b8c6b1d6e30..9988df3a124 100644 --- a/src/test/crimson/seastore/test_btree_lba_manager.cc +++ b/src/test/crimson/seastore/test_btree_lba_manager.cc @@ -500,7 +500,7 @@ struct btree_lba_manager_test : btree_test_base { bottom->first + bottom->second.len <= addr) ++bottom; - auto top = t.mappings.lower_bound(addr + len); + auto top = t.mappings.lower_bound((addr + len).checked_to_laddr()); return std::make_pair( bottom, top diff --git a/src/test/crimson/seastore/test_transaction_manager.cc b/src/test/crimson/seastore/test_transaction_manager.cc index 70dec30f0ec..4a502e469a9 100644 --- a/src/test/crimson/seastore/test_transaction_manager.cc +++ b/src/test/crimson/seastore/test_transaction_manager.cc @@ -254,8 +254,8 @@ struct transaction_manager_test_t : EXPECT_EQ(addr, last); break; } - EXPECT_FALSE(iter->first - last > len); - last = iter->first + iter->second.desc.len; + EXPECT_FALSE((iter->first - last).to_byte_offset() > len); + last = (iter->first + iter->second.desc.len).checked_to_laddr(); ++iter; } } @@ -1180,7 +1180,7 @@ struct transaction_manager_test_t : o_len - new_offset - new_len) } ).si_then([this, new_offset, new_len, o_laddr, &t, &bl](auto ret) { - return tm->alloc_data_extents(t, o_laddr + new_offset, new_len + return tm->alloc_data_extents(t, (o_laddr + new_offset).checked_to_laddr(), new_len ).si_then([this, ret = std::move(ret), new_len, new_offset, o_laddr, &t, &bl](auto extents) mutable { assert(extents.size() == 1); @@ -1188,7 +1188,7 @@ struct transaction_manager_test_t : ceph_assert(ret.size() == 2); auto iter = bl.cbegin(); iter.copy(new_len, ext->get_bptr().c_str()); - auto r_laddr = o_laddr + new_offset + new_len; + auto r_laddr = (o_laddr + new_offset + new_len).checked_to_laddr(); // old pins expired after alloc new extent, need to get it. return tm->get_pin(t, o_laddr ).si_then([this, &t, ext = std::move(ext), r_laddr](auto lpin) mutable { @@ -1216,7 +1216,7 @@ struct transaction_manager_test_t : o_len - new_offset - new_len) } ).si_then([this, new_offset, new_len, o_laddr, &t, &bl](auto ret) { - return tm->alloc_data_extents(t, o_laddr + new_offset, new_len + return tm->alloc_data_extents(t, (o_laddr + new_offset).checked_to_laddr(), new_len ).si_then([this, ret = std::move(ret), new_offset, new_len, o_laddr, &t, &bl](auto extents) mutable { assert(extents.size() == 1); @@ -1224,7 +1224,7 @@ struct transaction_manager_test_t : ceph_assert(ret.size() == 1); auto iter = bl.cbegin(); iter.copy(new_len, ext->get_bptr().c_str()); - auto r_laddr = o_laddr + new_offset + new_len; + auto r_laddr = (o_laddr + new_offset + new_len).checked_to_laddr(); return tm->get_pin(t, r_laddr ).si_then([ext = std::move(ext)](auto rpin) mutable { return _overwrite_pin_iertr::make_ready_future< @@ -1247,7 +1247,7 @@ struct transaction_manager_test_t : new_offset) } ).si_then([this, new_offset, new_len, o_laddr, &t, &bl](auto ret) { - return tm->alloc_data_extents(t, o_laddr + new_offset, new_len + return tm->alloc_data_extents(t, (o_laddr + new_offset).checked_to_laddr(), new_len ).si_then([this, ret = std::move(ret), new_len, o_laddr, &t, &bl] (auto extents) mutable { assert(extents.size() == 1); @@ -1770,9 +1770,9 @@ TEST_P(tm_random_block_device_test_t, scatter_allocation) epm->prefill_fragmented_devices(); auto t = create_transaction(); for (int i = 0; i < 1991; i++) { - auto extents = alloc_extents(t, ADDR + i * 16384, 16384, 'a'); + auto extents = alloc_extents(t, (ADDR + i * 16384).checked_to_laddr(), 16384, 'a'); } - alloc_extents_deemed_fail(t, ADDR + 1991 * 16384, 16384, 'a'); + alloc_extents_deemed_fail(t, (ADDR + 1991 * 16384).checked_to_laddr(), 16384, 'a'); check_mappings(t); check(); submit_transaction(std::move(t)); -- 2.39.5