From: Samuel Just Date: Thu, 11 Feb 2021 23:55:06 +0000 (-0800) Subject: crimson/os/seastore: clean up root structures X-Git-Tag: v17.1.0~2805^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=bed7e3caba21ce86bd4b2192fa2339048df3f344;p=ceph.git crimson/os/seastore: clean up root structures Actually ensure alignment and byte order independence. Signed-off-by: Samuel Just --- diff --git a/src/crimson/os/seastore/extentmap_manager/btree/extentmap_btree_node_impl.h b/src/crimson/os/seastore/extentmap_manager/btree/extentmap_btree_node_impl.h index f5da8cdc2fe5..94a5dd788498 100644 --- a/src/crimson/os/seastore/extentmap_manager/btree/extentmap_btree_node_impl.h +++ b/src/crimson/os/seastore/extentmap_manager/btree/extentmap_btree_node_impl.h @@ -13,12 +13,12 @@ namespace crimson::os::seastore::extentmap_manager { struct extmap_node_meta_le_t { - depth_le_t depth = init_les32(0); + depth_le_t depth = init_depth_le(0); extmap_node_meta_le_t() = default; extmap_node_meta_le_t(const extmap_node_meta_le_t &) = default; explicit extmap_node_meta_le_t(const extmap_node_meta_t &val) - : depth(init_les32(val.depth)) {} + : depth(init_depth_le(val.depth)) {} operator extmap_node_meta_t() const { return extmap_node_meta_t{ depth }; @@ -167,13 +167,13 @@ constexpr size_t LEAF_NODE_CAPACITY = struct lext_map_val_le_t { laddr_le_t laddr; - extent_len_le_t length = init_extent_len_le_t(0); + extent_len_le_t length = init_extent_len_le(0); lext_map_val_le_t() = default; lext_map_val_le_t(const lext_map_val_le_t &) = default; explicit lext_map_val_le_t(const lext_map_val_t &val) : laddr(laddr_le_t(val.laddr)), - length(init_extent_len_le_t(val.length)) {} + length(init_extent_len_le(val.length)) {} operator lext_map_val_t() const { return lext_map_val_t{laddr, length}; diff --git a/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc b/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc index 04db76926e3b..a0540b38666a 100644 --- a/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc +++ b/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc @@ -31,13 +31,8 @@ BtreeLBAManager::mkfs_ret BtreeLBAManager::mkfs( lba_node_meta_t meta{0, L_ADDR_MAX, 1}; root_leaf->set_meta(meta); root_leaf->pin.set_range(meta); - croot->get_root() = - root_t{ - 1, - 0, - root_leaf->get_paddr(), - make_record_relative_paddr(0), - L_ADDR_NULL}; + croot->get_root().lba_root = + lba_root_t{root_leaf->get_paddr(), 1u}; return mkfs_ertr::now(); }).handle_error( mkfs_ertr::pass_further{}, @@ -53,13 +48,13 @@ BtreeLBAManager::get_root(Transaction &t) return cache.get_root(t).safe_then([this, &t](auto croot) { logger().debug( "BtreeLBAManager::get_root: reading root at {} depth {}", - paddr_t{croot->get_root().lba_root_addr}, - unsigned(croot->get_root().lba_depth)); + paddr_t{croot->get_root().lba_root.get_location()}, + croot->get_root().lba_root.get_depth()); return get_lba_btree_extent( get_context(t), croot, - croot->get_root().lba_depth, - croot->get_root().lba_root_addr, + croot->get_root().lba_root.get_depth(), + croot->get_root().lba_root.get_location(), paddr_t()); }); } @@ -497,8 +492,10 @@ BtreeLBAManager::insert_mapping_ret BtreeLBAManager::insert_mapping( L_ADDR_MIN, root->get_paddr(), nullptr); - croot->get_root().lba_root_addr = nroot->get_paddr(); - croot->get_root().lba_depth = root->get_node_meta().depth + 1; + croot->get_root().lba_root = lba_root_t{ + nroot->get_paddr(), + root->get_node_meta().depth + 1 + }; return nroot->split_entry( get_context(t), laddr, nroot->begin(), root); @@ -551,7 +548,7 @@ BtreeLBAManager::update_internal_mapping( paddr_t paddr) { return cache.get_root(t).safe_then([=, &t](RootBlockRef croot) { - if (depth == croot->get_root().lba_depth) { + if (depth == croot->get_root().lba_root.get_depth()) { logger().debug( "update_internal_mapping: updating lba root to: {}->{}", laddr, @@ -561,8 +558,8 @@ BtreeLBAManager::update_internal_mapping( croot = mut_croot->cast(); } ceph_assert(laddr == 0); - auto old_paddr = croot->get_root().lba_root_addr; - croot->get_root().lba_root_addr = paddr; + auto old_paddr = croot->get_root().lba_root.get_location(); + croot->get_root().lba_root.set_location(paddr); return update_internal_mapping_ret( update_internal_mapping_ertr::ready_future_marker{}, old_paddr); @@ -575,8 +572,8 @@ BtreeLBAManager::update_internal_mapping( return get_lba_btree_extent( get_context(t), croot, - croot->get_root().lba_depth, - croot->get_root().lba_root_addr, + croot->get_root().lba_root.get_depth(), + croot->get_root().lba_root.get_location(), paddr_t()).safe_then([=, &t](LBANodeRef broot) { return broot->mutate_internal_address( get_context(t), diff --git a/src/crimson/os/seastore/lba_manager/btree/lba_btree_node_impl.cc b/src/crimson/os/seastore/lba_manager/btree/lba_btree_node_impl.cc index 414a60ca3add..b29554dac884 100644 --- a/src/crimson/os/seastore/lba_manager/btree/lba_btree_node_impl.cc +++ b/src/crimson/os/seastore/lba_manager/btree/lba_btree_node_impl.cc @@ -391,12 +391,13 @@ LBAInternalNode::merge_entry( auto mut_croot = c.cache.duplicate_for_write(c.trans, croot); croot = mut_croot->cast(); } - croot->root.lba_root_addr = begin()->get_val(); + croot->get_root().lba_root = lba_root_t{ + begin()->get_val(), + get_meta().depth - 1}; logger().debug( "LBAInternalNode::merge_entry: collapsing root {} to addr {}", *this, begin()->get_val()); - croot->root.lba_depth = get_meta().depth - 1; c.cache.retire_extent(c.trans, this); return merge_ertr::make_ready_future(replacement); }); diff --git a/src/crimson/os/seastore/lba_manager/btree/lba_btree_node_impl.h b/src/crimson/os/seastore/lba_manager/btree/lba_btree_node_impl.h index da92fe67aa4d..af8ddfdbeeee 100644 --- a/src/crimson/os/seastore/lba_manager/btree/lba_btree_node_impl.h +++ b/src/crimson/os/seastore/lba_manager/btree/lba_btree_node_impl.h @@ -32,14 +32,14 @@ constexpr size_t LBA_BLOCK_SIZE = 4096; struct lba_node_meta_le_t { laddr_le_t begin = laddr_le_t(0); laddr_le_t end = laddr_le_t(0); - depth_le_t depth = init_les32(0); + depth_le_t depth = init_depth_le(0); lba_node_meta_le_t() = default; lba_node_meta_le_t(const lba_node_meta_le_t &) = default; explicit lba_node_meta_le_t(const lba_node_meta_t &val) : begin(init_le64(val.begin)), end(init_le64(val.end)), - depth(init_les32(val.depth)) {} + depth(init_depth_le(val.depth)) {} operator lba_node_meta_t() const { return lba_node_meta_t{ begin, end, depth }; @@ -317,7 +317,7 @@ constexpr size_t LEAF_NODE_CAPACITY = 145; * On disk layout for lba_map_val_t. */ struct lba_map_val_le_t { - extent_len_le_t len = init_extent_len_le_t(0); + extent_len_le_t len = init_extent_len_le(0); paddr_le_t paddr; ceph_le32 refcount = init_le32(0); ceph_le32 checksum = init_le32(0); @@ -325,7 +325,7 @@ struct lba_map_val_le_t { lba_map_val_le_t() = default; lba_map_val_le_t(const lba_map_val_le_t &) = default; explicit lba_map_val_le_t(const lba_map_val_t &val) - : len(init_extent_len_le_t(val.len)), + : len(init_extent_len_le(val.len)), paddr(paddr_le_t(val.paddr)), refcount(init_le32(val.refcount)), checksum(init_le32(val.checksum)) {} diff --git a/src/crimson/os/seastore/omap_manager/btree/omap_types.h b/src/crimson/os/seastore/omap_manager/btree/omap_types.h index a188bda0c006..1f2c770dc89e 100644 --- a/src/crimson/os/seastore/omap_manager/btree/omap_types.h +++ b/src/crimson/os/seastore/omap_manager/btree/omap_types.h @@ -31,12 +31,12 @@ struct omap_node_meta_t { }; struct omap_node_meta_le_t { - depth_le_t depth = init_les32(0); + depth_le_t depth = init_depth_le(0); omap_node_meta_le_t() = default; omap_node_meta_le_t(const omap_node_meta_le_t &) = default; explicit omap_node_meta_le_t(const omap_node_meta_t &val) - : depth(init_les32(val.depth)) {} + : depth(init_depth_le(val.depth)) {} operator omap_node_meta_t() const { return omap_node_meta_t{ depth }; diff --git a/src/crimson/os/seastore/root_block.h b/src/crimson/os/seastore/root_block.h index c4c1036e23ce..57d64ad7ca13 100644 --- a/src/crimson/os/seastore/root_block.h +++ b/src/crimson/os/seastore/root_block.h @@ -7,28 +7,6 @@ namespace crimson::os::seastore { -/** - * root_t - * - * Contains information required to find metadata roots. - * TODO: generalize this to permit more than one lba_manager implementation - */ -struct __attribute__((aligned(8), packed)) root_t { - depth_t lba_depth = 0; - depth_t segment_depth = 0; - paddr_t lba_root_addr; - 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()) { - lba_root_addr = base.add_record_relative(lba_root_addr); - } - } -}; - /** * RootBlock * diff --git a/src/crimson/os/seastore/seastore_types.h b/src/crimson/os/seastore/seastore_types.h index 0e78e863c865..cfc6bf414f7a 100644 --- a/src/crimson/os/seastore/seastore_types.h +++ b/src/crimson/os/seastore/seastore_types.h @@ -14,8 +14,12 @@ namespace crimson::os::seastore { -using depth_t = int32_t; -using depth_le_t = ceph_les32; +using depth_t = uint32_t; +using depth_le_t = ceph_le32; + +inline depth_le_t init_depth_le(uint32_t i) { + return init_le32(i); +} using checksum_t = uint32_t; @@ -172,7 +176,7 @@ constexpr paddr_t make_fake_paddr(segment_off_t off) { return paddr_t{FAKE_SEG_ID, off}; } -struct paddr_le_t { +struct __attribute((packed)) paddr_le_t { ceph_le32 segment = init_le32(NULL_SEG_ID); ceph_les32 offset = init_les32(NULL_SEG_OFF); @@ -225,7 +229,7 @@ constexpr laddr_t L_ADDR_NULL = std::numeric_limits::max(); constexpr laddr_t L_ADDR_ROOT = std::numeric_limits::max() - 1; constexpr laddr_t L_ADDR_LBAT = std::numeric_limits::max() - 2; -struct laddr_le_t { +struct __attribute((packed)) laddr_le_t { ceph_le64 laddr = init_le64(L_ADDR_NULL); laddr_le_t() = default; @@ -250,7 +254,7 @@ constexpr extent_len_t EXTENT_LEN_MAX = std::numeric_limits::max(); using extent_len_le_t = ceph_le32; -inline extent_len_le_t init_extent_len_le_t(extent_len_t len) { +inline extent_len_le_t init_extent_len_le(extent_len_t len) { return init_le32(len); } @@ -365,45 +369,126 @@ struct record_t { }; /** - * coll_root_t - * - * Information for locating CollectionManager information, addr should be - * embedded into the TransactionManager root. + * lba_root_t */ -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; +class __attribute__((packed)) lba_root_t { + paddr_le_t root_addr; + depth_le_t depth = init_extent_len_le(0); public: - coll_root_t() : state(state_t::NONE) {} + lba_root_t() = default; - coll_root_t(laddr_t laddr, segment_off_t size) - : coll_root_laddr(laddr), size(size), state(state_t::CLEAN) {} + lba_root_t(paddr_t addr, depth_t depth) + : root_addr(addr), depth(init_depth_le(depth)) {} + + lba_root_t(const lba_root_t &o) = default; + lba_root_t(lba_root_t &&o) = default; + lba_root_t &operator=(const lba_root_t &o) = default; + lba_root_t &operator=(lba_root_t &&o) = default; + + paddr_t get_location() const { + return root_addr; + } + + void set_location(paddr_t location) { + root_addr = location; + } + + depth_t get_depth() const { + return depth; + } + + void adjust_addrs_from_base(paddr_t base) { + paddr_t _root_addr = root_addr; + if (_root_addr.is_relative()) { + root_addr = base.add_record_relative(_root_addr); + } + } +}; + +class coll_root_t { + laddr_t addr = L_ADDR_NULL; + extent_len_t size = 0; + + bool mutated = false; + +public: + coll_root_t() = default; + coll_root_t(laddr_t addr, extent_len_t size) : addr(addr), size(size) {} + + coll_root_t(const coll_root_t &o) = default; + coll_root_t(coll_root_t &&o) = default; + coll_root_t &operator=(const coll_root_t &o) = default; + coll_root_t &operator=(coll_root_t &&o) = default; bool must_update() const { - return state == MUTATED; + return mutated; } - void update(laddr_t addr, segment_off_t s) { - state = state_t::MUTATED; - coll_root_laddr = addr; - size = s; + void update(laddr_t _addr, extent_len_t _s) { + mutated = true; + addr = _addr; + size = _s; } laddr_t get_location() const { - return coll_root_laddr; + return addr; } - auto get_size() const { + + extent_len_t get_size() const { return size; } }; +/** + * coll_root_le_t + * + * Information for locating CollectionManager information, to be embedded + * in root block. + */ +class __attribute__((packed)) coll_root_le_t { + laddr_le_t addr; + extent_len_le_t size = init_extent_len_le(0); + +public: + coll_root_le_t() = default; + + coll_root_le_t(laddr_t laddr, segment_off_t size) + : addr(laddr), size(init_extent_len_le(size)) {} + + + coll_root_le_t(const coll_root_le_t &o) = default; + coll_root_le_t(coll_root_le_t &&o) = default; + coll_root_le_t &operator=(const coll_root_le_t &o) = default; + coll_root_le_t &operator=(coll_root_le_t &&o) = default; + + void update(const coll_root_t &nroot) { + addr = nroot.get_location(); + size = init_extent_len_le(nroot.get_size()); + } + + coll_root_t get() const { + return coll_root_t(addr, size); + } +}; + + +/** + * root_t + * + * Contains information required to find metadata roots. + * TODO: generalize this to permit more than one lba_manager implementation + */ +struct __attribute__((packed)) root_t { + lba_root_t lba_root; + laddr_le_t onode_root; + coll_root_le_t collection_root; + + void adjust_addrs_from_base(paddr_t base) { + lba_root.adjust_addrs_from_base(base); + } +}; + } 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 4317e4b83985..897475982361 100644 --- a/src/crimson/os/seastore/transaction_manager.h +++ b/src/crimson/os/seastore/transaction_manager.h @@ -327,7 +327,8 @@ public: using read_onode_root_ret = read_onode_root_ertr::future; read_onode_root_ret read_onode_root(Transaction &t) { return cache->get_root(t).safe_then([](auto croot) { - return croot->get_root().onode_root; + laddr_t ret = croot->get_root().onode_root; + return ret; }); } @@ -352,10 +353,7 @@ public: coll_root_t>; read_collection_root_ret read_collection_root(Transaction &t) { return cache->get_root(t).safe_then([](auto croot) { - return coll_root_t{ - croot->get_root().collection_root, - croot->get_root().collection_root_size - }; + return croot->get_root().collection_root.get(); }); } @@ -367,8 +365,7 @@ public: 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(); + croot->get_root().collection_root.update(cmroot); } ~TransactionManager();