From: Alex Ainscow Date: Thu, 1 May 2025 09:09:15 +0000 (+0100) Subject: osd: Fix off-by-one error in shard_extent_map. X-Git-Tag: v20.1.0~68^2~8 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=90627f4ec002536c29b6551a07186df83689da1e;p=ceph.git 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 (cherry picked from commit 2a569d8680ff64287efea5d4b1790b396aae86cc) --- diff --git a/src/osd/ECUtil.cc b/src/osd/ECUtil.cc index 5c5d2828be54..e931e68d086d 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 71cf3bb614b9..ccf93d312da5 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