]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/cache: add public, cache aware get_extent_by_type variants
authorSamuel Just <sjust@redhat.com>
Thu, 17 Sep 2020 22:49:17 +0000 (15:49 -0700)
committerSamuel Just <sjust@redhat.com>
Tue, 20 Oct 2020 19:27:08 +0000 (12:27 -0700)
Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/cache.h

index 807dfb9d38e44c0f479fe68363c449c21bee5e25..eff6c52dad02bbaeaa6a71c697670ea1f00302a0 100644 (file)
@@ -166,6 +166,28 @@ public:
     }
   }
 
+  /**
+   * get_extent_if_cached
+   *
+   * Returns extent at offset if in cache
+   */
+  Transaction::get_extent_ret get_extent_if_cached(
+    Transaction &t,
+    paddr_t offset,
+    CachedExtentRef *out) {
+    auto result = t.get_extent(offset, out);
+    if (result != Transaction::get_extent_ret::ABSENT) {
+      return result;
+    } else if (auto iter = extents.find_offset(offset);
+              iter != extents.end()) {
+      if (out)
+       *out = &*iter;
+      return Transaction::get_extent_ret::PRESENT;
+    } else {
+      return Transaction::get_extent_ret::ABSENT;
+    }
+  }
+
   /**
    * get_extent
    *
@@ -198,6 +220,41 @@ public:
     }
   }
 
+  /**
+   * get_extent_by_type
+   *
+   * Based on type, instantiate the correct concrete type
+   * and read in the extent at location offset~length.
+   */
+  get_extent_ertr::future<CachedExtentRef> get_extent_by_type(
+    extent_types_t type,  ///< [in] type tag
+    paddr_t offset,       ///< [in] starting addr
+    laddr_t laddr,        ///< [in] logical address if logical
+    segment_off_t length  ///< [in] length
+  );
+
+  get_extent_ertr::future<CachedExtentRef> get_extent_by_type(
+    Transaction &t,
+    extent_types_t type,
+    paddr_t offset,
+    laddr_t laddr,
+    segment_off_t length) {
+    CachedExtentRef ret;
+    auto status = get_extent_if_cached(t, offset, &ret);
+    if (status == Transaction::get_extent_ret::RETIRED) {
+      return get_extent_ertr::make_ready_future<CachedExtentRef>();
+    } else if (status == Transaction::get_extent_ret::PRESENT) {
+      return get_extent_ertr::make_ready_future<CachedExtentRef>(ret);
+    } else {
+      return get_extent_by_type(type, offset, laddr, length
+      ).safe_then([=, &t](CachedExtentRef ret) {
+       t.add_to_read_set(ret);
+       return get_extent_ertr::make_ready_future<CachedExtentRef>(
+         std::move(ret));
+      });
+    }
+  }
+
   /**
    * get_extents
    *
@@ -443,19 +500,6 @@ private:
 
   /// Replace prev with next
   void replace_extent(CachedExtentRef next, CachedExtentRef prev);
-
-  /**
-   * get_extent_by_type
-   *
-   * Based on type, instantiate the correct concrete type
-   * and read in the extent at location offset~length.
-   */
-  get_extent_ertr::future<CachedExtentRef> get_extent_by_type(
-    extent_types_t type,  ///< [in] type tag
-    paddr_t offset,       ///< [in] starting addr
-    laddr_t laddr,        ///< [in] logical address if logical
-    segment_off_t length  ///< [in] length
-  );
 };
 
 }