]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
osd: Optimized EC backfill interval has wrong versions
authorBill Scales <bill_scales@uk.ibm.com>
Fri, 8 Aug 2025 08:58:14 +0000 (09:58 +0100)
committerAlex Ainscow <aainscow@uk.ibm.com>
Wed, 17 Sep 2025 08:43:26 +0000 (09:43 +0100)
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 <bill_scales@uk.ibm.com>
(cherry picked from commit acca514f9a3d0995b7329f4577f6881ba093a429)

src/crimson/osd/recovery_backend.cc
src/osd/PrimaryLogPG.cc

index 5c25409a80a4cc42027cdff2b7939765f4484ea5..210ae06c1c0807a791898761ab0bf0fd95e841db 100644 (file)
@@ -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));
index 13b800840fe3d8e1c66b9a2fad101bc91536c47d..9ef012eb930ddcf5c72b3e1a1561aa25ebdfc3b8 100644 (file)
@@ -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)));