]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: fix assemble_backlog
authorSage Weil <sage@newdream.net>
Sun, 16 Oct 2011 23:07:12 +0000 (16:07 -0700)
committerSage Weil <sage@newdream.net>
Mon, 17 Oct 2011 03:37:31 +0000 (20:37 -0700)
This was written assuming that le->prior_version wouldn't be the version
that we have locally on disk.  Not always true!

If it is the same, then we can just keep the entry (and clear reqid).  If
it is different, keep the behavior we had (re-add, erase current).

FWIW the last time this was touched was 916b1998.

Signed-off-by: Sage Weil <sage@newdream.net>
src/osd/PG.cc

index ccc60f32ec57450396ee5645522f22310f0429ab..4766d61d78c9db4a803bcaffabf475e7e5bc227b 100644 (file)
@@ -790,14 +790,21 @@ void PG::assemble_backlog(map<eversion_t,Log::Entry>& omap)
       // 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
-       dout(15) << " skipping " << be << " (have " << *le << ")" << dendl;
-      } else {
-       be.version = le->prior_version;
-       be.reqid = osd_reqid_t();
-       dout(15) << "   adding prior_version " << be << " (have " << *le << ")" << dendl;
-       omap[be.version] = be;
-       // don't try to index: this is the prior_version backlog entry
+       dout(15) << " dropping " << be << " (have " << *le << ")" << dendl;
+       omap.erase(i++);
+       continue;
       }
+
+      be.reqid = osd_reqid_t();
+      if (be.version == le->prior_version) {
+       dout(15) << "   keeping prior_version " << be << " (have " << *le << ")" << dendl;
+       i++;
+       continue;
+      }
+
+      be.version = le->prior_version;
+      dout(15) << "   adding prior_version " << be << " (have " << *le << ")" << dendl;
+      omap[be.version] = be;
       omap.erase(i++);
     } else {
       i++;
@@ -813,6 +820,10 @@ void PG::assemble_backlog(map<eversion_t,Log::Entry>& omap)
     if (be.reqid != osd_reqid_t())   // don't index prior_version backlog entries
       log.index( *log.log.begin() );
   }
+
+  dout(25) << "result:\n";
+  log.print(*_dout);
+  *_dout << dendl;
 }