From: Samuel Just Date: Thu, 24 Jun 2021 23:28:10 +0000 (-0700) Subject: seastore/.../node_extent_manager/seastore: detect transaction conflicts in read_extent X-Git-Tag: v17.1.0~1563^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=0cb483303c7dd273dab2f22cf68ffa669be92416;p=ceph.git 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 --- 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 2e14b604c2fc..f2d5a48a3dbd 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); }); }