From ac387844e12edc9a1f481bdd1ba307ac4dc60e82 Mon Sep 17 00:00:00 2001 From: Zengran Zhang Date: Mon, 12 Aug 2019 11:23:26 +0800 Subject: [PATCH] osd: merge replica log on primary need according to replica log's crt Fixes: https://tracker.ceph.com/issues/41194 Signed-off-by: Zengran Zhang --- src/osd/PGLog.cc | 13 +++++-------- src/osd/PGLog.h | 18 ++++-------------- src/test/osd/TestPGLog.cc | 2 -- 3 files changed, 9 insertions(+), 24 deletions(-) diff --git a/src/osd/PGLog.cc b/src/osd/PGLog.cc index 63f8924176e..0189390c1f5 100644 --- a/src/osd/PGLog.cc +++ b/src/osd/PGLog.cc @@ -269,11 +269,11 @@ void PGLog::proc_replica_log( limit : first_non_divergent->version; - // 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; + // we merge and adjust the replica's log, rollback the rollbackable divergent entry, + // remove the unrollbackable divergent entry and mark the according object as missing. + // the rollback boundary must choose crt of the olog which going to be merged. + // The replica log's(olog) crt will not be modified, so it could get passed + // to _merge_divergent_entries() directly. IndexedLog folog(olog); auto divergent = folog.rewind_from_head(lu); _merge_divergent_entries( @@ -281,7 +281,6 @@ void PGLog::proc_replica_log( divergent, oinfo, olog.get_can_rollback_to(), - original_crt, omissing, 0, this); @@ -345,7 +344,6 @@ void PGLog::rewind_divergent_log(eversion_t newhead, log, divergent, info, - log.get_can_rollback_to(), original_crt, missing, rollbacker, @@ -471,7 +469,6 @@ void PGLog::merge_log(pg_info_t &oinfo, pg_log_t &olog, pg_shard_t fromosd, log, divergent, info, - log.get_can_rollback_to(), original_crt, missing, rollbacker, diff --git a/src/osd/PGLog.h b/src/osd/PGLog.h index 81927870976..2710a279fce 100644 --- a/src/osd/PGLog.h +++ b/src/osd/PGLog.h @@ -898,8 +898,7 @@ protected: const hobject_t &hoid, ///< [in] object we are merging const mempool::osd_pglog::list &orig_entries, ///< [in] entries for hoid to merge const pg_info_t &info, ///< [in] info for merging entries - eversion_t olog_can_rollback_to, ///< [in] rollback boundary - eversion_t original_can_rollback_to, ///< [in] original rollback boundary + eversion_t olog_can_rollback_to, ///< [in] rollback boundary of input InedexedLog missing_type &missing, ///< [in,out] missing to adjust, use LogEntryHandler *rollbacker, ///< [in] optional rollbacker object const DoutPrefixProvider *dpp ///< [in] logging provider @@ -1063,17 +1062,11 @@ 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(); ++i) { - /// Use original_can_rollback_to instead of olog_can_rollback_to to check - // if we can rollback or not. This is to ensure that we don't try to rollback - // to an object that has been deleted and doesn't exist. - if (!i->can_rollback() || i->version <= original_can_rollback_to) { + if (!i->can_rollback() || i->version <= olog_can_rollback_to) { ldpp_dout(dpp, 10) << __func__ << ": hoid " << hoid << " cannot rollback " << *i << dendl; can_rollback = false; @@ -1086,7 +1079,7 @@ protected: for (list::const_reverse_iterator i = entries.rbegin(); i != entries.rend(); ++i) { - ceph_assert(i->can_rollback() && i->version > original_can_rollback_to); + ceph_assert(i->can_rollback() && i->version > olog_can_rollback_to); ldpp_dout(dpp, 10) << __func__ << ": hoid " << hoid << " rolling back " << *i << dendl; if (rollbacker) @@ -1122,8 +1115,7 @@ protected: const IndexedLog &log, ///< [in] log to merge against mempool::osd_pglog::list &entries, ///< [in] entries to merge const pg_info_t &oinfo, ///< [in] info for merging entries - eversion_t olog_can_rollback_to, ///< [in] rollback boundary - eversion_t original_can_rollback_to, ///< [in] original rollback boundary + eversion_t olog_can_rollback_to, ///< [in] rollback boundary of input IndexedLog missing_type &omissing, ///< [in,out] missing to adjust, use LogEntryHandler *rollbacker, ///< [in] optional rollbacker object const DoutPrefixProvider *dpp ///< [in] logging provider @@ -1139,7 +1131,6 @@ protected: i->second, oinfo, olog_can_rollback_to, - original_can_rollback_to, omissing, rollbacker, dpp); @@ -1163,7 +1154,6 @@ protected: entries, info, log.get_can_rollback_to(), - log.get_can_rollback_to(), missing, rollbacker, this); diff --git a/src/test/osd/TestPGLog.cc b/src/test/osd/TestPGLog.cc index 0336276df2f..684b0b21c23 100644 --- a/src/test/osd/TestPGLog.cc +++ b/src/test/osd/TestPGLog.cc @@ -2931,7 +2931,6 @@ TEST_F(PGLogTest, _merge_object_divergent_entries) { _merge_object_divergent_entries(log, hoid, orig_entries, oinfo, log.get_can_rollback_to(), - log.get_can_rollback_to(), missing, &rollbacker, this); // No core dump @@ -2958,7 +2957,6 @@ TEST_F(PGLogTest, _merge_object_divergent_entries) { _merge_object_divergent_entries(log, hoid, orig_entries, oinfo, log.get_can_rollback_to(), - log.get_can_rollback_to(), missing, &rollbacker, this); // No core dump