).si_then([=, this, &t](lba_pin_list_t pin_list) {
return seastar::do_with(
std::list<CachedExtentRef>(),
- std::move(pin_list),
- [=, this, &t](std::list<CachedExtentRef> &list, lba_pin_list_t &pin_list) {
- auto &seg_addr = addr.as_seg_paddr();
- auto seg_addr_id = seg_addr.get_segment_id();
- return trans_intr::parallel_for_each(pin_list, [=, this, &seg_addr, &list, &t](LBAPinRef &pin) ->
- Cache::get_extent_iertr::future<> {
- auto pin_laddr = pin->get_key();
- auto pin_paddr = pin->get_val();
- auto pin_len = pin->get_length();
-
- auto &pin_seg_addr = pin_paddr.as_seg_paddr();
- auto pin_seg_addr_id = pin_seg_addr.get_segment_id();
-
- if (pin_seg_addr_id != seg_addr_id ||
- pin_paddr < seg_addr ||
- pin_paddr.add_offset(pin_len) > seg_addr.add_offset(len)) {
- return seastar::now();
- }
- return cache->get_extent_by_type(
- t, type, pin_paddr, pin_laddr, pin_len,
- [this, pin=std::move(pin)](CachedExtent &extent) mutable {
- auto lref = extent.cast<LogicalCachedExtent>();
- assert(!lref->has_pin());
- assert(!lref->has_been_invalidated());
- assert(!pin->has_been_invalidated());
- lref->set_pin(std::move(pin));
- lba_manager->add_pin(lref->get_pin());
- }
- ).si_then([=, &list](auto ret) {
- list.emplace_back(std::move(ret));
- return seastar::now();
- });
- }).si_then([&list] {
- return get_extents_if_live_ret(
- interruptible::ready_future_marker{},
- std::move(list));
- });
- });
+ [=, this, &t, pin_list=std::move(pin_list)](
+ std::list<CachedExtentRef> &list) mutable
+ {
+ auto paddr_seg_id = paddr.as_seg_paddr().get_segment_id();
+ return trans_intr::parallel_for_each(
+ std::move(pin_list),
+ [=, this, &list, &t](
+ LBAPinRef &pin) -> Cache::get_extent_iertr::future<>
+ {
+ auto pin_paddr = pin->get_val();
+ auto &pin_seg_paddr = pin_paddr.as_seg_paddr();
+ auto pin_paddr_seg_id = pin_seg_paddr.get_segment_id();
+ auto pin_len = pin->get_length();
+ if (pin_paddr_seg_id != paddr_seg_id) {
+ return seastar::now();
+ }
+ // Only extent split can happen during the lookup
+ ceph_assert(pin_seg_paddr >= paddr &&
+ pin_seg_paddr.add_offset(pin_len) <= paddr.add_offset(len));
+ return pin_to_extent_by_type(t, std::move(pin), type
+ ).si_then([&list](auto ret) {
+ list.emplace_back(std::move(ret));
+ return seastar::now();
+ });
+ }).si_then([&list] {
+ return get_extents_if_live_ret(
+ interruptible::ready_future_marker{},
+ std::move(list));
+ });
+ });
}).handle_error_interruptible(crimson::ct_error::enoent::handle([] {
- return std::list<CachedExtentRef>();
+ return get_extents_if_live_ret(
+ interruptible::ready_future_marker{},
+ std::list<CachedExtentRef>());
}), crimson::ct_error::pass_further_all{});
} else {
return lba_manager->get_physical_extent_if_live(