From: Sage Weil Date: Wed, 10 Nov 2010 21:39:51 +0000 (-0800) Subject: osd: fix scrub reserved state when starting scrub X-Git-Tag: v0.24~203 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=74be621cc609e96e2a92b1a9d177898681d9364c;p=ceph.git osd: fix scrub reserved state when starting scrub Also document scrub scheduling/pending/active states. Signed-off-by: Sage Weil --- diff --git a/src/osd/OSD.h b/src/osd/OSD.h index 7a5325a2d4ea..73034cd5fef9 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -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(); diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 14d3a7fd9ac4..4209157ec1c6 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -2542,6 +2542,21 @@ void PG::take_object_waiters(hash_map >& 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() {