From bf0e7afecbab833e015710daaef5e4e7343bfe74 Mon Sep 17 00:00:00 2001 From: Xuehan Xu Date: Sun, 21 Jun 2026 19:59:46 +0800 Subject: [PATCH] crimson/os/seastore/random_block_manager/avlallocator: avoid directly modifying avl_set elements Fixes: https://tracker.ceph.com/issues/77549 Signed-off-by: Xuehan Xu --- .../random_block_manager/avlallocator.cc | 55 +++++++++++-------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/src/crimson/os/seastore/random_block_manager/avlallocator.cc b/src/crimson/os/seastore/random_block_manager/avlallocator.cc index 3f8df06f9d6..e23b2a76426 100644 --- a/src/crimson/os/seastore/random_block_manager/avlallocator.cc +++ b/src/crimson/os/seastore/random_block_manager/avlallocator.cc @@ -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); } } -- 2.47.3