From: Xuehan Xu Date: Thu, 10 Feb 2022 08:22:57 +0000 (+0800) Subject: crimson/os/seastore: add backref nodes X-Git-Tag: v18.0.0~915^2~22 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ba972495e9d20317d09a9ef4c1e6baeb5f8d1a40;p=ceph.git crimson/os/seastore: add backref nodes Signed-off-by: Xuehan Xu --- diff --git a/src/crimson/os/seastore/CMakeLists.txt b/src/crimson/os/seastore/CMakeLists.txt index 2e3ec4a5fe0..127f4a23ace 100644 --- a/src/crimson/os/seastore/CMakeLists.txt +++ b/src/crimson/os/seastore/CMakeLists.txt @@ -9,6 +9,7 @@ set(crimson_seastore_srcs cache.cc lba_manager.cc segment_cleaner.cc + backref/backref_tree_node.cc lba_manager/btree/btree_lba_manager.cc lba_manager/btree/lba_btree_node.cc omap_manager.cc diff --git a/src/crimson/os/seastore/backref/backref_tree_node.cc b/src/crimson/os/seastore/backref/backref_tree_node.cc new file mode 100644 index 00000000000..513c299940d --- /dev/null +++ b/src/crimson/os/seastore/backref/backref_tree_node.cc @@ -0,0 +1,14 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#include "crimson/os/seastore/backref/backref_tree_node.h" + +namespace crimson::os::seastore::backref { + +std::ostream& operator<<(std::ostream &out, const backref_map_val_t& val) { + return out << "backref_map_val_t(" + << val.laddr + << "~" << val.len << ")"; +} + +} // namespace crimson::os::seastore::backref diff --git a/src/crimson/os/seastore/backref/backref_tree_node.h b/src/crimson/os/seastore/backref/backref_tree_node.h new file mode 100644 index 00000000000..81977462da1 --- /dev/null +++ b/src/crimson/os/seastore/backref/backref_tree_node.h @@ -0,0 +1,125 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab + +#pragma once + +#include "crimson/os/seastore/btree/fixed_kv_node.h" + +namespace crimson::os::seastore::backref { + +using backref_node_meta_le_t = fixed_kv_node_meta_le_t; + +constexpr size_t INTERNAL_NODE_CAPACITY = 254; +constexpr size_t LEAF_NODE_CAPACITY = 169; + +using BackrefNode = FixedKVNode; + +struct backref_map_val_t { + extent_len_t len = 0; ///< length of extents + laddr_t laddr = 0; ///< logical address of extents + extent_types_t type = extent_types_t::ROOT; + + backref_map_val_t() = default; + backref_map_val_t( + extent_len_t len, + laddr_t laddr, + extent_types_t type) + : len(len), laddr(laddr), type(type) {} +}; +WRITE_EQ_OPERATORS_2( + backref_map_val_t, + len, + laddr); + +std::ostream& operator<<(std::ostream &out, const backref_map_val_t& val); + +struct backref_map_val_le_t { + extent_len_le_t len = init_extent_len_le(0); + laddr_le_t laddr = laddr_le_t(0); + extent_types_le_t type = 0; + + backref_map_val_le_t() = default; + backref_map_val_le_t(const backref_map_val_le_t &val) + : len(init_extent_len_le(val.len)), + laddr(val.laddr), + type(extent_types_le_t(val.type)) {} + + operator backref_map_val_t() const { + return backref_map_val_t{len, laddr, (extent_types_t)type}; + } +}; + +class BackrefInternalNode + : public FixedKVInternalNode< + INTERNAL_NODE_CAPACITY, + paddr_t, paddr_le_t, + BACKREF_NODE_SIZE, + BackrefInternalNode> { +public: + template + BackrefInternalNode(T&&... t) : + FixedKVInternalNode(std::forward(t)...) {} + + static constexpr extent_types_t TYPE = extent_types_t::BACKREF_INTERNAL; + + extent_types_t get_type() const final { + return TYPE; + } +}; +using BackrefInternalNodeRef = BackrefInternalNode::Ref; + +class BackrefLeafNode + : public FixedKVLeafNode< + LEAF_NODE_CAPACITY, + paddr_t, paddr_le_t, + backref_map_val_t, backref_map_val_le_t, + BACKREF_NODE_SIZE, + BackrefLeafNode> { +public: + template + BackrefLeafNode(T&&... t) : + FixedKVLeafNode(std::forward(t)...) {} + + static constexpr extent_types_t TYPE = extent_types_t::BACKREF_LEAF; + + extent_types_t get_type() const final { + return TYPE; + } + + const_iterator insert( + const_iterator iter, + paddr_t key, + backref_map_val_t val) final { + journal_insert( + iter, + key, + val, + maybe_get_delta_buffer()); + return iter; + } + + void update( + const_iterator iter, + backref_map_val_t val) final { + return journal_update( + iter, + val, + maybe_get_delta_buffer()); + } + + void remove(const_iterator iter) final { + return journal_remove( + iter, + maybe_get_delta_buffer()); + } + + // backref leaf nodes don't have to resolve relative addresses + void resolve_relative_addrs(paddr_t base) final {} + + void node_resolve_vals(iterator from, iterator to) const final {} + + void node_unresolve_vals(iterator from, iterator to) const final {} +}; +using BackrefLeafNodeRef = BackrefLeafNode::Ref; + +} // namespace crimson::os::seastore::backref diff --git a/src/crimson/os/seastore/btree/fixed_kv_btree.h b/src/crimson/os/seastore/btree/fixed_kv_btree.h index 81c8b9cd668..701ae45ae48 100644 --- a/src/crimson/os/seastore/btree/fixed_kv_btree.h +++ b/src/crimson/os/seastore/btree/fixed_kv_btree.h @@ -793,7 +793,9 @@ public: CachedExtentRef e) { LOG_PREFIX(FixedKVBtree::rewrite_extent); assert(e->get_type() == extent_types_t::LADDR_INTERNAL || - e->get_type() == extent_types_t::LADDR_LEAF); + e->get_type() == extent_types_t::LADDR_LEAF || + e->get_type() == extent_types_t::BACKREF_INTERNAL || + e->get_type() == extent_types_t::BACKREF_LEAF); auto do_rewrite = [&](auto &fixed_kv_extent) { auto n_fixed_kv_extent = c.cache.template alloc_new_extent< diff --git a/src/crimson/os/seastore/cache.cc b/src/crimson/os/seastore/cache.cc index e988fa81871..c037c062526 100644 --- a/src/crimson/os/seastore/cache.cc +++ b/src/crimson/os/seastore/cache.cc @@ -1507,6 +1507,18 @@ Cache::get_extent_ertr::future Cache::_get_extent_by_type( case extent_types_t::ROOT: ceph_assert(0 == "ROOT is never directly read"); return get_extent_ertr::make_ready_future(); + case extent_types_t::BACKREF_INTERNAL: + return get_extent( + offset, length, p_metric_key, std::move(extent_init_func) + ).safe_then([](auto extent) { + return CachedExtentRef(extent.detach(), false /* add_ref */); + }); + case extent_types_t::BACKREF_LEAF: + return get_extent( + offset, length, p_metric_key, std::move(extent_init_func) + ).safe_then([](auto extent) { + return CachedExtentRef(extent.detach(), false /* add_ref */); + }); case extent_types_t::LADDR_INTERNAL: return get_extent( offset, length, p_metric_key, std::move(extent_init_func) diff --git a/src/crimson/os/seastore/seastore_types.cc b/src/crimson/os/seastore/seastore_types.cc index d98a75dea74..0500bcf540e 100644 --- a/src/crimson/os/seastore/seastore_types.cc +++ b/src/crimson/os/seastore/seastore_types.cc @@ -162,6 +162,10 @@ std::ostream &operator<<(std::ostream &out, extent_types_t t) return out << "TEST_BLOCK"; case extent_types_t::TEST_BLOCK_PHYSICAL: return out << "TEST_BLOCK_PHYSICAL"; + case extent_types_t::BACKREF_INTERNAL: + return out << "BACKREF_INTERNAL"; + case extent_types_t::BACKREF_LEAF: + return out << "BACKREF_LEAF"; case extent_types_t::NONE: return out << "NONE"; default: diff --git a/src/crimson/os/seastore/seastore_types.h b/src/crimson/os/seastore/seastore_types.h index 2a70f1fd34f..adfc0b2d8ad 100644 --- a/src/crimson/os/seastore/seastore_types.h +++ b/src/crimson/os/seastore/seastore_types.h @@ -860,11 +860,16 @@ enum class extent_types_t : uint8_t { // Test Block Types TEST_BLOCK = 10, TEST_BLOCK_PHYSICAL = 11, + BACKREF_INTERNAL = 12, + BACKREF_LEAF = 13, // None and the number of valid extent_types_t - NONE = 12, + NONE = 14, }; +using extent_types_le_t = uint8_t; constexpr auto EXTENT_TYPES_MAX = static_cast(extent_types_t::NONE); +constexpr size_t BACKREF_NODE_SIZE = 4096; + std::ostream &operator<<(std::ostream &out, extent_types_t t); constexpr bool is_logical_type(extent_types_t type) { @@ -884,6 +889,12 @@ constexpr bool is_lba_node(extent_types_t type) type == extent_types_t::LADDR_LEAF; } +constexpr bool is_backref_node(extent_types_t type) +{ + return type == extent_types_t::BACKREF_INTERNAL || + type == extent_types_t::BACKREF_LEAF; +} + std::ostream &operator<<(std::ostream &out, extent_types_t t); enum class record_commit_type_t : uint8_t {