From 7ab0588ad2853030bf0e716a5f887e0fe714b314 Mon Sep 17 00:00:00 2001 From: Alex Ainscow Date: Fri, 23 May 2025 09:59:31 +0100 Subject: [PATCH] osd: During recovery, pass "for_recovery" when attempting re-reads get_all_remaining_reads() is used for two purposes: 1. If a read unexpectedly fails, recover from other shards. 2. If a shard is missing, but is allowed to be missing (typically due to unequal shard sizes), we rely on this function to return no new reads, without an error. The test failure we saw case (2), but I think case (1) is important. Most of the time we probably would not notice, but if insufficient redundancy exists without the for_recovery being set, then this will result in recovery failing. Signed-off-by: Alex Ainscow --- src/osd/ECCommon.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/osd/ECCommon.cc b/src/osd/ECCommon.cc index da6e5b9e40897..22842479cdbbc 100644 --- a/src/osd/ECCommon.cc +++ b/src/osd/ECCommon.cc @@ -615,7 +615,7 @@ int ECCommon::ReadPipeline::send_all_remaining_reads( // reset the old shard reads, we are going to read them again. read_request.shard_reads.clear(); return get_remaining_shards(hoid, rop.complete.at(hoid), read_request, - rop.do_redundant_reads, want_attrs); + rop.for_recovery, want_attrs); } void ECCommon::ReadPipeline::kick_reads() { -- 2.39.5