From 47215a5c0e1544c9080fda1eee8f04c9890eea42 Mon Sep 17 00:00:00 2001 From: Neha Ojha Date: Mon, 25 Mar 2019 14:48:04 -0700 Subject: [PATCH] osd/PGLog: preserve original_crt in merge_log() Fixes: https://tracker.ceph.com/issues/21174 Signed-off-by: Neha Ojha --- src/osd/PGLog.cc | 7 ++++++- src/osd/PGLog.h | 3 +++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/osd/PGLog.cc b/src/osd/PGLog.cc index 295019dc556..bd9cbc1b71b 100644 --- a/src/osd/PGLog.cc +++ b/src/osd/PGLog.cc @@ -444,6 +444,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) { @@ -468,7 +473,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); diff --git a/src/osd/PGLog.h b/src/osd/PGLog.h index 862ca5f4139..6b492785e9e 100644 --- a/src/osd/PGLog.h +++ b/src/osd/PGLog.h @@ -1031,6 +1031,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::const_reverse_iterator i = entries.rbegin(); i != entries.rend(); -- 2.39.5