From: Yingxin Date: Wed, 17 Aug 2022 08:39:22 +0000 (+0800) Subject: Merge pull request #47491 from cyx1231st/wip-seastore-fix-return-future X-Git-Tag: v18.0.0~245 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b578d2ecb627e6bb3822d58f6e2eb4bb0ae982ef;p=ceph.git Merge pull request #47491 from cyx1231st/wip-seastore-fix-return-future crimson/os/seastore/transaction_manager: return future when enoent Reviewed-by: Chunmei Liu Reviewed-by: Xuehan Xu --- b578d2ecb627e6bb3822d58f6e2eb4bb0ae982ef diff --cc src/crimson/os/seastore/transaction_manager.cc index 5f8fce47c7c7,5941d9ca4c21..2bb215cff875 --- a/src/crimson/os/seastore/transaction_manager.cc +++ b/src/crimson/os/seastore/transaction_manager.cc @@@ -557,38 -583,48 +557,40 @@@ TransactionManager::get_extents_if_live ).si_then([=, this, &t](lba_pin_list_t pin_list) { return seastar::do_with( std::list(), - std::move(pin_list), - [=, this, &t](std::list &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(); - 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 &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(); + return get_extents_if_live_ret( + interruptible::ready_future_marker{}, + std::list()); }), crimson::ct_error::pass_further_all{}); } else { return lba_manager->get_physical_extent_if_live(