From: Sage Weil Date: Wed, 10 Nov 2010 22:58:34 +0000 (-0800) Subject: osd: do scrub schedule state changes inside scrub() X-Git-Tag: v0.24~198 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6548fb65ccf37f8657cb1f618c0e2b55e7fd2d79;p=ceph.git osd: do scrub schedule state changes inside scrub() 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 --- diff --git a/src/osd/OSD.h b/src/osd/OSD.h index 73034cd5fef9..4f1fb3ad6724 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -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()) { diff --git a/src/osd/PG.cc b/src/osd/PG.cc index ccafff233aef..25f8d17375ea 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -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 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);