]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: fix valgrind's "Invalid read" error in hybrid btree2 62540/head
authorIgor Fedotov <igor.fedotov@croit.io>
Thu, 11 Jul 2024 13:52:07 +0000 (16:52 +0300)
committerJoshua Baergen <jbaergen@digitalocean.com>
Thu, 27 Mar 2025 16:33:02 +0000 (10:33 -0600)
allocator.

Signed-off-by: Igor Fedotov <ifedotov@croit.io>
src/os/bluestore/Btree2Allocator.cc
src/os/bluestore/Btree2Allocator.h

index 9e421b6762eb05b137cb24912609ded0ab6f4aa4..db6350368657c94709decb1366a548ded40f8354 100644 (file)
@@ -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,
index 21787bb6e621a169faa47455edf18aa7a29a3503..38854f5e59a3d6ac41b1e9961bbe55d0b6058858 100644 (file)
@@ -140,6 +140,7 @@ private:
       uint64_t, // end
       std::less<uint64_t>,
       pool_allocator<std::pair<uint64_t, uint64_t>>>;
+  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);