]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
osd: Do not complete log on non primary until missing recovered.
authorAlex Ainscow <aainscow@uk.ibm.com>
Fri, 16 May 2025 13:52:22 +0000 (14:52 +0100)
committerLaura Flores <lflores@ibm.com>
Wed, 9 Jul 2025 15:47:24 +0000 (15:47 +0000)
Signed-off-by: Alex Ainscow <aainscow@uk.ibm.com>
(cherry picked from commit 7f134a32b38f16555984b06f87a8ce581b492cf9)

src/osd/PGLog.h

index be7e97381f2d19893361017877a58f129f19629a..8978dedf7aee72f5de29c694c99e8f96c769ace1 100644 (file)
@@ -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;