]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
osd: automatically scrub purged_snaps every deep scrub interval
authorSage Weil <sage@redhat.com>
Wed, 26 Jun 2019 20:43:25 +0000 (15:43 -0500)
committerSage Weil <sage@redhat.com>
Tue, 2 Jul 2019 13:37:51 +0000 (08:37 -0500)
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 <sage@redhat.com>
src/osd/OSD.cc

index d054f8dc71a34a380d7542ee791b07a75e05c073..86ce5101158fbb474af9633c99bfa0b8be835784 100644 (file)
@@ -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));
 }