]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: fix scrub reserved state when starting scrub
authorSage Weil <sage@newdream.net>
Wed, 10 Nov 2010 21:39:51 +0000 (13:39 -0800)
committerSage Weil <sage@newdream.net>
Wed, 10 Nov 2010 21:39:51 +0000 (13:39 -0800)
Also document scrub scheduling/pending/active states.

Signed-off-by: Sage Weil <sage@newdream.net>
src/osd/OSD.h
src/osd/PG.cc

index 7a5325a2d4eaed7b25e0479ac39a228e3b40b5f2..73034cd5fef94a1435cb3e0a0be81f490ca6a748 100644 (file)
@@ -846,15 +846,21 @@ protected:
       return pg;
     }
     void _process(PG *pg) {
+
+      // pending -> active
+      pg->lock();
       osd->sched_scrub_lock.Lock();
       --(osd->scrubs_pending);
       assert(osd->scrubs_pending >= 0);
       ++(osd->scrubs_active);
       osd->sched_scrub_lock.Unlock();
+      pg->scrub_reserved = false;
+      pg->scrub_reserved_peers.clear();
+      pg->unlock();
+
       pg->scrub();
-      pg->get();
-    }
-    void _process_finish(PG *pg) {
+      
+      // active -> nothing.
       osd->sched_scrub_lock.Lock();
       --(osd->scrubs_active);
       osd->sched_scrub_lock.Unlock();
index 14d3a7fd9ac422f17b87fc90867e997fcc1b2490..4209157ec1c6331c14c28aa07eafd752dcbce1a6 100644 (file)
@@ -2542,6 +2542,21 @@ void PG::take_object_waiters(hash_map<sobject_t, list<Message*> >& m)
 // ==========================================================================================
 // SCRUB
 
+/*
+ * when holding pg and sched_scrub_lock, then the states are:
+ *   scheduling:
+ *     scrub_reserved = true
+ *     osd->scrub_pending++
+ *   pending:
+ *     scrub_reserved = true
+ *     scrub_reserved_peers.size() == acting.size();
+ *     pg on scrub_wq
+ *     osd->scrub_pending++
+ *   scrubbing:
+ *     scrub_reserved = false;
+ *     osd->scrub_active++
+ */
+
 // returns false if waiting for a reply
 bool PG::sched_scrub()
 {