]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ReplicatedPG: Fix oi.size bug in _rollback_to
authorSamuel Just <samuelj@hq.newdream.net>
Wed, 12 Jan 2011 23:09:51 +0000 (15:09 -0800)
committerSamuel Just <samuelj@hq.newdream.net>
Wed, 12 Jan 2011 23:13:16 +0000 (15:13 -0800)
_rollback_to calls _delete_head before cloning the clone into place.
_delete_head sets the object info size to 0.  _rollback_to now resets
the size to match the rolled back object.  Previously, this bug
manifested as a failed assert in scrub when checking the object sizes.

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

index e99ed28160d2bffca793ca6255a44776e49a58f0..67161f90eeaadf0af72f19bdecbee9aeb41a2d5c 100644 (file)
@@ -1671,6 +1671,13 @@ void ReplicatedPG::_rollback_to(OpContext *ctx, ceph_osd_op& op)
       t.setattrs(coll_t(info.pgid), soid, attrs);
       ssc->snapset.head_exists = true;
 
+      // Adjust the cached objectcontext
+      ObjectContext *clone_context = get_object_context(rollback_to_sobject,
+                                                       oi.oloc,
+                                                       false);
+      assert(clone_context);
+      ctx->obs->oi.size = clone_context->obs.oi.size;
+
       map<snapid_t, interval_set<uint64_t> >::iterator iter =
        ssc->snapset.clone_overlap.lower_bound(snapid);
       interval_set<uint64_t> overlaps = iter->second;