diff options
Diffstat (limited to 'src/osd/OSD.cc')
-rw-r--r-- | src/osd/OSD.cc | 36 |
1 files changed, 19 insertions, 17 deletions
diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index f57f2264f74..4caaf46638b 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -1323,7 +1323,7 @@ void OSD::load_pgs() // read pg state, log pg->read_state(store); - reg_last_pg_scrub(pg->info.pgid, pg->info.history.last_scrub_stamp); + pg->reg_scrub(); // generate state for current mapping osdmap->pg_to_up_acting_osds(pgid, pg->up, pg->acting); @@ -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; @@ -5126,7 +5128,7 @@ void OSD::_remove_pg(PG *pg) // remove from map pg_map.erase(pgid); pg->put(); // since we've taken it out of map - unreg_last_pg_scrub(pg->info.pgid, pg->info.history.last_scrub_stamp); + pg->unreg_scrub(); _put_pool(pg->pool); |