]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
seastore/.../node_extent_manager/seastore: detect transaction conflicts in read_extent
authorSamuel Just <sjust@redhat.com>
Thu, 24 Jun 2021 23:28:10 +0000 (16:28 -0700)
committerSamuel Just <sjust@redhat.com>
Thu, 24 Jun 2021 23:29:52 +0000 (16:29 -0700)
This won't be necessary once converted to interruptible_future.

Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/seastore.h

index 2e14b604c2fc92659cb19eda15a7d8f601e24c74..f2d5a48a3dbd097d79769b5b59e69ed2d567c85e 100644 (file)
@@ -106,16 +106,17 @@ class SeastoreNodeExtentManager final: public TransactionManagerHandle {
       }
     }
     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);
     });
   }