From: Samuel Just Date: Thu, 11 Feb 2021 02:59:35 +0000 (-0800) Subject: crimson/os/seastore: adjust collection_manager interfaces X-Git-Tag: v17.1.0~2805^2~6 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=9f22ca124e2cb54b048bb044c1284711bbce3f6b;p=ceph.git crimson/os/seastore: adjust collection_manager interfaces Signed-off-by: Samuel Just --- diff --git a/src/crimson/os/seastore/collection_manager.h b/src/crimson/os/seastore/collection_manager.h index cacf2ee9a187..3b3abf2d36a7 100644 --- a/src/crimson/os/seastore/collection_manager.h +++ b/src/crimson/os/seastore/collection_manager.h @@ -12,56 +12,16 @@ namespace crimson::os::seastore { -/** - * coll_root_t - * - * Information for locating CollectionManager information, addr should be - * embedded into the TransactionManager root. - */ - class coll_root_t { - laddr_t coll_root_laddr; - segment_off_t size = 0; - - enum state_t : uint8_t { - CLEAN = 0, /// No pending mutations - MUTATED = 1, /// coll_root_laddr state must be written back to persistence - NONE = 0xFF /// Not yet mounted, should not be exposed to user - } state = NONE; - - public: - coll_root_t() : state(state_t::NONE) {} - - coll_root_t(laddr_t laddr, size_t size) - : coll_root_laddr(laddr), size(size), state(state_t::CLEAN) {} - - bool must_update() const { - return state == MUTATED; - } - - void update(laddr_t addr, segment_off_t s) { - state = state_t::MUTATED; - coll_root_laddr = addr; - size = s; - } - - laddr_t get_location() const { - return coll_root_laddr; - } - auto get_size() const { - return size; - } - }; - - struct coll_info_t { - unsigned split_bits; - - coll_info_t(unsigned bits) +struct coll_info_t { + unsigned split_bits; + + coll_info_t(unsigned bits) : split_bits(bits) {} - - bool operator==(const coll_info_t &rhs) const { - return split_bits == rhs.split_bits; - } - }; + + bool operator==(const coll_info_t &rhs) const { + return split_bits == rhs.split_bits; + } +}; /// Interface for maintaining set of collections class CollectionManager { diff --git a/src/crimson/os/seastore/root_block.h b/src/crimson/os/seastore/root_block.h index 1e8ba9f5de88..c4c1036e23ce 100644 --- a/src/crimson/os/seastore/root_block.h +++ b/src/crimson/os/seastore/root_block.h @@ -20,6 +20,7 @@ struct __attribute__((aligned(8), packed)) root_t { paddr_t segment_root; laddr_t onode_root = L_ADDR_NULL; laddr_t collection_root = L_ADDR_NULL; + segment_off_t collection_root_size = 0; void adjust_addrs_from_base(paddr_t base) { if (lba_root_addr.is_relative()) { diff --git a/src/crimson/os/seastore/seastore_types.h b/src/crimson/os/seastore/seastore_types.h index 0c1bea23d693..0e78e863c865 100644 --- a/src/crimson/os/seastore/seastore_types.h +++ b/src/crimson/os/seastore/seastore_types.h @@ -364,6 +364,46 @@ struct record_t { std::vector deltas; }; +/** + * coll_root_t + * + * Information for locating CollectionManager information, addr should be + * embedded into the TransactionManager root. + */ +class coll_root_t { + laddr_t coll_root_laddr; + segment_off_t size = 0; + + enum state_t : uint8_t { + CLEAN = 0, /// No pending mutations + MUTATED = 1, /// coll_root_laddr state must be written back to persistence + NONE = 0xFF /// Not yet mounted, should not be exposed to user + } state = NONE; + +public: + coll_root_t() : state(state_t::NONE) {} + + coll_root_t(laddr_t laddr, segment_off_t size) + : coll_root_laddr(laddr), size(size), state(state_t::CLEAN) {} + + bool must_update() const { + return state == MUTATED; + } + + void update(laddr_t addr, segment_off_t s) { + state = state_t::MUTATED; + coll_root_laddr = addr; + size = s; + } + + laddr_t get_location() const { + return coll_root_laddr; + } + auto get_size() const { + return size; + } +}; + } WRITE_CLASS_DENC_BOUNDED(crimson::os::seastore::seastore_meta_t) diff --git a/src/crimson/os/seastore/transaction_manager.h b/src/crimson/os/seastore/transaction_manager.h index c978ed5a1e70..6e616a804377 100644 --- a/src/crimson/os/seastore/transaction_manager.h +++ b/src/crimson/os/seastore/transaction_manager.h @@ -348,10 +348,14 @@ public: * Get collection root addr */ using read_collection_root_ertr = base_ertr; - using read_collection_root_ret = read_collection_root_ertr::future; + using read_collection_root_ret = read_collection_root_ertr::future< + coll_root_t>; read_collection_root_ret read_collection_root(Transaction &t) { - return cache.get_root(t).safe_then([](auto croot) { - return croot->get_root().collection_root; + return cache->get_root(t).safe_then([](auto croot) { + return coll_root_t{ + croot->get_root().collection_root, + croot->get_root().collection_root_size + }; }); } @@ -360,10 +364,11 @@ public: * * Update collection root addr */ - void write_collection_root(Transaction &t, laddr_t addr) { - auto croot = cache.get_root_fast(t); - croot = cache.duplicate_for_write(t, croot)->cast(); - croot->get_root().collection_root = addr; + void write_collection_root(Transaction &t, coll_root_t cmroot) { + auto croot = cache->get_root_fast(t); + croot = cache->duplicate_for_write(t, croot)->cast(); + croot->get_root().collection_root = cmroot.get_location(); + croot->get_root().collection_root_size = cmroot.get_size(); } ~TransactionManager();