]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
PG::merge_old_entry: handle clone prior_version case
authorSamuel Just <sam.just@inktank.com>
Fri, 22 Jun 2012 16:07:45 +0000 (09:07 -0700)
committerSamuel Just <sam.just@inktank.com>
Fri, 29 Jun 2012 18:08:40 +0000 (11:08 -0700)
A clone can have a prior_version after log_tail and still not have
a corresponding log entry since the prior_version would be the
head object.

Signed-off-by: Samuel Just <sam.just@inktank.com>
src/osd/PG.cc

index 0f83ee635cfb1faec14a59e7aca38cd972aee289..1843c8f3627df0c37667321bfdc46db8c9d62476 100644 (file)
@@ -331,6 +331,14 @@ bool PG::merge_old_entry(ObjectStore::Transaction& t, pg_log_entry_t& oe)
        missing.revise_need(ne.soid, ne.version);
       }
     }
+  } else if (oe.prior_version > info.log_tail) {
+    assert(oe.soid.snap != CEPH_NOSNAP);
+    dout(20) << "merge_old_entry  had " << oe
+            << ", clone with no non-divergent log entries, "
+            << "deleting" << dendl;
+    t.remove(coll, oe.soid);
+    if (missing.is_missing(oe.soid))
+      missing.rm(oe.soid, missing.missing[oe.soid].need);
   } else {
     if (!oe.is_delete()) {
       dout(20) << "merge_old_entry  had " << oe << " deleting" << dendl;
@@ -339,9 +347,12 @@ bool PG::merge_old_entry(ObjectStore::Transaction& t, pg_log_entry_t& oe)
     dout(20) << "merge_old_entry  had " << oe << " reverting to "
             << oe.prior_version << dendl;
     if (oe.prior_version > eversion_t()) {
+      /* If missing.missing[oe.soid].need is before info.log_tail
+       * then we filled it in on a previous call to merge_old_entry
+       * and this entry refers to a previous divergent entry.
+       */
       if (!missing.is_missing(oe.soid) ||
          missing.missing[oe.soid].need > info.log_tail) {
-       assert(oe.prior_version < info.log_tail);
        missing.revise_need(oe.soid, oe.prior_version);
       }
     } else if (missing.is_missing(oe.soid)) {