From 2a569d8680ff64287efea5d4b1790b396aae86cc Mon Sep 17 00:00:00 2001 From: Alex Ainscow Date: Thu, 1 May 2025 10:09:15 +0100 Subject: [PATCH] osd: Fix off-by-one error in shard_extent_map. Inserting the first parity buffer was causing the ro-range within the SEM to be incorrectly calculated. Simple fix and I have added some unit tests to defend this error in the future. Signed-off-by: Alex Ainscow --- src/osd/ECUtil.cc | 2 +- src/test/osd/TestECUtil.cc | 49 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/osd/ECUtil.cc b/src/osd/ECUtil.cc index 5c5d2828be546..e931e68d086d9 100644 --- a/src/osd/ECUtil.cc +++ b/src/osd/ECUtil.cc @@ -354,7 +354,7 @@ void shard_extent_map_t::insert_in_shard(shard_id_t shard, uint64_t off, extent_maps[shard].insert(off, bl.length(), bl); raw_shard_id_t raw_shard = sinfo->get_raw_shard(shard); - if (raw_shard > sinfo->get_k()) { + if (raw_shard >= sinfo->get_k()) { return; } diff --git a/src/test/osd/TestECUtil.cc b/src/test/osd/TestECUtil.cc index 71cf3bb614b9d..ccf93d312da5e 100644 --- a/src/test/osd/TestECUtil.cc +++ b/src/test/osd/TestECUtil.cc @@ -1031,4 +1031,53 @@ TEST(ECUtil, slice) auto slice_map = sem.slice_map(0, 65*1024); ASSERT_EQ(slice_map, sem); } +} + +TEST(ECUtil, insert_parity_buffer_into_sem) { + int k=2; + int m=2; + int chunk_size = 4096; + stripe_info_t sinfo(k, m, k*chunk_size); + + buffer::list bl1k; + buffer::list bl4k; + bl1k.append_zero(1024); + bl4k.append_zero(4096); + + { + shard_extent_map_t sem(&sinfo); + sem.insert_in_shard(shard_id_t(2), 0, bl1k); + ASSERT_EQ(-1, sem.ro_start); + ASSERT_EQ(-1, sem.ro_end); + } + + { + shard_extent_map_t sem(&sinfo); + sem.insert_in_shard(shard_id_t(0), 0, bl4k); + ASSERT_EQ(0, sem.ro_start); + ASSERT_EQ(4096, sem.ro_end); + sem.insert_in_shard(shard_id_t(2), 0, bl4k); + ASSERT_EQ(0, sem.ro_start); + ASSERT_EQ(4096, sem.ro_end); + } + + { + shard_extent_map_t sem(&sinfo); + sem.insert_in_shard(shard_id_t(1), 0, bl4k); + ASSERT_EQ(4096, sem.ro_start); + ASSERT_EQ(8192, sem.ro_end); + sem.insert_in_shard(shard_id_t(2), 0, bl4k); + ASSERT_EQ(4096, sem.ro_start); + ASSERT_EQ(8192, sem.ro_end); + } + + { + shard_extent_map_t sem(&sinfo); + sem.insert_in_shard(shard_id_t(1), 0, bl4k); + ASSERT_EQ(4096, sem.ro_start); + ASSERT_EQ(8192, sem.ro_end); + sem.insert_in_shard(shard_id_t(3), 0, bl4k); + ASSERT_EQ(4096, sem.ro_start); + ASSERT_EQ(8192, sem.ro_end); + } } \ No newline at end of file -- 2.39.5