From: Alex Ainscow Date: Mon, 14 Jul 2025 15:40:22 +0000 (+0100) Subject: osd: Attribute re-reads in optimised EC X-Git-Tag: v20.1.1~18^2~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e38fe8ffef500b7b6a3a39ef266a3d98fce7337c;p=ceph.git osd: Attribute re-reads in optimised EC 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 (cherry picked from commit 417fb71c9b5628726d3217909ba1b6d3e7bf251a) --- diff --git a/src/osd/ECBackend.cc b/src/osd/ECBackend.cc index 356859ef9da5..514793ef063b 100644 --- a/src/osd/ECBackend.cc +++ b/src/osd/ECBackend.cc @@ -1319,8 +1319,12 @@ void ECBackend::handle_sub_read_reply( 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) { diff --git a/src/osd/ECCommon.cc b/src/osd/ECCommon.cc index 84707d83f573..abe3a2bf0b7a 100644 --- a/src/osd/ECCommon.cc +++ b/src/osd/ECCommon.cc @@ -346,6 +346,7 @@ int ECCommon::ReadPipeline::get_remaining_shards( } 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();