]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/cache: mark conflict in get_extent
authorSamuel Just <sjust@redhat.com>
Thu, 24 Jun 2021 22:24:09 +0000 (15:24 -0700)
committerSamuel Just <sjust@redhat.com>
Thu, 24 Jun 2021 23:29:23 +0000 (16:29 -0700)
After wait_io, the extent may have been mutated again, so it may be
invalid.  Check in the caller and mark the transaction conflicted as
needed.

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

index df5ca6270f30d0e3f86d221afe0f35243cbcf842..159b33395c2e1515e4c8829e5ed6ff86f9e7726f 100644 (file)
@@ -181,7 +181,7 @@ public:
       auto ret = TCachedExtentRef<T>(static_cast<T*>(&*iter));
       return ret->wait_io(
       ).then([ret=std::move(ret)]() mutable -> get_extent_ret<T> {
-       assert(ret->is_valid());
+       // ret may be invalid, caller must check
        return get_extent_ret<T>(
          get_extent_ertr::ready_future_marker{},
          std::move(ret));
@@ -267,9 +267,14 @@ public:
        get_extent<T>(offset, length)
       ).si_then(
        [&t](auto ref) mutable {
-         t.add_to_read_set(ref);
-         return get_extent_iertr::make_ready_future<TCachedExtentRef<T>>(
-           std::move(ref));
+         if (!ref->is_valid()) {
+           t.conflicted = true;
+           return get_extent_iertr::make_ready_future<TCachedExtentRef<T>>();
+         } else {
+           t.add_to_read_set(ref);
+           return get_extent_iertr::make_ready_future<TCachedExtentRef<T>>(
+             std::move(ref));
+         }
        });
     }
   }