ObjectStore::Transaction *rmt = new ObjectStore::Transaction;
// snap collections
- for (set<snapid_t>::iterator p = pg->snap_collections.begin();
+ for (interval_set<snapid_t>::iterator p = pg->snap_collections.begin();
p != pg->snap_collections.end();
p++) {
- vector<sobject_t> olist;
- store->collection_list(coll_t(pgid, *p), olist);
- dout(10) << "_remove_pg " << pgid << " snap " << *p << " " << olist.size() << " objects" << dendl;
- for (vector<sobject_t>::iterator q = olist.begin();
- q != olist.end();
- q++) {
- ObjectStore::Transaction *t = new ObjectStore::Transaction;
- t->remove(coll_t(pgid, *p), *q);
- t->remove(coll_t(pgid), *q); // we may hit this twice, but it's harmless
- int tr = store->queue_transaction(&pg->osr, t);
- assert(tr == 0);
-
- if ((++n & 0xff) == 0) {
- pg->unlock();
- pg->lock();
- if (!pg->deleting) {
- dout(10) << "_remove_pg aborted on " << *pg << dendl;
+ for (snapid_t cur = p.get_start();
+ cur < p.get_start() + p.get_len();
+ ++cur) {
+ vector<sobject_t> olist;
+ store->collection_list(coll_t(pgid, cur), olist);
+ dout(10) << "_remove_pg " << pgid << " snap " << cur << " " << olist.size() << " objects" << dendl;
+ for (vector<sobject_t>::iterator q = olist.begin();
+ q != olist.end();
+ q++) {
+ ObjectStore::Transaction *t = new ObjectStore::Transaction;
+ t->remove(coll_t(pgid, cur), *q);
+ t->remove(coll_t(pgid), *q); // we may hit this twice, but it's harmless
+ int tr = store->queue_transaction(&pg->osr, t);
+ assert(tr == 0);
+
+ if ((++n & 0xff) == 0) {
pg->unlock();
- return;
+ pg->lock();
+ if (!pg->deleting) {
+ dout(10) << "_remove_pg aborted on " << *pg << dendl;
+ pg->unlock();
+ return;
+ }
}
}
+ rmt->remove_collection(coll_t(pgid, cur));
}
- rmt->remove_collection(coll_t(pgid, *p));
}
// (what remains of the) main collection
{
// pg state
bufferlist infobl;
- __u8 struct_v = 2;
+ __u8 struct_v = 3;
::encode(struct_v, infobl);
::encode(info, infobl);
dout(20) << "write_info info " << infobl.length() << dendl;
store->collection_getattr(coll, "snap_collections", bl);
p = bl.begin();
::decode(struct_v, p);
- ::decode(snap_collections, p);
} else {
bl.clear();
store->read(coll_t::META_COLL, biginfo_oid, 0, 0, bl);
p = bl.begin();
::decode(past_intervals, p);
+ }
+
+ if (struct_v < 3) {
+ set<snapid_t> snap_collections_temp;
+ ::decode(snap_collections_temp, p);
+ snap_collections.clear();
+ for (set<snapid_t>::iterator i = snap_collections_temp.begin();
+ i != snap_collections_temp.end();
+ ++i) {
+ snap_collections.insert(*i);
+ }
+ } else {
::decode(snap_collections, p);
}
coll_t PG::make_snap_collection(ObjectStore::Transaction& t, snapid_t s)
{
coll_t c(info.pgid, s);
- if (snap_collections.count(s) == 0) {
+ if (!snap_collections.contains(s)) {
snap_collections.insert(s);
dout(10) << "create_snap_collection " << c << ", set now " << snap_collections << dendl;
bufferlist bl;