From c8007c2a8c1f128b99f5def60dc830b90c1692f6 Mon Sep 17 00:00:00 2001 From: Chanyoung Park Date: Sat, 23 Aug 2025 15:37:46 +0000 Subject: [PATCH] crimson/.../avlallocator: fix base_addr handling in find_block() Fixes: https://tracker.ceph.com/issues/72699 Signed-off-by: Chanyoung Park --- .../random_block_manager/avlallocator.cc | 2 +- .../crimson/seastore/test_extent_allocator.cc | 33 +++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/crimson/os/seastore/random_block_manager/avlallocator.cc b/src/crimson/os/seastore/random_block_manager/avlallocator.cc index c439424e4fa..fb4f5b7692f 100644 --- a/src/crimson/os/seastore/random_block_manager/avlallocator.cc +++ b/src/crimson/os/seastore/random_block_manager/avlallocator.cc @@ -84,7 +84,7 @@ rbm_abs_addr AvlAllocator::find_block(size_t size) return off; } } - return total_size; + return base_addr + total_size; } extent_len_t AvlAllocator::find_block( diff --git a/src/test/crimson/seastore/test_extent_allocator.cc b/src/test/crimson/seastore/test_extent_allocator.cc index ece78e5c1d6..979e3442f3b 100644 --- a/src/test/crimson/seastore/test_extent_allocator.cc +++ b/src/test/crimson/seastore/test_extent_allocator.cc @@ -46,9 +46,9 @@ struct allocator_test_t : } return seastar::now(); } - void init_alloc(uint64_t block_size, uint64_t total_size) { + void init_alloc(uint64_t block_size, uint64_t total_size, uint64_t base_addr = 0) { assert(allocator); - allocator->init(0, total_size, block_size); + allocator->init(base_addr, total_size, block_size); } void close() { assert(allocator); @@ -121,6 +121,35 @@ TEST_P(allocator_test_t, test_scattered_alloc) } } +TEST_P(allocator_test_t, test_base_addr) +{ + uint64_t block_size = 8192; + uint64_t capacity = 1024 * block_size; + + auto run_case = [&](uint64_t base_addr) { + init_alloc(block_size, capacity, base_addr); + + allocator->mark_extent_used(base_addr, block_size * 256); + allocator->mark_extent_used(base_addr + (block_size * 512), block_size * 256); + + auto result = allocate(block_size * 512); + ASSERT_EQ(false, result.has_value()); + + result = allocates(block_size * 512); + ASSERT_EQ(true, result.has_value()); + + free(base_addr, block_size * 512); + + result = allocate(block_size * 512); + ASSERT_EQ(true, result.has_value()); + + close(); + }; + + run_case(0 /* base_addr */); + run_case(capacity /* base_addr */); +} + TEST_P(allocator_test_t, test_random_alloc_verify) { uint64_t block_size = 4096; -- 2.39.5