From 715a0810e303dc165a1dba8edfdf572f5153faba Mon Sep 17 00:00:00 2001 From: Igor Fedotov Date: Thu, 11 Jul 2024 16:52:07 +0300 Subject: [PATCH] os/bluestore: fix valgrind's "Invalid read" error in hybrid btree2 allocator. Signed-off-by: Igor Fedotov --- src/os/bluestore/Btree2Allocator.cc | 21 ++++++++++----------- src/os/bluestore/Btree2Allocator.h | 9 +++++---- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/os/bluestore/Btree2Allocator.cc b/src/os/bluestore/Btree2Allocator.cc index 9e421b6762eb0..db6350368657c 100644 --- a/src/os/bluestore/Btree2Allocator.cc +++ b/src/os/bluestore/Btree2Allocator.cc @@ -298,21 +298,17 @@ void Btree2Allocator::_try_remove_from_tree(uint64_t start, uint64_t size, return; } do { - auto next_p = rt_p; - ++next_p; - if (start < rt_p->first) { cb(start, rt_p->first - start, false); start = rt_p->first; } auto range_end = std::min(rt_p->second, end); - _remove_from_tree(rt_p, start, range_end); + rt_p = _remove_from_tree(rt_p, start, range_end); cb(start, range_end - start, true); start = range_end; - rt_p = next_p; } while (rt_p != range_tree.end() && rt_p->first < end && start < end); if (start < end) { cb(start, end - start, false); @@ -461,8 +457,9 @@ void Btree2Allocator::_remove_from_tree(uint64_t start, uint64_t size) _remove_from_tree(rt_p, start, end); } -void Btree2Allocator::_remove_from_tree( - Btree2Allocator::range_tree_t::iterator rt_p, +Btree2Allocator::range_tree_iterator +Btree2Allocator::_remove_from_tree( + Btree2Allocator::range_tree_iterator rt_p, uint64_t start, uint64_t end) { @@ -472,13 +469,14 @@ void Btree2Allocator::_remove_from_tree( auto rs_p = rs_tree->find(rs); ceph_assert(rs_p != rs_tree->end()); - _remove_from_tree(rs_tree, rs_p, rt_p, start, end); + return _remove_from_tree(rs_tree, rs_p, rt_p, start, end); } -void Btree2Allocator::_remove_from_tree( +Btree2Allocator::range_tree_iterator +Btree2Allocator::_remove_from_tree( Btree2Allocator::range_size_tree_t* rs_tree, Btree2Allocator::range_size_tree_t::iterator rs_p, - Btree2Allocator::range_tree_t::iterator rt_p, + Btree2Allocator::range_tree_iterator rt_p, uint64_t start, uint64_t end) { @@ -505,6 +503,7 @@ void Btree2Allocator::_remove_from_tree( rs.start = end; __try_insert_range(rs, &rt_p); } + return rt_p; } void Btree2Allocator::_try_insert_range(const range_seg_t& rs) @@ -519,7 +518,7 @@ void Btree2Allocator::_try_insert_range(const range_seg_t& rs) bool Btree2Allocator::__try_insert_range( const Btree2Allocator::range_seg_t& rs, - Btree2Allocator::range_tree_t::iterator* rt_p_insert) + Btree2Allocator::range_tree_iterator* rt_p_insert) { ceph_assert(rs.end > rs.start); // Check if amount of range_seg_t entries isn't above the threshold, diff --git a/src/os/bluestore/Btree2Allocator.h b/src/os/bluestore/Btree2Allocator.h index 21787bb6e621a..38854f5e59a3d 100644 --- a/src/os/bluestore/Btree2Allocator.h +++ b/src/os/bluestore/Btree2Allocator.h @@ -140,6 +140,7 @@ private: uint64_t, // end std::less, pool_allocator>>; + using range_tree_iterator = range_tree_t::iterator; range_tree_t range_tree; ///< main range tree // @@ -287,16 +288,16 @@ private: range_size_tree_t* tree, uint64_t size); inline void _remove_from_tree(uint64_t start, uint64_t size); - inline void _remove_from_tree(range_tree_t::iterator rt_p, + inline range_tree_iterator _remove_from_tree(range_tree_iterator rt_p, uint64_t start, uint64_t end); - inline void _remove_from_tree(range_size_tree_t* rs_tree, + inline range_tree_iterator _remove_from_tree(range_size_tree_t* rs_tree, range_size_tree_t::iterator rs, - range_tree_t::iterator rt_p, + range_tree_iterator rt_p, uint64_t start, uint64_t end); inline void _try_insert_range(const range_seg_t& rs); inline bool __try_insert_range(const range_seg_t& rs, - range_tree_t::iterator* insert_pos); + range_tree_iterator* insert_pos); inline void _range_size_tree_add(const range_seg_t& r); inline void _range_size_tree_rm(const range_seg_t& rs); -- 2.39.5