Skip to content

Commit cf36ba9

Browse files
committed
os/bluestore: fix valgrind's "Invalid read" error in hybrid btree2
allocator. Signed-off-by: Igor Fedotov <[email protected]>
1 parent 0e3400d commit cf36ba9

File tree

2 files changed

+15
-15
lines changed

2 files changed

+15
-15
lines changed

src/os/bluestore/Btree2Allocator.cc

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -298,21 +298,17 @@ void Btree2Allocator::_try_remove_from_tree(uint64_t start, uint64_t size,
298298
return;
299299
}
300300
do {
301-
auto next_p = rt_p;
302-
++next_p;
303-
304301
if (start < rt_p->first) {
305302
cb(start, rt_p->first - start, false);
306303
start = rt_p->first;
307304
}
308305
auto range_end = std::min(rt_p->second, end);
309306

310-
_remove_from_tree(rt_p, start, range_end);
307+
rt_p = _remove_from_tree(rt_p, start, range_end);
311308

312309
cb(start, range_end - start, true);
313310
start = range_end;
314311

315-
rt_p = next_p;
316312
} while (rt_p != range_tree.end() && rt_p->first < end && start < end);
317313
if (start < end) {
318314
cb(start, end - start, false);
@@ -461,8 +457,9 @@ void Btree2Allocator::_remove_from_tree(uint64_t start, uint64_t size)
461457
_remove_from_tree(rt_p, start, end);
462458
}
463459

464-
void Btree2Allocator::_remove_from_tree(
465-
Btree2Allocator::range_tree_t::iterator rt_p,
460+
Btree2Allocator::range_tree_iterator
461+
Btree2Allocator::_remove_from_tree(
462+
Btree2Allocator::range_tree_iterator rt_p,
466463
uint64_t start,
467464
uint64_t end)
468465
{
@@ -472,13 +469,14 @@ void Btree2Allocator::_remove_from_tree(
472469
auto rs_p = rs_tree->find(rs);
473470
ceph_assert(rs_p != rs_tree->end());
474471

475-
_remove_from_tree(rs_tree, rs_p, rt_p, start, end);
472+
return _remove_from_tree(rs_tree, rs_p, rt_p, start, end);
476473
}
477474

478-
void Btree2Allocator::_remove_from_tree(
475+
Btree2Allocator::range_tree_iterator
476+
Btree2Allocator::_remove_from_tree(
479477
Btree2Allocator::range_size_tree_t* rs_tree,
480478
Btree2Allocator::range_size_tree_t::iterator rs_p,
481-
Btree2Allocator::range_tree_t::iterator rt_p,
479+
Btree2Allocator::range_tree_iterator rt_p,
482480
uint64_t start,
483481
uint64_t end)
484482
{
@@ -505,6 +503,7 @@ void Btree2Allocator::_remove_from_tree(
505503
rs.start = end;
506504
__try_insert_range(rs, &rt_p);
507505
}
506+
return rt_p;
508507
}
509508

510509
void Btree2Allocator::_try_insert_range(const range_seg_t& rs)
@@ -519,7 +518,7 @@ void Btree2Allocator::_try_insert_range(const range_seg_t& rs)
519518

520519
bool Btree2Allocator::__try_insert_range(
521520
const Btree2Allocator::range_seg_t& rs,
522-
Btree2Allocator::range_tree_t::iterator* rt_p_insert)
521+
Btree2Allocator::range_tree_iterator* rt_p_insert)
523522
{
524523
ceph_assert(rs.end > rs.start);
525524
// Check if amount of range_seg_t entries isn't above the threshold,

src/os/bluestore/Btree2Allocator.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ class Btree2Allocator : public Allocator {
140140
uint64_t, // end
141141
std::less<uint64_t>,
142142
pool_allocator<std::pair<uint64_t, uint64_t>>>;
143+
using range_tree_iterator = range_tree_t::iterator;
143144
range_tree_t range_tree; ///< main range tree
144145

145146
//
@@ -287,16 +288,16 @@ class Btree2Allocator : public Allocator {
287288
range_size_tree_t* tree, uint64_t size);
288289

289290
inline void _remove_from_tree(uint64_t start, uint64_t size);
290-
inline void _remove_from_tree(range_tree_t::iterator rt_p,
291+
inline range_tree_iterator _remove_from_tree(range_tree_iterator rt_p,
291292
uint64_t start, uint64_t end);
292-
inline void _remove_from_tree(range_size_tree_t* rs_tree,
293+
inline range_tree_iterator _remove_from_tree(range_size_tree_t* rs_tree,
293294
range_size_tree_t::iterator rs,
294-
range_tree_t::iterator rt_p,
295+
range_tree_iterator rt_p,
295296
uint64_t start, uint64_t end);
296297

297298
inline void _try_insert_range(const range_seg_t& rs);
298299
inline bool __try_insert_range(const range_seg_t& rs,
299-
range_tree_t::iterator* insert_pos);
300+
range_tree_iterator* insert_pos);
300301

301302
inline void _range_size_tree_add(const range_seg_t& r);
302303
inline void _range_size_tree_rm(const range_seg_t& rs);

0 commit comments

Comments
 (0)