*/
using get_extent_ertr = base_ertr;
template <typename T>
- get_extent_ertr::future<TCachedExtentRef<T>> get_extent(
+ using get_extent_ret = get_extent_ertr::future<TCachedExtentRef<T>>;
+ template <typename T>
+ get_extent_ret<T> get_extent(
paddr_t offset, ///< [in] starting addr
segment_off_t length ///< [in] length
) {
if (auto iter = extents.find_offset(offset);
iter != extents.end()) {
auto ret = TCachedExtentRef<T>(static_cast<T*>(&*iter));
- return ret->wait_io().then([ret=std::move(ret)]() mutable {
- return get_extent_ertr::make_ready_future<TCachedExtentRef<T>>(
- std::move(ret));
+ return ret->wait_io(
+ ).then([ret=std::move(ret)]() mutable -> get_extent_ret<T> {
+ if (!ret->is_retired()) {
+ return get_extent_ret<T>(
+ get_extent_ertr::ready_future_marker{},
+ std::move(ret));
+ } else {
+ return crimson::ct_error::eagain::make();
+ }
});
} else {
auto ref = CachedExtent::make_cached_extent_ref<T>(