From: Samuel Just Date: Thu, 11 Jun 2020 21:02:08 +0000 (-0700) Subject: crimson/os/seatore/cache: add get_extent_by_type X-Git-Tag: v16.1.0~1882^2~10 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=c14841fe2eec7310dbb0a29c5ff707c90b746392;p=ceph.git crimson/os/seatore/cache: add get_extent_by_type For now, just have a single static mechanism for resolving concrete extent types. If this becomes unwieldy, we can let users register handlers with cache/transaction_manager. Signed-off-by: Samuel Just --- diff --git a/src/crimson/os/seastore/cache.cc b/src/crimson/os/seastore/cache.cc index 45f2ebf69337..e479a5ca3104 100644 --- a/src/crimson/os/seastore/cache.cc +++ b/src/crimson/os/seastore/cache.cc @@ -4,6 +4,11 @@ #include "crimson/os/seastore/cache.h" #include "crimson/common/log.h" +// included for get_extent_by_type +#include "crimson/os/seastore/lba_manager/btree/lba_btree_node_impl.h" +#include "crimson/os/seastore/onode_manager/simple-fltree/onode_block.h" +#include "test/crimson/seastore/test_block.h" + namespace { seastar::logger& logger() { return crimson::get_logger(ceph_subsys_filestore); @@ -217,4 +222,49 @@ Cache::get_root_ret Cache::get_root(Transaction &t) } } +Cache::get_extent_ertr::future Cache::get_extent_by_type( + extent_types_t type, + paddr_t offset, + segment_off_t length) +{ + switch (type) { + case extent_types_t::ROOT_LOCATION: { + ceph_assert(0 == "root location deltas are handled specially"); + return get_extent_ertr::make_ready_future(); + } + case extent_types_t::ROOT: + return get_extent(offset, length + ).safe_then([](auto extent) { + return CachedExtentRef(extent.detach(), false /* add_ref */); + }); + case extent_types_t::LADDR_INTERNAL: + return get_extent(offset, length + ).safe_then([](auto extent) { + return CachedExtentRef(extent.detach(), false /* add_ref */); + }); + case extent_types_t::LADDR_LEAF: + return get_extent(offset, length + ).safe_then([](auto extent) { + return CachedExtentRef(extent.detach(), false /* add_ref */); + }); + case extent_types_t::ONODE_BLOCK: + return get_extent(offset, length + ).safe_then([](auto extent) { + return CachedExtentRef(extent.detach(), false /* add_ref */); + }); + case extent_types_t::TEST_BLOCK: + return get_extent(offset, length + ).safe_then([](auto extent) { + return CachedExtentRef(extent.detach(), false /* add_ref */); + }); + case extent_types_t::NONE: { + ceph_assert(0 == "NONE is an invalid extent type"); + return get_extent_ertr::make_ready_future(); + } + default: + ceph_assert(0 == "impossible"); + return get_extent_ertr::make_ready_future(); + } +} + } diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index 7f511217d10d..bd9a992804e7 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -383,6 +383,18 @@ private: /// Remove extent from extents handling dirty and refcounting void retire_extent(CachedExtentRef ref); + + /** + * 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 + segment_off_t length ///< [in] length + ); }; } diff --git a/src/crimson/os/seastore/seastore_types.h b/src/crimson/os/seastore/seastore_types.h index a64778904e3b..3a0d9922169a 100644 --- a/src/crimson/os/seastore/seastore_types.h +++ b/src/crimson/os/seastore/seastore_types.h @@ -202,7 +202,11 @@ std::ostream &operator<<(std::ostream &out, const laddr_list_t &rhs); std::ostream &operator<<(std::ostream &out, const paddr_list_t &rhs); /* identifies type of extent, used for interpretting deltas, managing - * writeback */ + * writeback. + * + * Note that any new extent type needs to be added to + * Cache::get_extent_by_type in cache.cc + */ enum class extent_types_t : uint8_t { ROOT_LOCATION = 0, // delta only ROOT = 1,