]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: Fix shard ordering bug
authorAlex Ainscow <aainscow@uk.ibm.com>
Thu, 24 Apr 2025 14:14:08 +0000 (15:14 +0100)
committerAlex Ainscow <aainscow@uk.ibm.com>
Tue, 1 Jul 2025 12:03:29 +0000 (13:03 +0100)
Signed-off-by: Alex Ainscow <aainscow@uk.ibm.com>
src/osd/ECTransaction.cc

index 1fbaaf31078bb50e563fbaff809224b799560db8..c094738307e530e32deee8c47c2a6316f5d329b3 100644 (file)
@@ -529,11 +529,14 @@ ECTransaction::Generate::Generate(PGTransaction &t,
   overlay_writes();
   appends_and_clone_ranges();
 
-  /* The write plan is permitted to drop parity shards when the shard is
-   * missing. However, written_shards must contain all parity shards.
-   * Note that the write plan will *not* drop data shards.
-   */
-  shards_written(sinfo.get_parity_shards());
+  // On a size change, we want to update OI on all shards
+  if (plan.orig_size != plan.projected_size) {
+    all_shards_written();
+  } else {
+    // All priumary shards must always be written, regardless of the write plan.
+    shards_written(sinfo.get_parity_shards());
+    shard_written(shard_id_t(0));
+  }
 
   if (!to_write.empty()) {
     encode_and_write();
@@ -550,6 +553,8 @@ ECTransaction::Generate::Generate(PGTransaction &t,
     entry->mod_desc.append(ECUtil::align_page_next(plan.orig_size));
   }
 
+  written_and_present_shards();
+
   if (!op.attr_updates.empty()) {
     attr_updates();
   }
@@ -561,8 +566,6 @@ ECTransaction::Generate::Generate(PGTransaction &t,
   if (!op.is_delete()) {
     handle_deletes();
   }
-
-  written_and_present_shards();
 }
 
 void ECTransaction::Generate::truncate() {
@@ -873,7 +876,6 @@ void ECTransaction::Generate::attr_updates() {
       ceph_assert(!entry);
     }
   }
-  all_shards_written();
   for (auto &&[shard, t]: transactions) {
     if (!sinfo.is_nonprimary_shard(shard)) {
       // Primary shard - Update all attributes