From ec9cc03d6e738aa61077c0e12e7c481abda32ed1 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Thu, 18 Mar 2021 15:54:08 -0700 Subject: [PATCH] crimson/.../lba_manager/btree: handle invalid extents in rewrite_extent Signed-off-by: Samuel Just --- .../lba_manager/btree/btree_lba_manager.cc | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) 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 19dd44a4ba2..8509825baf6 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 @@ -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(); 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" }); -- 2.39.5