mirror of
https://github.com/ceph/ceph
synced 2025-02-24 03:27:10 +00:00
crimson/os/seastore/transaction: let get_extent signal retired extents
Signed-off-by: Samuel Just <sjust@redhat.com>
This commit is contained in:
parent
39dee50f75
commit
f9d0aae639
@ -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));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user