]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore: adapt laddr_offset_t::checked_to_laddr
authorZhang Song <zhangsong02@qianxin.com>
Thu, 22 Aug 2024 12:56:01 +0000 (20:56 +0800)
committerZhang Song <zhangsong02@qianxin.com>
Fri, 23 Aug 2024 11:19:38 +0000 (19:19 +0800)
Signed-off-by: Zhang Song <zhangsong02@qianxin.com>
12 files changed:
src/crimson/os/seastore/btree/fixed_kv_btree.h
src/crimson/os/seastore/cached_extent.h
src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc
src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h
src/crimson/os/seastore/lba_manager/btree/lba_btree_node.cc
src/crimson/os/seastore/object_data_handler.cc
src/crimson/os/seastore/onode.h
src/crimson/os/seastore/transaction_manager.cc
src/crimson/os/seastore/transaction_manager.h
src/crimson/tools/store_nbd/tm_driver.cc
src/test/crimson/seastore/test_btree_lba_manager.cc
src/test/crimson/seastore/test_transaction_manager.cc

index 0671b55a4fb5a5ef49e4edc42a852937f8c008cf..cb4fff327501bafe6952d2eac69e8adebe6b2e67 100644 (file)
@@ -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<node_key_t, laddr_t>) {
+        end = (key + val.len).checked_to_laddr();
+      } else {
+        end = key + val.len;
+      }
       return std::make_unique<pin_t>(
         ctx,
        leaf.node,
         leaf.pos,
        val,
-       fixed_kv_node_meta_t<node_key_t>{ key, key + val.len, 0 });
+       fixed_kv_node_meta_t<node_key_t>{ key, end, 0 });
     }
 
     typename leaf_node_t::Ref get_leaf_node() {
index 86d35fd9de04e08f4e42b9bf0e0ec2401641418d..96cf91b1d43b959193e909543de34de9218f101b 100644 (file)
@@ -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 {
index e7564ad61b5642efd0b1c20cd9389f47b200dd1e..ecf4dc665167c54dcedccb6298882757889a08e3 100644 (file)
@@ -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();
              }
            });
          });
index aa6f0fecb313e92c2c7870c7de68e689149d7931..31576f0a498f4791d5e3e2d511278e1a058df5c4 100644 (file)
@@ -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<LBAMappingRef> 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);
        }
index 80bfd7a2e20a911a464eb1dc85866dffa7b05cac..8bcd494efff4dac0e963f5550af28b4f9fc55018 100644 (file)
@@ -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});
 }
 
 }
index 8840c08124db1eb70f0c421ead23b08c68555fa4..5074b465bbf0f2c9cc4d5c260c3117cd4de687d1 100644 (file)
@@ -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<LBAMappingRef>();
-         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();
index de72a658435dd21e23517b749f184bca4aecec88..072c57864bed74f64a9e4cbf8343374c855c18ea 100644 (file)
@@ -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();
index 7e75b8bc4975bbfda12ee71331155bbd9efae33a..794783136fb929d1e9ec721a5bd17015d95879f2 100644 (file)
@@ -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) {
index 2bd41bb5ab65b3ba03f1854705015a38ec3c12fb..23636d79d88f4cc53bdfad5db9f59cd3ff288f8a 100644 (file)
@@ -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);
index 44c62fe8b22fa9f41c759cdbfdc5a070700a65c9..77c7557ef616c224c3400e90eed9e93f081b4e8a 100644 (file)
@@ -121,7 +121,7 @@ seastar::future<bufferlist> 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);
index b8c6b1d6e30237ef4c92a36cf6045aacdd3c8a66..9988df3a1246198b8fcb875bae81110e819228d8 100644 (file)
@@ -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
index 70dec30f0ec5b4a17c5e7960b6dea7ef33a22a9c..4a502e469a9176512e9462483bca755d0be33265 100644 (file)
@@ -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<TestBlock>(t, o_laddr + new_offset, new_len
+        return tm->alloc_data_extents<TestBlock>(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<TestBlock>(t, o_laddr + new_offset, new_len
+        return tm->alloc_data_extents<TestBlock>(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<TestBlock>(t, o_laddr + new_offset, new_len
+        return tm->alloc_data_extents<TestBlock>(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));