]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/PGLog: preserve original_crt in merge_log() 27629/head
authorNeha Ojha <nojha@redhat.com>
Mon, 25 Mar 2019 21:48:04 +0000 (14:48 -0700)
committerPrashant D <pdhange@redhat.com>
Wed, 17 Apr 2019 00:01:15 +0000 (20:01 -0400)
Fixes: https://tracker.ceph.com/issues/21174
Signed-off-by: Neha Ojha <nojha@redhat.com>
(cherry picked from commit 47215a5c0e1544c9080fda1eee8f04c9890eea42)

src/osd/PGLog.cc
src/osd/PGLog.h

index c3664196be8a1ad479950743f55e382fc2277695..0108acca43c8dc024f11d673f192905d58a95813 100644 (file)
@@ -430,6 +430,11 @@ void PGLog::merge_log(pg_info_t &oinfo, pg_log_t &olog, pg_shard_t fromosd,
             << lower_bound << dendl;
     mark_dirty_from(lower_bound);
 
+    // We need to preserve the original crt before it gets updated in rewind_from_head().
+    // Later, in merge_object_divergent_entries(), we use it to check whether we can rollback
+    // a divergent entry or not.
+    eversion_t original_crt = log.get_can_rollback_to();
+    dout(20) << __func__ << " original_crt = " << original_crt << dendl;
     auto divergent = log.rewind_from_head(lower_bound);
     // move aside divergent items
     for (auto &&oe: divergent) {
@@ -454,7 +459,7 @@ void PGLog::merge_log(pg_info_t &oinfo, pg_log_t &olog, pg_shard_t fromosd,
       divergent,
       info,
       log.get_can_rollback_to(),
-      log.get_can_rollback_to(),
+      original_crt,
       missing,
       rollbacker,
       this);
index d3200746096279b293f9c9b3fec921d7b68e72c1..e0d05d06b0cc20fa8059042207c3040687f705dd 100644 (file)
@@ -1007,6 +1007,9 @@ protected:
     ldpp_dout(dpp, 10) << __func__ << ": hoid " << hoid
                        << " olog_can_rollback_to: "
                        << olog_can_rollback_to << dendl;
+    ldpp_dout(dpp, 10) << __func__ << ": hoid " << hoid
+                       << " original_crt: "
+                       << original_can_rollback_to << dendl;
     /// Distinguish between 4) and 5)
     for (list<pg_log_entry_t>::const_reverse_iterator i = entries.rbegin();
         i != entries.rend();