From deb8ea44ce878d25ac76a0264911a2bd824a140b Mon Sep 17 00:00:00 2001 From: Xinze Chi Date: Fri, 29 May 2015 11:29:38 +0800 Subject: [PATCH] osd: check pending or active scrub before sched_scrub Signed-off-by: Xinze Chi --- src/osd/OSD.cc | 20 ++++++++++++++++++++ src/osd/OSD.h | 1 + 2 files changed, 21 insertions(+) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 294272844c4..79fea44beb2 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -896,6 +896,21 @@ void OSDService::share_map_peer(int peer, Connection *con, OSDMapRef map) } } +bool OSDService::can_inc_scrubs_pending() +{ + bool can_inc = false; + Mutex::Locker l(sched_scrub_lock); + + if (scrubs_pending + scrubs_active < cct->_conf->osd_max_scrubs) { + dout(20) << __func__ << scrubs_pending << " -> " << (scrubs_pending+1) + << " (max " << cct->_conf->osd_max_scrubs << ", active " << scrubs_active << ")" << dendl; + can_inc = true; + } else { + dout(20) << __func__ << scrubs_pending << " + " << scrubs_active << " active >= max " << cct->_conf->osd_max_scrubs << dendl; + } + + return can_inc; +} bool OSDService::inc_scrubs_pending() { @@ -5923,6 +5938,11 @@ bool OSD::scrub_load_below_threshold() void OSD::sched_scrub() { + // if not permitted, fail fast + if (!service.can_inc_scrubs_pending()) { + return; + } + utime_t now = ceph_clock_now(cct); bool time_permit = scrub_time_permit(now); bool load_is_low = scrub_load_below_threshold(); diff --git a/src/osd/OSD.h b/src/osd/OSD.h index 2cf6819f596..5897b865c13 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -564,6 +564,7 @@ public: return true; } + bool can_inc_scrubs_pending(); bool inc_scrubs_pending(); void inc_scrubs_active(bool reserved); void dec_scrubs_pending();