There were some bugs in attribute reads during recovery in optimised
EC where the attribute read failed. There were two scenarios:
1. It was not necessary to do any further reads to recover the data. This
can happen during recovery of many shards.
2. The re-read could be honoured from non-primary shards. There are
sometimes multiple copies of the shard whcih can be used, so a failed read
on one OSD can be replaced by a read from another.
Signed-off-by: Alex Ainscow <aainscow@uk.ibm.com>
(cherry picked from commit
417fb71c9b5628726d3217909ba1b6d3e7bf251a)
rop.to_read.at(oid).zeros_for_decode.populate_shard_id_set(have);
}
- int err = ec_impl->minimum_to_decode(want_to_read, have, dummy_minimum,
- nullptr);
+ int err = -EIO; // If attributes needed but not read.
+ if (!rop.to_read.at(oid).want_attrs || rop.complete.at(oid).attrs) {
+ err = ec_impl->minimum_to_decode(want_to_read, have, dummy_minimum,
+ nullptr);
+ }
+
if (err) {
dout(20) << __func__ << " minimum_to_decode failed" << dendl;
if (all_sub_reads_done) {
}
bool need_attr_request = want_attrs;
+ read_request.want_attrs = want_attrs;
// Rather than repeating whole read, we can remove everything we already have.
for (auto iter = read_request.shard_reads.begin();