]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
Merge pull request #47491 from cyx1231st/wip-seastore-fix-return-future
authorYingxin <yingxin.cheng@intel.com>
Wed, 17 Aug 2022 08:39:22 +0000 (16:39 +0800)
committerGitHub <noreply@github.com>
Wed, 17 Aug 2022 08:39:22 +0000 (16:39 +0800)
crimson/os/seastore/transaction_manager: return future when enoent

Reviewed-by: Chunmei Liu <chunmei.liu@intel.com>
Reviewed-by: Xuehan Xu <xxhdx1985126@gmail.com>
1  2 
src/crimson/os/seastore/transaction_manager.cc

index 5f8fce47c7c79a5fdde8ae7e1aba11b15d1d5510,5941d9ca4c21cfd177d4bbd5aa583fb7b91f418e..2bb215cff87558f70671fabd4047142f9fcfe67b
@@@ -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<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(