From: Samuel Just Date: Thu, 17 Sep 2020 22:49:17 +0000 (-0700) Subject: crimson/os/seastore/cache: add public, cache aware get_extent_by_type variants X-Git-Tag: v16.1.0~807^2~11 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=37783172a665c62854c3cc76f0f343a0777b5b53;p=ceph.git crimson/os/seastore/cache: add public, cache aware get_extent_by_type variants Signed-off-by: Samuel Just --- diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index 807dfb9d38e4..eff6c52dad02 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -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 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 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(); + } else if (status == Transaction::get_extent_ret::PRESENT) { + return get_extent_ertr::make_ready_future(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( + 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 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 - ); }; }