]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/cache: record backref extents placement update in Cache::backref_...
authorXuehan Xu <xxhdx1985126@gmail.com>
Tue, 15 Mar 2022 03:37:28 +0000 (11:37 +0800)
committerXuehan Xu <xxhdx1985126@gmail.com>
Sat, 7 May 2022 05:13:38 +0000 (13:13 +0800)
Signed-off-by: Xuehan Xu <xxhdx1985126@gmail.com>
src/crimson/os/seastore/cache.cc
src/crimson/os/seastore/cache.h

index cf0cce2d58d86005cc6dd83ae3ae93bad9e7e758..f36d4c9d31d698a43ba3bac16654156f71544e96 100644 (file)
@@ -1287,6 +1287,11 @@ void Cache::complete_commit(
            i->get_length(),
            i->get_type(),
            seq));
+      } else if (is_backref_node(i->get_type())) {
+       add_backref_extent(i->get_paddr(), i->get_type());
+      } else {
+       ERRORT("{}", t, *i);
+       ceph_abort("not possible");
       }
     }
   });
@@ -1336,6 +1341,11 @@ void Cache::complete_commit(
          i->get_length(),
          i->get_type(),
          seq));
+    } else if (is_backref_node(i->get_type())) {
+      remove_backref_extent(i->get_paddr());
+    } else {
+      ERRORT("{}", t, *i);
+      ceph_abort("not possible");
     }
   }
   if (!backref_list.empty())
@@ -1391,6 +1401,7 @@ Cache::close_ertr::future<> Cache::close()
     intrusive_ptr_release(ptr);
   }
   backref_bufs_to_flush.clear();
+  backref_extents.clear();
   backref_buffer.reset();
   assert(stats.dirty_bytes == 0);
   lru.clear();
index 14eac64922138976a2091809dc0b44f6a7ebdecd..0748ab5cf71360f34f37d3d2eb14ca988f92978a 100644 (file)
@@ -938,6 +938,59 @@ public:
     }
   }
 
+  struct backref_extent_buf_entry_t {
+    backref_extent_buf_entry_t(
+      paddr_t paddr,
+      extent_types_t type)
+      : paddr(paddr), type(type) {}
+    paddr_t paddr = P_ADDR_NULL;
+    extent_types_t type = extent_types_t::ROOT;
+    struct cmp_t {
+      using is_transparent = paddr_t;
+      bool operator()(
+       const backref_extent_buf_entry_t &l,
+       const backref_extent_buf_entry_t &r) const {
+       return l.paddr < r.paddr;
+      }
+      bool operator()(
+       const paddr_t &l,
+       const backref_extent_buf_entry_t &r) const {
+       return l < r.paddr;
+      }
+      bool operator()(
+       const backref_extent_buf_entry_t &l,
+       const paddr_t &r) const {
+       return l.paddr < r;
+      }
+    };
+  };
+
+  void add_backref_extent(paddr_t paddr, extent_types_t type) {
+    assert(!paddr.is_relative());
+    auto [iter, inserted] = backref_extents.emplace(paddr, type);
+    assert(inserted);
+  }
+
+  void remove_backref_extent(paddr_t paddr) {
+    auto iter = backref_extents.find(paddr);
+    if (iter != backref_extents.end())
+      backref_extents.erase(iter);
+  }
+
+  std::set<
+    backref_extent_buf_entry_t,
+    backref_extent_buf_entry_t::cmp_t> get_backref_extents_in_range(
+    paddr_t start,
+    paddr_t end) {
+    auto start_iter = backref_extents.lower_bound(start);
+    auto end_iter = backref_extents.upper_bound(end);
+    std::set<
+      backref_extent_buf_entry_t,
+      backref_extent_buf_entry_t::cmp_t> res;
+    res.insert(start_iter, end_iter);
+    return res;
+  }
+
 private:
   ExtentPlacementManager& epm;
   RootBlockRef root;               ///< ref to current root
@@ -952,6 +1005,10 @@ private:
    */
   CachedExtent::list dirty;
 
+  std::set<
+    backref_extent_buf_entry_t,
+    backref_extent_buf_entry_t::cmp_t> backref_extents;
+
   /**
    * lru
    *