]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ReplicatedPG: fix error in snap_trimmer
authorSamuel Just <samuel.just@dreamhost.com>
Thu, 7 Apr 2011 21:38:48 +0000 (14:38 -0700)
committerSamuel Just <samuel.just@dreamhost.com>
Thu, 7 Apr 2011 23:07:30 +0000 (16:07 -0700)
newsnaps continued to be used after it was swapped with coi.snaps.

Signed-off-by: Samuel Just <samuel.just@dreamhost.com>
src/osd/ReplicatedPG.cc

index 658c9ef0da22a90f2ba7b53eb5f091dd9b6bd7c1..0e90e360ce68916fdec6200b95c2c140a7c43aec 100644 (file)
@@ -776,20 +776,22 @@ bool ReplicatedPG::snap_trimmer()
        // save adjusted snaps for this object
        dout(10) << coid << " snaps " << snaps << " -> " << newsnaps << dendl;
        coi.snaps.swap(newsnaps);
+       vector<snapid_t>& oldsnaps = newsnaps;
        coi.prior_version = coi.version;
        coi.version = ctx->at_version;
        bl.clear();
        ::encode(coi, bl);
        t->setattr(coll, coid, OI_ATTR, bl);
 
-       if (snaps[0] != newsnaps[0]) {
-         t->collection_remove(coll_t(info.pgid, snaps[0]), coid);
-         t->collection_add(coll_t(info.pgid, newsnaps[0]), coll, coid);
+       if (oldsnaps[0] != snaps[0]) {
+         t->collection_remove(coll_t(info.pgid, oldsnaps[0]), coid);
+         if (oldsnaps.size() > 1 && oldsnaps[snaps.size() - 1] != snaps[0])
+           t->collection_add(coll_t(info.pgid, snaps[0]), coll, coid);
        }
-       if (snaps.size() > 1 && snaps[snaps.size()-1] != newsnaps[newsnaps.size()-1]) {
-         t->collection_remove(coll_t(info.pgid, snaps[snaps.size()-1]), coid);
-         if (newsnaps.size() > 1)
-           t->collection_add(coll_t(info.pgid, newsnaps[newsnaps.size()-1]), coll, coid);
+       if (oldsnaps.size() > 1 && oldsnaps[oldsnaps.size()-1] != snaps[snaps.size()-1]) {
+         t->collection_remove(coll_t(info.pgid, oldsnaps[oldsnaps.size()-1]), coid);
+         if (snaps.size() > 1)
+           t->collection_add(coll_t(info.pgid, snaps[snaps.size()-1]), coll, coid);
        }             
 
        ctx->log.push_back(Log::Entry(Log::Entry::MODIFY, coid, coi.version, coi.prior_version,