From: Samuel Just Date: Thu, 24 Jun 2021 23:25:54 +0000 (-0700) Subject: seastore/.../staged_fltree/node: check for conflict in Node::load X-Git-Tag: v17.1.0~1563^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F42020%2Fhead;p=ceph.git seastore/.../staged_fltree/node: check for conflict in Node::load This will be unnecessary once converted to interruptible_future. Signed-off-by: Samuel Just --- diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/node.cc b/src/crimson/os/seastore/onode_manager/staged-fltree/node.cc index 9fab9a8caa0..3403ca01675 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/node.cc +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/node.cc @@ -684,7 +684,12 @@ eagain_future> Node::load( c.t, addr, expect_is_level_tail); ceph_abort("fatal error"); }) - ).safe_then([FNAME, c, addr, expect_is_level_tail](auto extent) { + ).safe_then([FNAME, c, addr, expect_is_level_tail](auto extent) + -> eagain_future> { + if (c.t.is_conflicted()) { + return crimson::ct_error::eagain::make(); + } + assert(extent->is_valid()); auto header = extent->get_header(); auto field_type = header.get_field_type(); if (!field_type) { @@ -709,7 +714,8 @@ eagain_future> Node::load( ceph_abort("fatal error"); } auto impl = LeafNodeImpl::load(extent, *field_type); - return Ref(new LeafNode(impl.get(), std::move(impl))); + return eagain_ertr::make_ready_future>( + new LeafNode(impl.get(), std::move(impl))); } else if (node_type == node_type_t::INTERNAL) { if (extent->get_length() != c.vb.get_internal_node_size()) { ERRORT("load addr={:x}, is_level_tail={} error, " @@ -718,7 +724,8 @@ eagain_future> Node::load( ceph_abort("fatal error"); } auto impl = InternalNodeImpl::load(extent, *field_type); - return Ref(new InternalNode(impl.get(), std::move(impl))); + return eagain_ertr::make_ready_future>( + new InternalNode(impl.get(), std::move(impl))); } else { ceph_abort("impossible path"); }