From: Sage Weil Date: Wed, 26 Jun 2019 20:43:25 +0000 (-0500) Subject: osd: automatically scrub purged_snaps every deep scrub interval X-Git-Tag: v15.1.0~2308^2~2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=5b0ed6ff9e10fbbe70c789796099223a38996401;p=ceph-ci.git osd: automatically scrub purged_snaps every deep scrub interval With randomization. We do this from tick() for simplicity. It is a rare event, will take 10s of seconds at most, and nothing else particularly time-sensitive is happening from tick(). Signed-off-by: Sage Weil --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index d054f8dc71a..86ce5101158 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -4924,6 +4924,29 @@ void OSD::tick() do_waiters(); + // scrub purged_snaps every deep scrub interval + { + const utime_t last = superblock.last_purged_snaps_scrub; + utime_t next = last; + next += cct->_conf->osd_scrub_min_interval; + std::mt19937 rng; + // use a seed that is stable for each scrub interval, but varies + // by OSD to avoid any herds. + rng.seed(whoami + superblock.last_purged_snaps_scrub.sec()); + double r = (rng() % 1024) / 1024; + next += + cct->_conf->osd_scrub_min_interval * + cct->_conf->osd_scrub_interval_randomize_ratio * r; + if (next < ceph_clock_now()) { + dout(20) << __func__ << " last_purged_snaps_scrub " << last + << " next " << next << " ... now" << dendl; + scrub_purged_snaps(); + } else { + dout(20) << __func__ << " last_purged_snaps_scrub " << last + << " next " << next << dendl; + } + } + tick_timer.add_event_after(get_tick_interval(), new C_Tick(this)); }