summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/osd/ReplicatedPG.cc37
1 files changed, 28 insertions, 9 deletions
diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc
index d9ab6e2012d..6446717e2a5 100644
--- a/src/osd/ReplicatedPG.cc
+++ b/src/osd/ReplicatedPG.cc
@@ -1345,16 +1345,35 @@ ReplicatedPG::RepGather *ReplicatedPG::trim_object(const hobject_t &coid,
::encode(coi, bl);
t->setattr(coll, coid, OI_ATTR, bl);
- 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] && snaps.size() > 1)
- t->collection_add(coll_t(info.pgid, snaps[0]), coll, coid);
+ set<snapid_t> old_snapdirs, new_snapdirs;
+
+ old_snapdirs.insert(oldsnaps[0]);
+ old_snapdirs.insert(*(oldsnaps.rbegin()));
+
+ new_snapdirs.insert(snaps[0]);
+ new_snapdirs.insert(*(snaps.rbegin()));
+
+ set<snapid_t> to_remove, to_create;
+ for (set<snapid_t>::iterator i = old_snapdirs.begin();
+ i != old_snapdirs.end();
+ ++i) {
+ if (new_snapdirs.count(*i))
+ continue;
+ t->collection_remove(coll_t(info.pgid, *i), coid);
+ to_remove.insert(*i);
}
- 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);
- }
+ for (set<snapid_t>::iterator i = new_snapdirs.begin();
+ i != new_snapdirs.end();
+ ++i) {
+ if (old_snapdirs.count(*i))
+ continue;
+ t->collection_add(coll_t(info.pgid, *i), coll, coid);
+ to_create.insert(*i);
+ }
+
+ dout(10) << "removing coid " << coid << " from snap collections "
+ << to_remove << " and adding to snap collections "
+ << to_create << dendl;
ctx->log.push_back(pg_log_entry_t(pg_log_entry_t::MODIFY, coid, coi.version, coi.prior_version,
osd_reqid_t(), ctx->mtime));