}
}
return tm.read_extent<SeastoreNodeExtent>(t, addr
- ).safe_then([addr, &t](auto&& e) {
+ ).safe_then([addr, &t](auto&& e) -> read_ertr::future<NodeExtentRef> {
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<NodeExtentRef>(e);
});
}