From: Sage Weil Date: Tue, 15 Jan 2013 02:20:29 +0000 (-0800) Subject: osd: fix scrub scheduling for 0.0 X-Git-Tag: v0.57~201 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=26a63df97b2a12fd1a7c1e3cc9ccd34ca2ef9834;p=ceph.git osd: fix scrub scheduling for 0.0 The initial value for pair can match pg 0.0, preventing it from being manually scrubbed. Fix! Signed-off-by: Sage Weil --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 70c89f7c317b..a0e2a2edae35 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -3575,37 +3575,40 @@ void OSD::sched_scrub() //dout(20) << " " << last_scrub_pg << dendl; pair pos; - while (service.next_scrub_stamp(pos, &pos)) { - utime_t t = pos.first; - pg_t pgid = pos.second; + if (service.first_scrub_stamp(&pos)) { + do { + utime_t t = pos.first; + pg_t pgid = pos.second; + dout(30) << " " << pgid << " at " << t << dendl; - if (t > min) { - dout(10) << " " << pgid << " at " << t - << " > min " << min << " (" << g_conf->osd_scrub_min_interval << " seconds ago)" << dendl; - break; - } - if (t > max && !load_is_low) { - // save ourselves some effort - break; - } - - PG *pg = _lookup_lock_pg(pgid); - if (pg) { - if (pg->is_active() && - (load_is_low || - t < max || - pg->scrubber.must_scrub)) { + if (t > min) { dout(10) << " " << pgid << " at " << t - << (pg->scrubber.must_scrub ? ", explicitly requested" : "") - << (t < max ? ", last_scrub > max" : "") - << dendl; - if (pg->sched_scrub()) { - pg->unlock(); - break; + << " > min " << min << " (" << g_conf->osd_scrub_min_interval << " seconds ago)" << dendl; + break; + } + if (t > max && !load_is_low) { + // save ourselves some effort + break; + } + + PG *pg = _lookup_lock_pg(pgid); + if (pg) { + if (pg->is_active() && + (load_is_low || + t < max || + pg->scrubber.must_scrub)) { + dout(10) << " " << pgid << " at " << t + << (pg->scrubber.must_scrub ? ", explicitly requested" : "") + << (t < max ? ", last_scrub < max" : "") + << dendl; + if (pg->sched_scrub()) { + pg->unlock(); + break; + } } + pg->unlock(); } - pg->unlock(); - } + } while (service.next_scrub_stamp(pos, &pos)); } dout(20) << "sched_scrub done" << dendl; } diff --git a/src/osd/OSD.h b/src/osd/OSD.h index d578ff38c2ef..83308486f0f2 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -255,17 +255,29 @@ public: void unreg_last_pg_scrub(pg_t pgid, utime_t t) { Mutex::Locker l(sched_scrub_lock); pair p(t, pgid); - assert(last_scrub_pg.count(p)); - last_scrub_pg.erase(p); + set >::iterator it = last_scrub_pg.find(p); + assert(it != last_scrub_pg.end()); + last_scrub_pg.erase(it); } - bool next_scrub_stamp(pair after, + bool first_scrub_stamp(pair *out) { + Mutex::Locker l(sched_scrub_lock); + if (last_scrub_pg.size() == 0) + return false; + set< pair >::iterator iter = last_scrub_pg.begin(); + *out = *iter; + return true; + } + bool next_scrub_stamp(pair next, pair *out) { Mutex::Locker l(sched_scrub_lock); - if (last_scrub_pg.size() == 0) return false; - set< pair >::iterator iter = last_scrub_pg.lower_bound(after); - if (iter == last_scrub_pg.end()) return false; + if (last_scrub_pg.size() == 0) + return false; + set< pair >::iterator iter = last_scrub_pg.lower_bound(next); + if (iter == last_scrub_pg.end()) + return false; ++iter; - if (iter == last_scrub_pg.end()) return false; + if (iter == last_scrub_pg.end()) + return false; *out = *iter; return true; }