diff options
Diffstat (limited to 'src/osd/OSD.cc')
-rw-r--r-- | src/osd/OSD.cc | 32 |
1 files changed, 17 insertions, 15 deletions
diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index f2801534c25..4caaf46638b 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -1949,9 +1949,7 @@ void OSD::tick() // periodically kick recovery work queue recovery_tp.wake(); - if (scrub_should_schedule()) { - sched_scrub(); - } + sched_scrub(); map_lock.get_read(); @@ -3090,11 +3088,11 @@ void OSD::handle_scrub(MOSDScrub *m) PG *pg = p->second; pg->lock(); if (pg->is_primary()) { - if (m->repair) - pg->state_set(PG_STATE_REPAIR); - if (pg->queue_scrub()) { - dout(10) << "queueing " << *pg << " for scrub" << dendl; - } + pg->unreg_scrub(); + pg->must_scrub = true; + pg->must_repair = m->repair; + pg->reg_scrub(); + dout(10) << "marking " << *pg << " for scrub" << dendl; } pg->unlock(); } @@ -3106,11 +3104,11 @@ void OSD::handle_scrub(MOSDScrub *m) PG *pg = pg_map[*p]; pg->lock(); if (pg->is_primary()) { - if (m->repair) - pg->state_set(PG_STATE_REPAIR); - if (pg->queue_scrub()) { - dout(10) << "queueing " << *pg << " for scrub" << dendl; - } + pg->unreg_scrub(); + pg->must_scrub = true; + pg->must_repair = m->repair; + pg->reg_scrub(); + dout(10) << "marking " << *pg << " for scrub" << dendl; } pg->unlock(); } @@ -3157,7 +3155,9 @@ void OSD::sched_scrub() { assert(osd_lock.is_locked()); - dout(20) << "sched_scrub" << dendl; + bool should = scrub_should_schedule(); + + dout(20) << "sched_scrub should=" << (int)should << dendl; pair<utime_t,pg_t> pos; utime_t max = ceph_clock_now(g_ceph_context); @@ -3184,7 +3184,9 @@ void OSD::sched_scrub() sched_scrub_lock.Unlock(); PG *pg = _lookup_lock_pg(pgid); if (pg) { - if (pg->is_active() && !pg->sched_scrub()) { + if (pg->is_active() && + (should || pg->must_scrub) && + !pg->sched_scrub()) { pg->unlock(); sched_scrub_lock.Lock(); break; |