From f9d0aae639820b93284c06f9d77053f35ef880e1 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Fri, 21 Aug 2020 14:28:50 -0700 Subject: [PATCH] crimson/os/seastore/transaction: let get_extent signal retired extents Signed-off-by: Samuel Just --- src/crimson/os/seastore/cache.h | 12 +++++++++--- src/crimson/os/seastore/transaction.h | 21 ++++++++++++++++----- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index a31e044e1d60f..f57f1df67df1b 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -161,6 +161,8 @@ public: * - t if modified by t * - extent_set if already in cache * - disk + * + * t *must not* have retired offset */ template get_extent_ertr::future> get_extent( @@ -168,14 +170,18 @@ public: paddr_t offset, ///< [in] starting addr segment_off_t length ///< [in] length ) { - if (auto i = t.get_extent(offset)) { + CachedExtentRef ret; + auto result = t.get_extent(offset, &ret); + if (result != Transaction::get_extent_ret::ABSENT) { + assert(result != Transaction::get_extent_ret::RETIRED); return get_extent_ertr::make_ready_future>( - TCachedExtentRef(static_cast(&*i))); + ret->cast()); } else { return get_extent(offset, length).safe_then( [&t](auto ref) mutable { t.add_to_read_set(ref); - return get_extent_ertr::make_ready_future>(std::move(ref)); + return get_extent_ertr::make_ready_future>( + std::move(ref)); }); } } diff --git a/src/crimson/os/seastore/transaction.h b/src/crimson/os/seastore/transaction.h index 60d295820ebbc..e27531eac8946 100644 --- a/src/crimson/os/seastore/transaction.h +++ b/src/crimson/os/seastore/transaction.h @@ -32,16 +32,27 @@ class Transaction { pextent_set_t retired_set; ///< list of extents mutated by this transaction public: - CachedExtentRef get_extent(paddr_t addr) { - if (auto iter = write_set.find_offset(addr); + enum class get_extent_ret { + PRESENT, + ABSENT, + RETIRED + }; + get_extent_ret get_extent(paddr_t addr, CachedExtentRef *out) { + if (retired_set.count(addr)) { + return get_extent_ret::RETIRED; + } else if (auto iter = write_set.find_offset(addr); iter != write_set.end()) { - return CachedExtentRef(&*iter); + if (out) + *out = CachedExtentRef(&*iter); + return get_extent_ret::PRESENT; } else if ( auto iter = read_set.find(addr); iter != read_set.end()) { - return *iter; + if (out) + *out = CachedExtentRef(*iter); + return get_extent_ret::PRESENT; } else { - return CachedExtentRef(); + return get_extent_ret::ABSENT; } } -- 2.39.5