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)
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));
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)));