From 72cde5316612bb6a91ded5740524ca562bf95cf6 Mon Sep 17 00:00:00 2001 From: Alex Ainscow Date: Fri, 16 May 2025 14:52:22 +0100 Subject: [PATCH] osd: Do not complete log on non primary until missing recovered. Signed-off-by: Alex Ainscow (cherry picked from commit 7f134a32b38f16555984b06f87a8ce581b492cf9) --- src/osd/PGLog.h | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/osd/PGLog.h b/src/osd/PGLog.h index be7e97381f2..8978dedf7ae 100644 --- a/src/osd/PGLog.h +++ b/src/osd/PGLog.h @@ -940,8 +940,10 @@ public: missing.got(oid, v); info.stats.stats.sum.num_objects_missing = missing.num_missing(); + const bool missing_empty = missing.get_items().empty(); + // raise last_complete? - if (missing.get_items().empty()) { + if (missing_empty) { log.complete_to = log.log.end(); info.last_complete = info.last_update; } @@ -949,6 +951,16 @@ public: while (log.complete_to != log.log.end()) { if (oldest_need <= log.complete_to->version) break; + /* If optimizations are enabled, then this might be a partial log. In + * this case, it is possible to complete all objects before missing + * objects are all recovered (since we are recovering to a later + * version). Here we refuse to move last_complete beyond the last + * entry of the log until all missing have been recovered. + */ + if (!missing_empty && + !log.log.empty() && + log.complete_to->version == log.log.back().version) + break; if (info.last_complete < log.complete_to->version) info.last_complete = log.complete_to->version; ++log.complete_to; -- 2.39.5