]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ReplicatedPG: clone_overlap should contain one entry per clone
authorSamuel Just <samuelj@hq.newdream.net>
Thu, 6 Jan 2011 23:48:13 +0000 (15:48 -0800)
committerSamuel Just <samuelj@hq.newdream.net>
Thu, 6 Jan 2011 23:59:15 +0000 (15:59 -0800)
Previously, writefull and _delete_head would remove the last
entry from snapset.clone_overlap.  Now, the last entry becomes
an empty interval_set.  clone_overlap should contain one entry
per clone.

The missing entries previously caused a bug in _rollback_to where
iter would be clone_overlap.end().

Signed-off-by: Samuel Just <samuelj@hq.newdream.net>
src/osd/ReplicatedPG.cc

index fc5180c235087dfa589eb6b48b8e0db4f80c7cd5..ecf1677ba204c88ebad57817b7a35abb66be0b6b 100644 (file)
@@ -1161,7 +1161,11 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops,
        t.write(coll_t(info.pgid), soid, op.extent.offset, op.extent.length, nbl);
        if (ssc->snapset.clones.size()) {
          snapid_t newest = *ssc->snapset.clones.rbegin();
+
+         // Replace clone_overlap[newest] with an empty interval set since there
+         // should no longer be any overlap
          ssc->snapset.clone_overlap.erase(newest);
+         ssc->snapset.clone_overlap[newest];
          oi.size = 0;
        }
        if (op.extent.length != oi.size) {
@@ -1587,7 +1591,11 @@ inline void ReplicatedPG::_delete_head(OpContext *ctx)
   if (ssc->snapset.clones.size()) {
     snapid_t newest = *ssc->snapset.clones.rbegin();
     add_interval_usage(ssc->snapset.clone_overlap[newest], info.stats);
+
+    // Replace clone_overlap[newest] with an empty interval set since there
+    // should no longer be any overlap
     ssc->snapset.clone_overlap.erase(newest);  // ok, redundant.
+    ssc->snapset.clone_overlap[newest];
   }
   if (ctx->obs->exists) {
     info.stats.num_objects--;
@@ -1657,6 +1665,7 @@ void ReplicatedPG::_rollback_to(OpContext *ctx, ceph_osd_op& op)
       map<snapid_t, interval_set<uint64_t> >::iterator iter =
        ssc->snapset.clone_overlap.lower_bound(snapid);
       interval_set<uint64_t> overlaps = iter->second;
+      assert(iter != ssc->snapset.clone_overlap.end());
       for ( ;
            iter != ssc->snapset.clone_overlap.end();
            ++iter)
@@ -1745,6 +1754,10 @@ void ReplicatedPG::make_writeable(OpContext *ctx)
     info.stats.num_object_clones++;
     ssc->snapset.clones.push_back(coid.snap);
     ssc->snapset.clone_size[coid.snap] = ctx->obs->oi.size;
+
+    // clone_overlap should contain an entry for each clone 
+    // (an empty interval_set if there is no overlap)
+    ssc->snapset.clone_overlap[coid.snap];
     if (ctx->obs->oi.size)
       ssc->snapset.clone_overlap[coid.snap].insert(0, ctx->obs->oi.size);