From: Samuel Just Date: Fri, 15 Jan 2021 01:26:13 +0000 (-0800) Subject: crimson/os/seastore: fix find_hole X-Git-Tag: v17.1.0~3095^2~5 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=260c7c4af9bc41bc81f66ce3837de9cc9eba33b0;p=ceph.git crimson/os/seastore: fix find_hole We actually need to propogate eagain errors now, fix to use do_until. Signed-off-by: Samuel Just --- diff --git a/src/crimson/os/seastore/lba_manager/btree/lba_btree_node_impl.cc b/src/crimson/os/seastore/lba_manager/btree/lba_btree_node_impl.cc index e143ce2566bea..81c20d1500fba 100644 --- a/src/crimson/os/seastore/lba_manager/btree/lba_btree_node_impl.cc +++ b/src/crimson/os/seastore/lba_manager/btree/lba_btree_node_impl.cc @@ -208,34 +208,38 @@ LBAInternalNode::find_hole_ret LBAInternalNode::find_hole( "LBAInternalNode::find_hole min={}, max={}, len={}, *this={}", min_addr, max_addr, len, *this); auto [begin, end] = bound(min_addr, max_addr); - return seastar::repeat_until_value( - [i=begin, e=end, c, min_addr, len, this]() mutable { - if (i == e) { - return seastar::make_ready_future>( - std::make_optional(L_ADDR_NULL)); - } - return get_lba_btree_extent(c, - this, - get_meta().depth - 1, - i->get_val(), - get_paddr()).safe_then( - [c, min_addr, len, i](auto extent) mutable { - auto lb = std::max(min_addr, i->get_key()); - auto ub = i->get_next_key_or_max(); - logger().debug("LBAInternalNode::find_hole extent {} lb {} ub {}", - *extent, lb, ub); - return extent->find_hole(c, lb, ub, len); - }).safe_then([&i](auto addr) mutable -> std::optional { - if (addr == L_ADDR_NULL) { - ++i; - return {}; - } else { - return addr; - } - }, - // TODO: GCC enters a dead loop if crimson::do_until() is used - // or erroratorized future is returned - crimson::ct_error::assert_all{ "fix me - APIv6" }); + return seastar::do_with( + begin, + L_ADDR_NULL, + [this, c, min_addr, len, end](auto &i, auto &ret) { + return crimson::do_until([=, &i, &ret]() -> find_hole_ertr::future { + if (i == end) { + return seastar::make_ready_future(true); + } + return get_lba_btree_extent( + c, + this, + get_meta().depth - 1, + i->get_val(), + get_paddr() + ).safe_then([=, &i](auto extent) mutable { + auto lb = std::max(min_addr, i->get_key()); + auto ub = i->get_next_key_or_max(); + logger().debug("LBAInternalNode::find_hole extent {} lb {} ub {}", + *extent, lb, ub); + return extent->find_hole(c, lb, ub, len); + }).safe_then([&i, &ret](auto addr) mutable { + if (addr == L_ADDR_NULL) { + ++i; + return false; + } else { + ret = addr; + return true; + } + }); + }).safe_then([&ret, ref=LBANodeRef(this)] { + return ret; + }); }); }