]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/random_block_manager/avlallocator: avoid directly modifying avl_s... 69617/head
authorXuehan Xu <xuxuehan@qianxin.com>
Sun, 21 Jun 2026 11:59:46 +0000 (19:59 +0800)
committerXuehan Xu <xuxuehan@qianxin.com>
Wed, 24 Jun 2026 07:08:41 +0000 (15:08 +0800)
Fixes: https://tracker.ceph.com/issues/77549
Signed-off-by: Xuehan Xu <xuxuehan@qianxin.com>
src/crimson/os/seastore/random_block_manager/avlallocator.cc

index 3f8df06f9d68d6ebac3ddb6241188e6c862956a7..e23b2a76426002ca35ffc5bd5eb780a4e32161ab 100644 (file)
@@ -46,30 +46,32 @@ void AvlAllocator::_remove_from_tree(rbm_abs_addr start, rbm_abs_addr size)
   bool left_over = (rs->start != start);
   bool right_over = (rs->end != end);
 
+  auto range = extent_range_t{rs->start, rs->end};
   _extent_size_tree_rm(*rs);
+  auto insert_pos = extent_tree.erase_and_dispose(rs, dispose_rs{});
 
   if (left_over && right_over) {
-    auto old_right_end = rs->end;
-    auto insert_pos = rs;
-    ceph_assert(insert_pos != extent_tree.end());
-    ++insert_pos;
-    rs->end = start;
+    auto prange = new extent_range_t(range);
+    auto old_right_end = prange->end;
+    prange->end = start;
 
     auto r = new extent_range_t{end, old_right_end};
-    extent_tree.insert_before(insert_pos, *r);
-    extent_size_tree.insert(*r);
-    available_size += r->length();
-    _extent_size_tree_try_insert(*rs);
+    insert_pos = extent_tree.insert_before(insert_pos, *r);
+    extent_tree.insert_before(insert_pos, *prange);
+    _extent_size_tree_try_insert(*r);
+    _extent_size_tree_try_insert(*prange);
   } else if (left_over) {
+    auto prange = new extent_range_t(range);
     assert(is_aligned(start, block_size));
-    rs->end = start;
-    _extent_size_tree_try_insert(*rs);
+    prange->end = start;
+    extent_tree.insert_before(insert_pos, *prange);
+    _extent_size_tree_try_insert(*prange);
   } else if (right_over) {
+    auto prange = new extent_range_t(range);
     assert(is_aligned(end, block_size));
-    rs->start = end;
-    _extent_size_tree_try_insert(*rs);
-  } else {
-    extent_tree.erase_and_dispose(rs, dispose_rs{});
+    prange->start = end;
+    extent_tree.insert_before(insert_pos, *prange);
+    _extent_size_tree_try_insert(*prange);
   }
 }
 
@@ -135,24 +137,29 @@ void AvlAllocator::_add_to_tree(rbm_abs_addr start, rbm_abs_addr size)
   bool merge_after = (rs_after != extent_tree.end() && rs_after->start == end);
 
   if (merge_before && merge_after) {
+    auto range = new extent_range_t{rs_before->start, rs_after->end};
     _extent_size_tree_rm(*rs_before);
     _extent_size_tree_rm(*rs_after);
-    rs_after->start = rs_before->start;
-    extent_tree.erase_and_dispose(rs_before, dispose_rs{});
-    _extent_size_tree_try_insert(*rs_after);
+    rs_after = extent_tree.erase_and_dispose(rs_before, dispose_rs{});
+    auto insert_pos = extent_tree.erase_and_dispose(rs_after, dispose_rs{});
+    _extent_size_tree_try_insert(*range);
+    extent_tree.insert_before(insert_pos, *range);
   } else if (merge_before) {
+    auto range = new extent_range_t{rs_before->start, end};
     _extent_size_tree_rm(*rs_before);
-    rs_before->end = end;
-    _extent_size_tree_try_insert(*rs_before);
+    _extent_size_tree_try_insert(*range);
+    auto insert_pos = extent_tree.erase_and_dispose(rs_before, dispose_rs{});
+    extent_tree.insert_before(insert_pos, *range);
   } else if (merge_after) {
+    auto range = new extent_range_t{start, rs_after->end};
     _extent_size_tree_rm(*rs_after);
-    rs_after->start = start;
-    _extent_size_tree_try_insert(*rs_after);
+    _extent_size_tree_try_insert(*range);
+    auto insert_pos = extent_tree.erase_and_dispose(rs_after, dispose_rs{});
+    extent_tree.insert_before(insert_pos, *range);
   } else {
     auto r = new extent_range_t{start, end};
     extent_tree.insert(*r);
-    extent_size_tree.insert(*r);
-    available_size += r->length();
+    _extent_size_tree_try_insert(*r);
   }
 }