From 0cb483303c7dd273dab2f22cf68ffa669be92416 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Thu, 24 Jun 2021 16:28:10 -0700 Subject: [PATCH] seastore/.../node_extent_manager/seastore: detect transaction conflicts in read_extent This won't be necessary once converted to interruptible_future. Signed-off-by: Samuel Just --- .../staged-fltree/node_extent_manager/seastore.h | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/seastore.h b/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/seastore.h index 2e14b604c2fc9..f2d5a48a3dbd0 100644 --- a/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/seastore.h +++ b/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/seastore.h @@ -106,16 +106,17 @@ class SeastoreNodeExtentManager final: public TransactionManagerHandle { } } return tm.read_extent(t, addr - ).safe_then([addr, &t](auto&& e) { + ).safe_then([addr, &t](auto&& e) -> read_ertr::future { TRACET("read {}B at {:#x} -- {}", t, e->get_length(), e->get_laddr(), *e); - if (!e->is_valid()) { - ERRORT("read invalid extent: {}", t, *e); - ceph_abort("fatal error"); + if (!e->is_valid() || t.is_conflicted()) { + ERRORT("transaction conflict detected on extent read {}", t, *e); + assert(t.is_conflicted()); + return crimson::ct_error::eagain::make(); } assert(e->get_laddr() == addr); std::ignore = addr; - return NodeExtentRef(e); + return read_ertr::make_ready_future(e); }); } -- 2.39.5