]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore: document how get_extents_if_live deals with extents split
authorYingxin Cheng <yingxin.cheng@intel.com>
Thu, 11 Aug 2022 05:38:05 +0000 (13:38 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Mon, 15 Aug 2022 03:34:51 +0000 (11:34 +0800)
Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/os/seastore/transaction_manager.cc

index 89f2154bcab2eaa47a7643985f3d887527957067..f7a560829b8a1c9bbfbd2acba884fe701f10b204 100644 (file)
@@ -532,6 +532,10 @@ TransactionManager::get_extents_if_live(
   LOG_PREFIX(TransactionManager::get_extent_if_live);
   TRACET("{} {}~{} {}", t, type, laddr, len, paddr);
 
+  // This only works with segments to check if alive,
+  // as parallel transactions may split the extent at the same time.
+  ceph_assert(paddr.get_addr_type() == paddr_types_t::SEGMENT);
+
   return cache->get_extent_if_cached(t, paddr, type
   ).si_then([=, this, &t](auto extent)
            -> get_extents_if_live_ret {
@@ -566,11 +570,12 @@ TransactionManager::get_extents_if_live(
             auto &pin_seg_paddr = pin_paddr.as_seg_paddr();
             auto pin_paddr_seg_id = pin_seg_paddr.get_segment_id();
             auto pin_len = pin->get_length();
-            if (pin_paddr_seg_id != paddr_seg_id ||
-                pin_seg_paddr < paddr ||
-                pin_seg_paddr.add_offset(pin_len) > paddr.add_offset(len)) {
+            if (pin_paddr_seg_id != paddr_seg_id) {
               return seastar::now();
             }
+            // Only extent split can happen during the lookup
+            ceph_assert(pin_seg_paddr >= paddr &&
+                        pin_seg_paddr.add_offset(pin_len) <= paddr.add_offset(len));
             return pin_to_extent_by_type(t, std::move(pin), type
             ).si_then([&list](auto ret) {
               list.emplace_back(std::move(ret));