From cf39db241a0b5349ba708082b6ca472f0c7d97c8 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Tue, 21 Dec 2010 12:01:41 -0800 Subject: [PATCH] PG: change snap_collections to an interval_set Previously, the set of local snap collections was represented using a set, which complicates set operations with interval_sets. Signed-off-by: Samuel Just --- src/osd/OSD.cc | 44 ++++++++++++++++++++++++-------------------- src/osd/PG.cc | 17 ++++++++++++++--- src/osd/PG.h | 2 +- 3 files changed, 39 insertions(+), 24 deletions(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 0465ffc64e9e6..a51f645440497 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -4373,32 +4373,36 @@ void OSD::_remove_pg(PG *pg) ObjectStore::Transaction *rmt = new ObjectStore::Transaction; // snap collections - for (set::iterator p = pg->snap_collections.begin(); + for (interval_set::iterator p = pg->snap_collections.begin(); p != pg->snap_collections.end(); p++) { - vector olist; - store->collection_list(coll_t(pgid, *p), olist); - dout(10) << "_remove_pg " << pgid << " snap " << *p << " " << olist.size() << " objects" << dendl; - for (vector::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 olist; + store->collection_list(coll_t(pgid, cur), olist); + dout(10) << "_remove_pg " << pgid << " snap " << cur << " " << olist.size() << " objects" << dendl; + for (vector::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 diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 203602a85aa93..ae551c3affcc8 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -2205,7 +2205,7 @@ void PG::write_info(ObjectStore::Transaction& t) { // 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; @@ -2624,12 +2624,23 @@ void PG::read_state(ObjectStore *store) 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 snap_collections_temp; + ::decode(snap_collections_temp, p); + snap_collections.clear(); + for (set::iterator i = snap_collections_temp.begin(); + i != snap_collections_temp.end(); + ++i) { + snap_collections.insert(*i); + } + } else { ::decode(snap_collections, p); } @@ -2666,7 +2677,7 @@ void PG::read_state(ObjectStore *store) 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; diff --git a/src/osd/PG.h b/src/osd/PG.h index ebb2878daa6f9..a76029a1c0597 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -701,7 +701,7 @@ public: Missing missing; map > missing_loc; - set snap_collections; + interval_set snap_collections; map past_intervals; interval_set snap_trimq; -- 2.39.5