::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));