From 6c7de641c78f6a4c2c6773b0028c2aa356bc9ea0 Mon Sep 17 00:00:00 2001 From: Yingxin Cheng Date: Wed, 18 Dec 2024 16:56:00 +0800 Subject: [PATCH] crimson/os/seastore: introduce named factory methods for alloc/retire Signed-off-by: Yingxin Cheng --- src/crimson/os/seastore/cache.cc | 48 ++++++++++++------------ src/crimson/os/seastore/cache.h | 34 ++++++++++++++++- src/crimson/os/seastore/seastore_types.h | 23 +++++++++++- 3 files changed, 77 insertions(+), 28 deletions(-) diff --git a/src/crimson/os/seastore/cache.cc b/src/crimson/os/seastore/cache.cc index 1f29d208bd2..a08b8698c90 100644 --- a/src/crimson/os/seastore/cache.cc +++ b/src/crimson/os/seastore/cache.cc @@ -1358,10 +1358,10 @@ record_t Cache::prepare_record( if (is_backref_mapped_type(extent->get_type()) || is_retired_placeholder_type(extent->get_type())) { rel_delta.alloc_blk_ranges.emplace_back( - extent->get_paddr(), - L_ADDR_NULL, - extent->get_length(), - extent->get_type()); + alloc_blk_t::create_retire( + extent->get_paddr(), + extent->get_length(), + extent->get_type())); } } alloc_deltas.emplace_back(std::move(rel_delta)); @@ -1424,10 +1424,11 @@ record_t Cache::prepare_record( alloc_laddr = L_ADDR_MIN; } alloc_delta.alloc_blk_ranges.emplace_back( - i->get_paddr(), - alloc_laddr, - i->get_length(), - i->get_type()); + alloc_blk_t::create_alloc( + i->get_paddr(), + alloc_laddr, + i->get_length(), + i->get_type())); } } @@ -1447,10 +1448,11 @@ record_t Cache::prepare_record( alloc_laddr = i->cast()->get_node_meta().begin; } alloc_delta.alloc_blk_ranges.emplace_back( - i->get_paddr(), - alloc_laddr, - i->get_length(), - i->get_type()); + alloc_blk_t::create_alloc( + i->get_paddr(), + alloc_laddr, + i->get_length(), + i->get_type())); } } @@ -1475,10 +1477,11 @@ record_t Cache::prepare_record( for (auto &i: t.existing_block_list) { if (i->is_valid()) { alloc_delta.alloc_blk_ranges.emplace_back( - i->get_paddr(), - i->cast()->get_laddr(), - i->get_length(), - i->get_type()); + alloc_blk_t::create_alloc( + i->get_paddr(), + i->cast()->get_laddr(), + i->get_length(), + i->get_type())); } } alloc_deltas.emplace_back(std::move(alloc_delta)); @@ -1711,7 +1714,7 @@ void Cache::complete_commit( alloc_laddr = L_ADDR_MIN; } backref_entries.emplace_back( - std::make_unique( + backref_entry_t::create_alloc( i->get_paddr(), alloc_laddr, i->get_length(), @@ -1775,9 +1778,8 @@ void Cache::complete_commit( extent->get_paddr(), extent->get_length()); backref_entries.emplace_back( - std::make_unique( + backref_entry_t::create_retire( extent->get_paddr(), - L_ADDR_NULL, extent->get_length(), extent->get_type())); } else if (is_backref_node(extent->get_type())) { @@ -1807,7 +1809,7 @@ void Cache::complete_commit( i->get_paddr(), i->get_length()); backref_entries.emplace_back( - std::make_unique( + backref_entry_t::create_alloc( i->get_paddr(), i->cast()->get_laddr(), i->get_length(), @@ -1955,11 +1957,7 @@ Cache::replay_delta( DEBUG("replay alloc_blk {}~0x{:x} {}, journal_seq: {}", alloc_blk.paddr, alloc_blk.len, alloc_blk.laddr, journal_seq); backref_entries.emplace_back( - std::make_unique( - alloc_blk.paddr, - alloc_blk.laddr, - alloc_blk.len, - alloc_blk.type)); + backref_entry_t::create(alloc_blk)); } if (!backref_entries.empty()) { backref_batch_update(std::move(backref_entries), journal_seq); diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index a6fbf2196b1..acba71b9ec6 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -39,6 +39,8 @@ class BackrefManager; class SegmentProvider; struct backref_entry_t { + using ref_t = std::unique_ptr; + backref_entry_t( const paddr_t& paddr, const laddr_t& laddr, @@ -47,7 +49,9 @@ struct backref_entry_t { : paddr(paddr), laddr(laddr), len(len), - type(type) {} + type(type) { + assert(len > 0); + } paddr_t paddr = P_ADDR_NULL; laddr_t laddr = L_ADDR_NULL; extent_len_t len = 0; @@ -96,11 +100,37 @@ struct backref_entry_t { return l.paddr < r; } }; + + static ref_t create_alloc( + const paddr_t& paddr, + const laddr_t& laddr, + extent_len_t len, + extent_types_t type) { + assert(is_backref_mapped_type(type)); + assert(laddr != L_ADDR_NULL); + return std::make_unique( + paddr, laddr, len, type); + } + + static ref_t create_retire( + const paddr_t& paddr, + extent_len_t len, + extent_types_t type) { + assert(is_backref_mapped_type(type) || + is_retired_placeholder_type(type)); + return std::make_unique( + paddr, L_ADDR_NULL, len, type); + } + + static ref_t create(const alloc_blk_t& delta) { + return std::make_unique( + delta.paddr, delta.laddr, delta.len, delta.type); + } }; std::ostream &operator<<(std::ostream &out, const backref_entry_t &ent); -using backref_entry_ref = std::unique_ptr; +using backref_entry_ref = backref_entry_t::ref_t; using backref_entry_mset_t = backref_entry_t::multiset_t; using backref_entry_refs_t = std::vector; using backref_entryrefs_by_seq_t = std::map; diff --git a/src/crimson/os/seastore/seastore_types.h b/src/crimson/os/seastore/seastore_types.h index 98a37cdd33c..335a439dcb5 100644 --- a/src/crimson/os/seastore/seastore_types.h +++ b/src/crimson/os/seastore/seastore_types.h @@ -1965,7 +1965,9 @@ struct alloc_blk_t { const laddr_t& laddr, extent_len_t len, extent_types_t type) - : paddr(paddr), laddr(laddr), len(len), type(type) {} + : paddr(paddr), laddr(laddr), len(len), type(type) { + assert(len > 0); + } explicit alloc_blk_t() = default; @@ -1981,6 +1983,25 @@ struct alloc_blk_t { denc(v.type, p); DENC_FINISH(p); } + + static alloc_blk_t create_alloc( + const paddr_t& paddr, + const laddr_t& laddr, + extent_len_t len, + extent_types_t type) { + assert(is_backref_mapped_type(type)); + assert(laddr != L_ADDR_NULL); + return alloc_blk_t(paddr, laddr, len, type); + } + + static alloc_blk_t create_retire( + const paddr_t& paddr, + extent_len_t len, + extent_types_t type) { + assert(is_backref_mapped_type(type) || + is_retired_placeholder_type(type)); + return alloc_blk_t(paddr, L_ADDR_NULL, len, type); + } }; // use absolute address -- 2.47.3