From b2194357d81e5f267f70e809ac131235a6cb6cfb Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 23 Jul 2010 12:57:52 -0700 Subject: [PATCH] osd: make assemble_backlog more tolerant of races The assemble_backlog is merging data generated while racing with online updates. It needs to tolerate races with things like delete. For example, - generate_backlog identifies object A - client deletes+logs A - assemble_backlog sees A deletion entry. We may want to merge the backlog entry in this case. --- src/osd/PG.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 16397ec5ce463..152b431691f06 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -615,6 +615,8 @@ void PG::assemble_backlog(map& omap) while (i != omap.end()) { Log::Entry& be = i->second; + dout(15) << " " << be << dendl; + /* * we can skip an object if * - is already in the log AND @@ -625,11 +627,9 @@ void PG::assemble_backlog(map& omap) if (log.objects.count(be.soid)) { Log::Entry *le = log.objects[be.soid]; - assert(!le->is_delete()); // if it's a deletion, we are corrupt.. - // note the prior version if (le->prior_version == eversion_t() || // either new object, or - le->prior_version >= log.tail) { // prior_version also already in log + le->prior_version >= log.tail) { // prior_version also already in log dout(15) << " skipping " << be << " (have " << *le << ")" << dendl; } else { be.version = le->prior_version; -- 2.39.5