]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: purged_snaps in PG::Info, queue snap trim on primary
authorSage Weil <sage@newdream.net>
Sun, 16 May 2010 03:55:44 +0000 (20:55 -0700)
committerSage Weil <sage@newdream.net>
Sun, 16 May 2010 03:55:44 +0000 (20:55 -0700)
src/osd/OSD.cc
src/osd/PG.cc
src/osd/PG.h
src/osd/ReplicatedPG.cc

index 2f222a3a9a7113c8a3d4f0c607098c4f127386e4..110f34df567a2cce528505a48be7c33668dff81f 100644 (file)
@@ -2334,13 +2334,13 @@ void OSD::advance_map(ObjectStore::Transaction& t)
     pg->lock();
 
     // adjust removed_snaps?
-    if (!pg->pool->newly_removed_snaps.empty()) {
+    if (pg->is_active() &&
+       !pg->pool->newly_removed_snaps.empty()) {
       for (map<snapid_t,snapid_t>::iterator p = pg->pool->newly_removed_snaps.m.begin();
           p != pg->pool->newly_removed_snaps.m.end();
           p++)
-       for (snapid_t t = 0; t < p->second; ++t)
-         pg->info.snap_trimq.insert(p->first + t);
-      dout(10) << *pg << " snap_trimq now " << pg->info.snap_trimq << dendl;
+       pg->snap_trimq.insert(p->first, p->second);
+      dout(10) << *pg << " snap_trimq now " << pg->snap_trimq << dendl;
       pg->dirty_info = true;
     }
     
@@ -2523,8 +2523,9 @@ void OSD::activate_map(ObjectStore::Transaction& t, list<Context*>& tfin)
       continue;
     }
     if (pg->is_active()) {
-      // update started counter
-      if (!pg->info.snap_trimq.empty())
+      // i am active
+      if (pg->is_primary() &&
+         !pg->snap_trimq.empty())
        pg->queue_snap_trim();
     }
     else if (pg->is_primary() &&
@@ -2942,9 +2943,10 @@ void OSD::split_pg(PG *parent, map<pg_t,PG*>& children, ObjectStore::Transaction
     child->info.last_complete = parent->info.last_complete;
     child->info.log_tail =  parent->log.tail;
     child->info.log_backlog = parent->log.backlog;
-    child->info.snap_trimq = parent->info.snap_trimq;
     child->info.history.last_epoch_split = osdmap->get_epoch();
 
+    child->snap_trimq = parent->snap_trimq;
+
     dout(20) << " child " << p->first << " log now ";
     child->log.print(*_dout);
     *_dout << dendl;
index f624b68931c478ded384e8e6a177c49a24ad93a6..429bda0b600e6cfffab1873177426efdb1c8f221 100644 (file)
@@ -1034,6 +1034,8 @@ void PG::clear_primary_state()
   min_last_complete_ondisk = eversion_t();
   stray_purged.clear();
 
+  snap_trimq.clear();
+
   finish_sync_event = 0;  // so that _finish_recvoery doesn't go off in another thread
 
   missing_loc.clear();
@@ -1043,6 +1045,7 @@ void PG::clear_primary_state()
 
   peer_scrub_map.clear();
   osd->recovery_wq.dequeue(this);
+  osd->snap_trim_wq.dequeue(this);
 }
 
 bool PG::choose_acting(int newest_update_osd)
@@ -1597,10 +1600,14 @@ void PG::activate(ObjectStore::Transaction& t, list<Context*>& tfin,
   write_info(t);
   write_log(t);
 
-  // clean up stray objects, snaps
+  // clean up stray objects
   clean_up_local(t); 
 
-  if (!info.snap_trimq.empty())
+  // initialize snap_trimq
+  snap_trimq = pool->cached_removed_snaps;
+  snap_trimq.subtract(info.purged_snaps);
+  dout(10) << "activate - snap_trimq " << snap_trimq << dendl;
+  if (!snap_trimq.empty())
     queue_snap_trim();
 
   // init complete pointer
index f9a953aa8d39a0fa38ae7f3b516379dc8dfb9df6..400b840dc3998ee3bd65bff8b3f6d2cb6c7f98a5 100644 (file)
@@ -91,7 +91,7 @@ public:
     eversion_t log_tail;     // oldest log entry.
     bool       log_backlog;    // do we store a complete log?
 
-    set<snapid_t> snap_trimq; // snaps we need to trim
+    interval_set<snapid_t> purged_snaps;
 
     pg_stat_t stats;
 
@@ -147,7 +147,7 @@ public:
     bool dne() const { return history.epoch_created == 0; }
 
     void encode(bufferlist &bl) const {
-      __u8 v = 21;
+      __u8 v = 22;
       ::encode(v, bl);
 
       ::encode(pgid, bl);
@@ -157,7 +157,7 @@ public:
       ::encode(log_backlog, bl);
       ::encode(stats, bl);
       history.encode(bl);
-      ::encode(snap_trimq, bl);
+      ::encode(purged_snaps, bl);
     }
     void decode(bufferlist::iterator &bl) {
       __u8 v;
@@ -170,7 +170,12 @@ public:
       ::decode(log_backlog, bl);
       ::decode(stats, bl);
       history.decode(bl);
-      ::decode(snap_trimq, bl);
+      if (v >= 22)
+       ::decode(purged_snaps, bl);
+      else {
+       set<snapid_t> snap_trimq;
+       ::decode(snap_trimq, bl);
+      }
     }
   };
   //WRITE_CLASS_ENCODER(Info::History)
@@ -704,6 +709,8 @@ public:
   set<snapid_t> snap_collections;
   map<epoch_t,Interval> past_intervals;
 
+  interval_set<snapid_t> snap_trimq;
+
   xlist<PG*>::item recovery_item, backlog_item, scrub_item, snap_trim_item, remove_item, stat_queue_item;
   int recovery_ops_active;
 #ifdef DEBUG_RECOVERY_OIDS
@@ -1103,8 +1110,8 @@ inline ostream& operator<<(ostream& out, const PG& pg)
     if (lost)
       out << " l=" << lost;
   }
-  //if (pg.info.snap_trimq.size())
-  //out << " snaptrimq=" << pg.info.snap_trimq;
+  if (pg.snap_trimq.size())
+    out << " snaptrimq=" << pg.snap_trimq;
 
   if (pg.deleting)
     out << " DELETING";
index 11a231584d9a855c0d274b62f2cea17a51e2ecc1..bd7d3d5ee86ceaacac240ea356866bcfcd09853e 100644 (file)
@@ -743,9 +743,10 @@ bool ReplicatedPG::snap_trimmer()
   lock();
   dout(10) << "snap_trimmer start" << dendl;
 
-  while (info.snap_trimq.size() &&
+  while (snap_trimq.size() &&
+        is_primary() &&
         is_active()) {
-    snapid_t sn = *info.snap_trimq.begin();
+    snapid_t sn = snap_trimq.start();
     coll_t c = coll_t::build_snap_pg_coll(info.pgid, sn);
     vector<sobject_t> ls;
     osd->store->collection_list(c, ls);
@@ -857,7 +858,7 @@ bool ReplicatedPG::snap_trimmer()
     int tr = osd->store->queue_transaction(&osr, t);
     assert(tr == 0);
  
-    info.snap_trimq.erase(sn);
+    snap_trimq.erase(sn);
   }  
 
   // done