]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore: add backref nodes
authorXuehan Xu <xxhdx1985126@gmail.com>
Thu, 10 Feb 2022 08:22:57 +0000 (16:22 +0800)
committerXuehan Xu <xxhdx1985126@gmail.com>
Sun, 24 Apr 2022 01:34:28 +0000 (09:34 +0800)
Signed-off-by: Xuehan Xu <xxhdx1985126@gmail.com>
src/crimson/os/seastore/CMakeLists.txt
src/crimson/os/seastore/backref/backref_tree_node.cc [new file with mode: 0644]
src/crimson/os/seastore/backref/backref_tree_node.h [new file with mode: 0644]
src/crimson/os/seastore/btree/fixed_kv_btree.h
src/crimson/os/seastore/cache.cc
src/crimson/os/seastore/seastore_types.cc
src/crimson/os/seastore/seastore_types.h

index 2e3ec4a5fe0366ffa204af6a9e4652d2fb2e19bd..127f4a23acee62f37fb8c2f2f90e370df152f492 100644 (file)
@@ -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 (file)
index 0000000..513c299
--- /dev/null
@@ -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 (file)
index 0000000..8197746
--- /dev/null
@@ -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<paddr_t>;
+
+constexpr size_t INTERNAL_NODE_CAPACITY = 254;
+constexpr size_t LEAF_NODE_CAPACITY = 169;
+
+using BackrefNode = FixedKVNode<paddr_t>;
+
+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 <typename... T>
+  BackrefInternalNode(T&&... t) :
+    FixedKVInternalNode(std::forward<T>(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 <typename... T>
+  BackrefLeafNode(T&&... t) :
+    FixedKVLeafNode(std::forward<T>(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
index 81c8b9cd6686791c973b387cf3387de706b782e7..701ae45ae484ed23a5cb9e793f2e98df1e9ee017 100644 (file)
@@ -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<
index e988fa818713b392e3196234c7b3aa34b6e8206b..c037c062526ad26fc3e93c92fcc1c626ec062eef 100644 (file)
@@ -1507,6 +1507,18 @@ Cache::get_extent_ertr::future<CachedExtentRef> 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<CachedExtentRef>();
+    case extent_types_t::BACKREF_INTERNAL:
+      return get_extent<backref::BackrefInternalNode>(
+       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<backref::BackrefLeafNode>(
+       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<lba_manager::btree::LBAInternalNode>(
        offset, length, p_metric_key, std::move(extent_init_func)
index d98a75dea747de0dfa1078311df71bc3a36afc34..0500bcf540e347462d9f39a25522d4dd197f642a 100644 (file)
@@ -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:
index 2a70f1fd34f064e3c7c03c48dec53a4bcb10ac4c..adfc0b2d8adba4894e0abb3721cd4b2fd6e8516b 100644 (file)
@@ -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<uint8_t>(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 {