From: wanwencong Date: Thu, 25 Feb 2021 09:07:41 +0000 (+0800) Subject: osd: fix scrub reschedule bug X-Git-Tag: v16.2.5~41^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=33bd49abc4a5ffa449f628444079af355864827b;p=ceph.git osd: fix scrub reschedule bug not all element can be visited during reschedule traverse Fixes: https://tracker.ceph.com/issues/49487 Signed-off-by: wencong wan (cherry picked from commit d7561a6e58fc8043b77648a2cdd5d12bb637f92b) --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index bd726f627a8c..f580fb6f5645 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -7660,20 +7660,26 @@ void OSD::sched_scrub() void OSD::resched_all_scrubs() { dout(10) << __func__ << ": start" << dendl; - OSDService::ScrubJob scrub_job; - if (service.first_scrub_stamp(&scrub_job)) { - do { - dout(20) << __func__ << ": examine " << scrub_job.pgid << dendl; - - PGRef pg = _lookup_lock_pg(scrub_job.pgid); + const vector pgs = [this] { + vector pgs; + OSDService::ScrubJob job; + if (service.first_scrub_stamp(&job)) { + do { + pgs.push_back(job.pgid); + } while (service.next_scrub_stamp(job, &job)); + } + return pgs; + }(); + for (auto& pgid : pgs) { + dout(20) << __func__ << ": examine " << pgid << dendl; + PGRef pg = _lookup_lock_pg(pgid); if (!pg) continue; if (!pg->m_planned_scrub.must_scrub && !pg->m_planned_scrub.need_auto) { - dout(15) << __func__ << ": reschedule " << scrub_job.pgid << dendl; + dout(15) << __func__ << ": reschedule " << pgid << dendl; pg->on_info_history_change(); } pg->unlock(); - } while (service.next_scrub_stamp(scrub_job, &scrub_job)); } dout(10) << __func__ << ": done" << dendl; } diff --git a/src/osd/OSD.h b/src/osd/OSD.h index f55658c3bb16..ed1fbcff1d4b 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -319,10 +319,7 @@ public: std::lock_guard l(sched_scrub_lock); if (sched_scrub_pg.empty()) return false; - std::set::const_iterator iter = sched_scrub_pg.lower_bound(next); - if (iter == sched_scrub_pg.cend()) - return false; - ++iter; + std::set::const_iterator iter = sched_scrub_pg.upper_bound(next); if (iter == sched_scrub_pg.cend()) return false; *out = *iter;