From: Bill Scales Date: Fri, 8 Aug 2025 08:58:14 +0000 (+0100) Subject: osd: Optimized EC backfill interval has wrong versions X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=73a5468e0b0df9b50f656ebfc894f8f8a7170a31;p=ceph-ci.git osd: Optimized EC backfill interval has wrong versions Bug in the optimized EC code creating the backfill interval on the primary. It is creating a map with the object version for each backfilling shard. When there are multiple backfill targets the code was overwriting oi.version with the version for a shard that has had partial writes which can result in the object not being backfilled. Can manifest as a data integirty issue, scrub error or snapshot corruption. Signed-off-by: Bill Scales (cherry picked from commit acca514f9a3d0995b7329f4577f6881ba093a429) --- diff --git a/src/crimson/osd/recovery_backend.cc b/src/crimson/osd/recovery_backend.cc index 5c25409a80a..210ae06c1c0 100644 --- a/src/crimson/osd/recovery_backend.cc +++ b/src/crimson/osd/recovery_backend.cc @@ -268,8 +268,9 @@ RecoveryBackend::scan_for_backfill_primary( bool added_default = false; for (auto & shard: backfill_targets) { if (shard_versions.contains(shard.shard)) { - version = shard_versions.at(shard.shard); - version_map->emplace(object, std::make_pair(shard.shard, version)); + auto shard_version = shard_versions.at(shard.shard); + version_map->emplace(object, std::make_pair(shard.shard, + shard_version)); } else if (!added_default) { version_map->emplace(object, std::make_pair(shard_id_t::NO_SHARD, version)); diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index 13b800840fe..9ef012eb930 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -14489,9 +14489,9 @@ void PrimaryLogPG::scan_range_primary( bool added_default = false; for (auto & shard: backfill_targets) { if (shard_versions.contains(shard.shard)) { - version = shard_versions.at(shard.shard); + auto shard_version = shard_versions.at(shard.shard); bi->objects.insert(make_pair(*p, std::make_pair(shard.shard, - version))); + shard_version))); } else if (!added_default) { bi->objects.insert(make_pair(*p, std::make_pair(shard_id_t::NO_SHARD, version)));