]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/.../lba_manager/btree: handle invalid extents in rewrite_extent
authorSamuel Just <sjust@redhat.com>
Thu, 18 Mar 2021 22:54:08 +0000 (15:54 -0700)
committerSamuel Just <sjust@redhat.com>
Wed, 24 Mar 2021 05:41:11 +0000 (22:41 -0700)
Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc

index 19dd44a4ba2a2f315e142f60a29817881a736560..8509825baf6787d33fb79a70650ea4bf25cb896f 100644 (file)
@@ -345,6 +345,11 @@ BtreeLBAManager::rewrite_extent_ret BtreeLBAManager::rewrite_extent(
   Transaction &t,
   CachedExtentRef extent)
 {
+  if (extent->has_been_invalidated()) {
+    logger().debug("BTreeLBAManager::rewrite_extent: {} is invalid, returning eagain");
+    return crimson::ct_error::eagain::make();
+  }
+
   if (extent->is_logical()) {
     auto lextent = extent->cast<LogicalCachedExtent>();
     cache.retire_extent(t, extent);
@@ -374,7 +379,12 @@ BtreeLBAManager::rewrite_extent_ret BtreeLBAManager::rewrite_extent(
        ceph_assert(in.paddr == prev_addr);
        ret.paddr = addr;
        return ret;
-      }).safe_then([nlextent](auto e) {}).handle_error(
+      }).safe_then(
+       [nlextent](auto) {},
+       crimson::ct_error::enoent::handle([extent]() -> rewrite_extent_ret {
+         ceph_assert(extent->has_been_invalidated());
+         return crimson::ct_error::eagain::make();
+       }),
        rewrite_extent_ertr::pass_further{},
         /* ENOENT in particular should be impossible */
        crimson::ct_error::assert_all{
@@ -418,7 +428,11 @@ BtreeLBAManager::rewrite_extent_ret BtreeLBAManager::rewrite_extent(
       nlba_extent->get_node_meta().begin,
       nlba_extent->get_paddr()).safe_then(
        [](auto) {},
-       rewrite_extent_ertr::pass_further {},
+       crimson::ct_error::enoent::handle([extent]() -> rewrite_extent_ret {
+         ceph_assert(extent->has_been_invalidated());
+         return crimson::ct_error::eagain::make();
+       }),
+       rewrite_extent_ertr::pass_further{},
        crimson::ct_error::assert_all{
          "Invalid error in BtreeLBAManager::rewrite_extent update_internal_mapping"
        });