]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: make assemble_backlog more tolerant of races
authorSage Weil <sage@newdream.net>
Fri, 23 Jul 2010 19:57:52 +0000 (12:57 -0700)
committerSage Weil <sage@newdream.net>
Fri, 23 Jul 2010 22:52:35 +0000 (15:52 -0700)
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

index 16397ec5ce463c24d26ba2dfa3f3f31ac03bc3c1..152b431691f0690620238d5bbc14aaa0c0002db6 100644 (file)
@@ -615,6 +615,8 @@ void PG::assemble_backlog(map<eversion_t,Log::Entry>& 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<eversion_t,Log::Entry>& 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;