From 6df608159e632d65adc2a5c010c28eeccca309c1 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Thu, 24 Jun 2021 16:25:54 -0700 Subject: [PATCH] seastore/.../staged_fltree/node: check for conflict in Node::load This will be unnecessary once converted to interruptible_future. Signed-off-by: Samuel Just --- .../os/seastore/onode_manager/staged-fltree/node.cc | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) 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"); }