From 76f1ebe8c775fb5e0d8a8ff967981d163fb64ae0 Mon Sep 17 00:00:00 2001 From: Zhang Song Date: Tue, 6 Dec 2022 14:48:02 +0800 Subject: [PATCH] crimson/os/seastore: add prior_poffset field in CachedExtent Signed-off-by: Zhang Song --- src/crimson/os/seastore/cache.cc | 2 ++ src/crimson/os/seastore/cached_extent.h | 23 ++++++++++++++++++++++- src/crimson/os/seastore/transaction.h | 5 +++-- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/crimson/os/seastore/cache.cc b/src/crimson/os/seastore/cache.cc index 97f1cbaf38f..4685cdb9791 100644 --- a/src/crimson/os/seastore/cache.cc +++ b/src/crimson/os/seastore/cache.cc @@ -1009,6 +1009,8 @@ CachedExtentRef Cache::duplicate_for_write( auto ret = i->duplicate_for_write(); ret->prior_instance = i; + // duplicate_for_write won't occur after ool write finished + assert(!i->prior_poffset); t.add_mutated_extent(ret); if (ret->get_type() == extent_types_t::ROOT) { t.root = ret->cast(); diff --git a/src/crimson/os/seastore/cached_extent.h b/src/crimson/os/seastore/cached_extent.h index c4283616235..e7b85e7fcd6 100644 --- a/src/crimson/os/seastore/cached_extent.h +++ b/src/crimson/os/seastore/cached_extent.h @@ -202,12 +202,16 @@ public: friend std::ostream &operator<<(std::ostream &, extent_state_t); virtual std::ostream &print_detail(std::ostream &out) const { return out; } std::ostream &print(std::ostream &out) const { + std::string prior_poffset_str = prior_poffset + ? fmt::format("{}", *prior_poffset) + : "nullopt"; out << "CachedExtent(addr=" << this << ", type=" << get_type() << ", version=" << version << ", dirty_from_or_retired_at=" << dirty_from_or_retired_at << ", modify_time=" << sea_time_point_printer_t{modify_time} << ", paddr=" << get_paddr() + << ", prior_paddr=" << prior_poffset_str << ", length=" << get_length() << ", state=" << state << ", last_committed_crc=" << last_committed_crc @@ -414,6 +418,14 @@ public: bool is_inline() const { return poffset.is_relative(); } + + paddr_t get_prior_paddr_and_reset() { + assert(prior_poffset); + auto ret = *prior_poffset; + prior_poffset.reset(); + return ret; + } + private: template friend class read_set_item_t; @@ -466,6 +478,9 @@ private: /// address of original block -- relative iff is_pending() and is_clean() paddr_t poffset; + /// relative address before ool write, used to update mapping + std::optional prior_poffset = std::nullopt; + /// used to wait while in-progress commit completes std::optional> io_wait_promise; void set_io_wait() { @@ -531,7 +546,13 @@ protected: last_committed_crc = crc; } - void set_paddr(paddr_t offset) { poffset = offset; } + void set_paddr(paddr_t offset, bool need_update_mapping = false) { + if (need_update_mapping) { + assert(!prior_poffset); + prior_poffset = poffset; + } + poffset = offset; + } /** * maybe_generate_relative diff --git a/src/crimson/os/seastore/transaction.h b/src/crimson/os/seastore/transaction.h index 8901de8b2bb..b96da8a529e 100644 --- a/src/crimson/os/seastore/transaction.h +++ b/src/crimson/os/seastore/transaction.h @@ -180,7 +180,8 @@ public: void mark_delayed_extent_inline(LogicalCachedExtentRef& ref) { write_set.erase(*ref); assert(ref->get_paddr().is_delayed()); - ref->set_paddr(make_record_relative_paddr(offset)); + ref->set_paddr(make_record_relative_paddr(offset), + /* need_update_mapping: */ true); offset += ref->get_length(); inline_block_list.push_back(ref); write_set.insert(*ref); @@ -189,7 +190,7 @@ public: void mark_delayed_extent_ool(LogicalCachedExtentRef& ref, paddr_t final_addr) { write_set.erase(*ref); assert(ref->get_paddr().is_delayed()); - ref->set_paddr(final_addr); + ref->set_paddr(final_addr, /* need_update_mapping: */ true); assert(!ref->get_paddr().is_null()); assert(!ref->is_inline()); written_ool_block_list.push_back(ref); -- 2.39.5