]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/transaction: let get_extent signal retired extents
authorSamuel Just <sjust@redhat.com>
Fri, 21 Aug 2020 21:28:50 +0000 (14:28 -0700)
committerSamuel Just <sjust@redhat.com>
Wed, 23 Sep 2020 22:13:51 +0000 (15:13 -0700)
Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/cache.h
src/crimson/os/seastore/transaction.h

index a31e044e1d60f436c432341963818e12e118f152..f57f1df67df1b0a510ffce8a725c09ec9d401921 100644 (file)
@@ -161,6 +161,8 @@ public:
    * - t if modified by t
    * - extent_set if already in cache
    * - disk
+   *
+   * t *must not* have retired offset
    */
   template <typename T>
   get_extent_ertr::future<TCachedExtentRef<T>> get_extent(
@@ -168,14 +170,18 @@ public:
     paddr_t offset,       ///< [in] starting addr
     segment_off_t length  ///< [in] length
   ) {
-    if (auto i = t.get_extent(offset)) {
+    CachedExtentRef ret;
+    auto result = t.get_extent(offset, &ret);
+    if (result != Transaction::get_extent_ret::ABSENT) {
+      assert(result != Transaction::get_extent_ret::RETIRED);
       return get_extent_ertr::make_ready_future<TCachedExtentRef<T>>(
-       TCachedExtentRef<T>(static_cast<T*>(&*i)));
+       ret->cast<T>());
     } else {
       return get_extent<T>(offset, length).safe_then(
        [&t](auto ref) mutable {
          t.add_to_read_set(ref);
-         return get_extent_ertr::make_ready_future<TCachedExtentRef<T>>(std::move(ref));
+         return get_extent_ertr::make_ready_future<TCachedExtentRef<T>>(
+           std::move(ref));
        });
     }
   }
index 60d295820ebbc54f2023e717a1831f7183d94d84..e27531eac8946c50bf59ba635c9c2568264317f2 100644 (file)
@@ -32,16 +32,27 @@ class Transaction {
   pextent_set_t retired_set; ///< list of extents mutated by this transaction
 
 public:
-  CachedExtentRef get_extent(paddr_t addr) {
-    if (auto iter = write_set.find_offset(addr);
+  enum class get_extent_ret {
+    PRESENT,
+    ABSENT,
+    RETIRED
+  };
+  get_extent_ret get_extent(paddr_t addr, CachedExtentRef *out) {
+    if (retired_set.count(addr)) {
+      return get_extent_ret::RETIRED;
+    } else if (auto iter = write_set.find_offset(addr);
        iter != write_set.end()) {
-      return CachedExtentRef(&*iter);
+      if (out)
+       *out = CachedExtentRef(&*iter);
+      return get_extent_ret::PRESENT;
     } else if (
       auto iter = read_set.find(addr);
       iter != read_set.end()) {
-      return *iter;
+      if (out)
+       *out = CachedExtentRef(*iter);
+      return get_extent_ret::PRESENT;
     } else {
-      return CachedExtentRef();
+      return get_extent_ret::ABSENT;
     }
   }