From 724a91c07fcdfba9eb4f3ada9fe50fd73ae55f97 Mon Sep 17 00:00:00 2001 From: Xuehan Xu Date: Tue, 15 Mar 2022 11:37:28 +0800 Subject: [PATCH] crimson/os/seastore/cache: record backref extents placement update in Cache::backref_extents Signed-off-by: Xuehan Xu --- src/crimson/os/seastore/cache.cc | 11 ++++++ src/crimson/os/seastore/cache.h | 57 ++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/src/crimson/os/seastore/cache.cc b/src/crimson/os/seastore/cache.cc index cf0cce2d58d86..f36d4c9d31d69 100644 --- a/src/crimson/os/seastore/cache.cc +++ b/src/crimson/os/seastore/cache.cc @@ -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(); diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index 14eac64922138..0748ab5cf7136 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -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 * -- 2.39.5