]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: Monitor: schedule scrub periodically
authorJoao Eduardo Luis <joao@suse.de>
Wed, 15 Apr 2015 23:34:10 +0000 (00:34 +0100)
committerJoao Eduardo Luis <joao@suse.de>
Tue, 5 May 2015 11:24:28 +0000 (12:24 +0100)
Default is 24h interval, adjustable via 'mon_scrub_interval'.

Signed-off-by: Joao Eduardo Luis <joao@suse.de>
src/common/config_opts.h
src/mon/Monitor.cc
src/mon/Monitor.h

index 7c4ca61e8d004e3892e2ecbeb94a985281f18526..be0bf9732652f4d5a0684c14b463595e9669707e 100644 (file)
@@ -243,6 +243,7 @@ OPTION(mon_health_to_clog_tick_interval, OPT_DOUBLE, 60.0)
 OPTION(mon_data_avail_crit, OPT_INT, 5)
 OPTION(mon_data_avail_warn, OPT_INT, 30)
 OPTION(mon_data_size_warn, OPT_U64, 15*1024*1024*1024) // issue a warning when the monitor's data store goes over 15GB (in bytes)
+OPTION(mon_scrub_interval, OPT_INT, 3600*24) // once a day
 OPTION(mon_config_key_max_entry_size, OPT_INT, 4096) // max num bytes per config-key entry
 OPTION(mon_sync_timeout, OPT_DOUBLE, 60.0)
 OPTION(mon_sync_max_payload_size, OPT_U32, 1048576) // max size for a sync chunk payload (say, 1MB)
index 8d1b3ee786cdddce1f5e7c2b17a89b67872850bc..0aba8ddbc4aec0724e77556aa0c80f629cf1e639 100644 (file)
@@ -165,7 +165,9 @@ Monitor::Monitor(CephContext* cct_, string nm, MonitorDBStore *s,
   required_features(0),
   leader(0),
   quorum_features(0),
+  // scrub
   scrub_version(0),
+  scrub_event(NULL),
 
   // sync state
   sync_provider_count(0),
@@ -993,6 +995,7 @@ void Monitor::_reset()
   cancel_probe_timeout();
   timecheck_finish();
   health_events_cleanup();
+  scrub_event_cancel();
 
   leader_since = utime_t();
   if (!quorum.empty()) {
@@ -1856,6 +1859,7 @@ void Monitor::win_election(epoch_t epoch, set<int>& active, uint64_t features,
     timecheck_start();
     health_tick_start();
     do_health_to_clog_interval();
+    scrub_event_start();
   }
 }
 
@@ -4305,6 +4309,7 @@ void Monitor::scrub_finish()
     clog->info() << "scrub ok on " << quorum << ": " << mine << "\n";
 
   scrub_reset();
+  scrub_event_start();
 }
 
 void Monitor::scrub_reset()
@@ -4315,6 +4320,25 @@ void Monitor::scrub_reset()
 }
 
 
+void Monitor::scrub_event_start()
+{
+  dout(10) << __func__ << dendl;
+
+  if (scrub_event)
+    scrub_event_cancel();
+
+  scrub_event = new C_Scrub(this);
+  timer.add_event_after(cct->_conf->mon_scrub_interval, scrub_event);
+}
+
+void Monitor::scrub_event_cancel()
+{
+  dout(10) << __func__ << dendl;
+  if (scrub_event) {
+    timer.cancel_event(scrub_event);
+    scrub_event = NULL;
+  }
+}
 
 /************ TICK ***************/
 
index 72f1307602b4a2dcbf866066d606d8c31feebdbc..7989d3dd5b97c850ca74377c5d1d02778eec8188 100644 (file)
@@ -248,6 +248,17 @@ private:
   void scrub_finish();
   void scrub_reset();
 
+  struct C_Scrub : public Context {
+    Monitor *mon;
+    C_Scrub(Monitor *m) : mon(m) { }
+    void finish(int r) {
+      mon->scrub();
+    }
+  };
+  Context *scrub_event;
+  void scrub_event_start();
+  void scrub_event_cancel();
+
   /**
    * @defgroup Monitor_h_sync Synchronization
    * @{