crimson/os/seastore/transaction: let get_extent signal retired extents

Signed-off-by: Samuel Just <sjust@redhat.com>
This commit is contained in:
Samuel Just 2020-08-21 14:28:50 -07:00
parent 39dee50f75
commit f9d0aae639
2 changed files with 25 additions and 8 deletions

View File

@ -161,6 +161,8 @@ public:
* - t if modified by t
* - extent_set if already in cache
* - disk
*
* t *must not* have retired offset
*/
template <typename T>
get_extent_ertr::future<TCachedExtentRef<T>> 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<T>>(
TCachedExtentRef<T>(static_cast<T*>(&*i)));
ret->cast<T>());
} else {
return get_extent<T>(offset, length).safe_then(
[&t](auto ref) mutable {
t.add_to_read_set(ref);
return get_extent_ertr::make_ready_future<TCachedExtentRef<T>>(std::move(ref));
return get_extent_ertr::make_ready_future<TCachedExtentRef<T>>(
std::move(ref));
});
}
}

View File

@ -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;
}
}