From e26626a8b4d91bb827a4909fd7f45f2c5f06f331 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Thu, 7 Apr 2011 14:38:48 -0700 Subject: [PATCH] ReplicatedPG: fix error in snap_trimmer newsnaps continued to be used after it was swapped with coi.snaps. Signed-off-by: Samuel Just --- src/osd/ReplicatedPG.cc | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 658c9ef0da22a..0e90e360ce689 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -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& 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, -- 2.39.5