]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: Fix off-by-one error in shard_extent_map.
authorAlex Ainscow <aainscow@uk.ibm.com>
Thu, 1 May 2025 09:09:15 +0000 (10:09 +0100)
committerAlex Ainscow <aainscow@uk.ibm.com>
Tue, 1 Jul 2025 12:03:30 +0000 (13:03 +0100)
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 <aainscow@uk.ibm.com>
src/osd/ECUtil.cc
src/test/osd/TestECUtil.cc

index 5c5d2828be5462bb467d4f1bee9a7d9e14ce5fa8..e931e68d086d990f5e61fa62424e289ccf5c6420 100644 (file)
@@ -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;
   }
 
index 71cf3bb614b9d866e7b4e0f88dd90d894c6fda07..ccf93d312da5e8baa967b9541d16b21d1cce721f 100644 (file)
@@ -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