]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/.../lba_btree_node_impl: fix find_hole
authorSamuel Just <sjust@redhat.com>
Fri, 21 Aug 2020 19:57:39 +0000 (12:57 -0700)
committerSamuel Just <sjust@redhat.com>
Wed, 23 Sep 2020 22:13:51 +0000 (15:13 -0700)
find_hole shouldn't check entries prior to min.

Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/lba_manager/btree/lba_btree_node_impl.cc

index b31dfcf762dc3816d99aeec1d0b219327b5ffc66..996cca9815b97491c0e249fead53d1e9a0f6d4dc 100644 (file)
@@ -145,9 +145,9 @@ LBAInternalNode::find_hole_ret LBAInternalNode::find_hole(
     bounds.first,
     bounds.second,
     L_ADDR_NULL,
-    [this, c, len](auto &i, auto &e, auto &ret) {
+    [=](auto &i, auto &e, auto &ret) {
       return crimson::do_until(
-       [this, c, &i, &e, &ret, len] {
+       [=, &i, &e, &ret] {
          if (i == e) {
            return find_hole_ertr::make_ready_future<std::optional<laddr_t>>(
              std::make_optional<laddr_t>(L_ADDR_NULL));
@@ -157,16 +157,18 @@ LBAInternalNode::find_hole_ret LBAInternalNode::find_hole(
            get_meta().depth - 1,
            i->get_val(),
            get_paddr()
-         ).safe_then([c, &i, len](auto extent) mutable {
+         ).safe_then([=, &i](auto extent) mutable {
+           auto lb = std::max(min, i->get_key());
+           auto ub = i->get_next_key_or_max();
            logger().debug(
              "LBAInternalNode::find_hole extent {} lb {} ub {}",
              *extent,
-             i->get_key(),
-             i->get_next_key_or_max());
+             lb,
+             ub);
            return extent->find_hole(
              c,
-             i->get_key(),
-             i->get_next_key_or_max(),
+             lb,
+             ub,
              len);
          }).safe_then([&i, &ret](auto addr) mutable {
            i++;
@@ -430,7 +432,8 @@ LBALeafNode::find_hole_ret LBALeafNode::find_hole(
   logger().debug(
     "LBALeafNode::find_hole min={} max={}, len={}, *this={}",
     min, max, len, *this);
-  for (auto i = begin(); i != end(); ++i) {
+  auto [liter, uiter] = bound(min, max);
+  for (auto i = liter; i != uiter; ++i) {
     auto ub = i->get_key();
     if (min + len <= ub) {
       return find_hole_ret(