]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
PG: change snap_collections to an interval_set
authorSamuel Just <samuelj@hq.newdream.net>
Tue, 21 Dec 2010 20:01:41 +0000 (12:01 -0800)
committerSamuel Just <samuelj@hq.newdream.net>
Thu, 13 Jan 2011 21:43:02 +0000 (13:43 -0800)
Previously, the set of local snap collections was represented using a
set, which complicates set operations with interval_sets.

Signed-off-by: Samuel Just <samuelj@hq.newdream.net>
src/osd/OSD.cc
src/osd/PG.cc
src/osd/PG.h

index 0465ffc64e9e665f9a755e9d752ab390bbe92614..a51f645440497ea2c5f32fbb278fa4f29bb52bc6 100644 (file)
@@ -4373,32 +4373,36 @@ void OSD::_remove_pg(PG *pg)
   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
index 203602a85aa9370de08eb2acbd69e25725a09f71..ae551c3affcc8e4e5085a270cd5c654c2887be3c 100644 (file)
@@ -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<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);
   }
 
@@ -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;
index ebb2878daa6f9fceb8332ef78d67a5e89ae51a11..a76029a1c0597c976b7ef3e0fe3e790c2513377f 100644 (file)
@@ -701,7 +701,7 @@ public:
   Missing     missing;
   map<sobject_t, set<int> > missing_loc;
   
-  set<snapid_t> snap_collections;
+  interval_set<snapid_t> snap_collections;
   map<epoch_t,Interval> past_intervals;
 
   interval_set<snapid_t> snap_trimq;