Merge pull request #70151 from sunyuechi/fix-ec-slice-map-offset

osd/ECUtil: fix offset accumulation in slice_map

Reviewed-by: Kefu Chai <k.chai@proxmox.com>
Reviewed-by: Alex Ainscow <aainscow@uk.ibm.com>
This commit is contained in:
Radoslaw Zarzynski 2026-07-27 10:19:58 +02:00 committed by GitHub
commit c2709f56c0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 38 additions and 23 deletions

View File

@ -810,14 +810,15 @@ shard_extent_map_t shard_extent_map_t::slice_map(
extent_map iemap = emap.intersect(offset, length);
if (!iemap.empty()) {
raw_shard_id_t raw_shard = sinfo->get_raw_shard(shard);
slice.start_offset = min(slice.start_offset, iemap.get_start_off());
slice.end_offset = max(slice.start_offset, iemap.get_end_off());
slice.ro_start = min(slice.start_offset,
calc_ro_offset(sinfo->get_raw_shard(shard),
iemap.get_start_off()));
slice.ro_end = min(slice.ro_end,
calc_ro_end(sinfo->get_raw_shard(shard),
iemap.get_end_off()));
slice.end_offset = max(slice.end_offset, iemap.get_end_off());
if (raw_shard < sinfo->get_k()) {
slice.ro_start = min(slice.ro_start,
calc_ro_offset(raw_shard, iemap.get_start_off()));
slice.ro_end = max(slice.ro_end,
calc_ro_end(raw_shard, iemap.get_end_off()));
}
slice.extent_maps.emplace(shard, iemap);
}
}

View File

@ -24,6 +24,17 @@
using namespace std;
using namespace ECUtil;
namespace {
void verify_offset_cache(const shard_extent_map_t& sem)
{
shard_extent_map_t cached = sem;
cached.compute_ro_range();
ASSERT_EQ(cached, sem);
}
} // anonymous namespace
TEST(ECUtil, stripe_info_t)
{
const uint64_t swidth = 4096;
@ -1051,28 +1062,31 @@ TEST(ECUtil, slice)
{
auto slice_map = sem.slice_map(512, 1024);
ASSERT_EQ(4, slice_map.get_extent_maps().size());
ASSERT_EQ(512, slice_map.get_start_offset());
ASSERT_EQ(512+1024, slice_map.get_end_offset());
verify_offset_cache(slice_map);
}
for (int i=1; i<5; i++) {
ASSERT_EQ(512, slice_map.get_extent_map(shard_id_t(i)).get_start_off());
ASSERT_EQ(512+1024, slice_map.get_extent_map(shard_id_t(i)).get_end_off());
}
{
shard_extent_map_t single(&sinfo);
single.insert_in_shard(shard_id_t(1), 512, bl1k);
auto slice_map = single.slice_map(512, 1024);
ASSERT_EQ(1, slice_map.get_extent_maps().size());
verify_offset_cache(slice_map);
}
{
shard_extent_map_t single(&sinfo);
single.insert_in_shard(shard_id_t(1), 512, bl1k);
auto slice_map = single.slice_map(0, 4096);
ASSERT_EQ(1, slice_map.get_extent_maps().size());
verify_offset_cache(slice_map);
}
{
auto slice_map = sem.slice_map(0, 4096);
ASSERT_EQ(4, slice_map.get_extent_maps().size());
ASSERT_EQ(5, slice_map.get_start_offset());
ASSERT_EQ(4096, slice_map.get_end_offset());
ASSERT_EQ(512, slice_map.get_extent_map(shard_id_t(1)).get_start_off());
ASSERT_EQ(512 + 1024, slice_map.get_extent_map(shard_id_t(1)).get_end_off());
ASSERT_EQ(5, slice_map.get_extent_map(shard_id_t(2)).get_start_off());
ASSERT_EQ(4096, slice_map.get_extent_map(shard_id_t(2)).get_end_off());
ASSERT_EQ(256, slice_map.get_extent_map(shard_id_t(3)).get_start_off());
ASSERT_EQ(4096, slice_map.get_extent_map(shard_id_t(3)).get_end_off());
ASSERT_EQ(5, slice_map.get_extent_map(shard_id_t(4)).get_start_off());
ASSERT_EQ(4096, slice_map.get_extent_map(shard_id_t(4)).get_end_off());
verify_offset_cache(slice_map);
}
{