]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/PGLog: preserve original_crt in merge_log() 27715/head
authorNeha Ojha <nojha@redhat.com>
Mon, 25 Mar 2019 21:48:04 +0000 (14:48 -0700)
committerPrashant D <pdhange@redhat.com>
Mon, 29 Apr 2019 07:02:12 +0000 (03:02 -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 439d0181b6b23e1087b84f21c82c16ae2951087a..dcad7506719feb0d6dd9c51f8380f11b7389ee1c 100644 (file)
@@ -432,6 +432,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) {
@@ -456,7 +461,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 dc282b183f2848ea2eabf9f728f3a6fb792dc052..c80011aa8f272cefe9aa37f6ba8238057649c8f3 100644 (file)
@@ -1008,6 +1008,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();