]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: reset complete_to when trimming the log past it
authorNeha Ojha <nojha@redhat.com>
Tue, 17 Jul 2018 01:01:26 +0000 (18:01 -0700)
committerNeha Ojha <nojha@redhat.com>
Tue, 17 Jul 2018 01:01:26 +0000 (18:01 -0700)
Signed-off-by: Neha Ojha <nojha@redhat.com>
src/osd/PGLog.cc
src/osd/PrimaryLogPG.cc

index 7bad3503ce8f6c6c0d1a7522d3abbb3b4deec93f..9a5fba5bd59787a19bed0bfb8ec41f6587934c68 100644 (file)
@@ -59,6 +59,7 @@ void PGLog::IndexedLog::trim(
   }
 
   assert(s <= can_rollback_to);
+  generic_dout(0) << " complete_to " << complete_to->version << dendl;
 
   auto earliest_dup_version =
     log.rbegin()->version.version < cct->_conf->osd_pg_log_dups_tracked
@@ -92,6 +93,10 @@ void PGLog::IndexedLog::trim(
       }
     }
 
+    bool reset_complete_to = false;
+    // we are trimming past complete_to, so reset complete_to
+    if (e.version >= complete_to->version)
+      reset_complete_to = true;
     if (rollback_info_trimmed_to_riter == log.rend() ||
        e.version == rollback_info_trimmed_to_riter->version) {
       log.pop_front();
@@ -99,6 +104,13 @@ void PGLog::IndexedLog::trim(
     } else {
       log.pop_front();
     }
+
+    // reset complete_to to the beginning of the log
+    if (reset_complete_to) {
+      generic_dout(0) << " moving complete_to " << " to "
+                      << log.begin()->version << dendl;
+      complete_to = log.begin();
+    }
   }
 
   while (!dups.empty()) {
@@ -177,6 +189,7 @@ void PGLog::trim(
     dout(10) << "trim " << log << " to " << trim_to << dendl;
     log.trim(cct, trim_to, &trimmed, &trimmed_dups, &write_from_dups);
     info.log_tail = log.tail;
+    dout(10) << " after trim complete_to " << log.complete_to->version << dendl;
   }
 }
 
index 47e4a72a30ffc26c248b390890becba589d20805..15cc5b86934b59df678ee2a04222b9ea76a073b8 100644 (file)
@@ -11488,6 +11488,8 @@ void PrimaryLogPG::_applied_recovered_object_replica()
 void PrimaryLogPG::recover_got(hobject_t oid, eversion_t v)
 {
   dout(10) << "got missing " << oid << " v " << v << dendl;
+  dout(10) << __func__ << " complete_to "
+           << pg_log.get_log().complete_to->version << dendl;
   pg_log.recover_got(oid, v, info);
   if (pg_log.get_log().complete_to != pg_log.get_log().log.end()) {
     dout(10) << "last_complete now " << info.last_complete