From 2591668158b4779c12c1316d2ea255268c63cfad Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Fri, 7 Mar 2014 16:51:36 -0800 Subject: [PATCH] PGLog::proc_replica_log: select divergent log entries correctly Looking for an entry in olog which matches one of ours might add extra divergent entries. Instead, do what merge_log does and walk back through the auth log looking for an entry in olog. Fixes: 7657 Signed-off-by: Samuel Just --- src/osd/PGLog.cc | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/osd/PGLog.cc b/src/osd/PGLog.cc index a468dcb4470e3..ef826c1013c29 100644 --- a/src/osd/PGLog.cc +++ b/src/osd/PGLog.cc @@ -169,6 +169,22 @@ void PGLog::proc_replica_log( << " have " << i->second.have << dendl; } + list::const_iterator toiter = log.log.end(); + list::const_iterator fromiter = log.log.end(); + eversion_t lower_bound = log.tail; + while (1) { + if (fromiter == log.log.begin()) + break; + --fromiter; + if (fromiter->version <= olog.head) { + dout(20) << "merge_log cut point (usually last shared) is " + << *fromiter << dendl; + lower_bound = fromiter->version; + ++fromiter; + break; + } + } + list divergent; list::const_iterator pp = olog.log.end(); eversion_t lu(oinfo.last_update); @@ -183,16 +199,13 @@ void PGLog::proc_replica_log( // don't continue past the tail of our log. if (oe.version <= log.tail) { + lu = oe.version; ++pp; break; } - ceph::unordered_map::const_iterator i = - log.objects.find(oe.soid); - if (i != log.objects.end() && i->second->version == oe.version) { - dout(10) << " had " << oe << " new " << *(i->second) - << " : match, stopping" << dendl; - lu = pp->version; + if (oe.version <= lower_bound) { + lu = oe.version; ++pp; break; } -- 2.47.3