]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: do scrub schedule state changes inside scrub()
authorSage Weil <sage@newdream.net>
Wed, 10 Nov 2010 22:58:34 +0000 (14:58 -0800)
committerSage Weil <sage@newdream.net>
Thu, 11 Nov 2010 00:31:42 +0000 (16:31 -0800)
Update these values under protection of pg lock iff we start scrubbing,
otherwise back out.

On scrub completion, unreserve replicas.

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

index 73034cd5fef94a1435cb3e0a0be81f490ca6a748..4f1fb3ad67243cf7726c7c18b391d3fc2ad741d9 100644 (file)
@@ -846,24 +846,7 @@ 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();
-      
-      // active -> nothing.
-      osd->sched_scrub_lock.Lock();
-      --(osd->scrubs_active);
-      osd->sched_scrub_lock.Unlock();
     }
     void _clear() {
       while (!osd->scrub_queue.empty()) {
index ccafff233aef8893718d7d0772a04bfd34aa0eab..25f8d17375ea55cdd53aa4351677d1b140f1a8e0 100644 (file)
@@ -2930,6 +2930,7 @@ void PG::scrub()
 
   if (!is_primary()) {
     dout(10) << "scrub -- not primary" << dendl;
+    clear_scrub_reserved();
     unlock();
     osd->map_lock.put_read();
     return;
@@ -2937,6 +2938,7 @@ void PG::scrub()
 
   if (!is_active() || !is_clean()) {
     dout(10) << "scrub -- not active or not clean" << dendl;
+    clear_scrub_reserved();
     unlock();
     osd->map_lock.put_read();
     return;
@@ -2946,6 +2948,15 @@ void PG::scrub()
   state_set(PG_STATE_SCRUBBING);
   update_stats();
 
+  osd->sched_scrub_lock.Lock();
+  --(osd->scrubs_pending);
+  assert(osd->scrubs_pending >= 0);
+  ++(osd->scrubs_active);
+  osd->sched_scrub_lock.Unlock();
+
+  scrub_reserved = false;
+  scrub_reserved_peers.clear();
+
   // request maps from replicas
   for (unsigned i=1; i<acting.size(); i++) {
     _request_scrub_map(acting[i], eversion_t());
@@ -2964,7 +2975,6 @@ void PG::scrub()
     }
   }
 
-
   waiting_on = acting.size() - 1;
   while (waiting_on > 0) {
     while (peer_scrub_map.size() == 0) {
@@ -3178,6 +3188,13 @@ void PG::scrub()
   state_clear(PG_STATE_SCRUBBING);
   update_stats();
 
+  // active -> nothing.
+  osd->sched_scrub_lock.Lock();
+  --(osd->scrubs_active);
+  osd->sched_scrub_lock.Unlock();
+
+  scrub_unreserve_replicas();
+  
   dout(10) << "scrub done" << dendl;
 
   osd->take_waiters(waiting_for_active);