]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: cap the amount of time we spend priming pg_temp
authorSage Weil <sage@redhat.com>
Wed, 21 Jan 2015 02:42:52 +0000 (18:42 -0800)
committerSage Weil <sage@redhat.com>
Wed, 21 Jan 2015 03:20:24 +0000 (19:20 -0800)
Default to 500ms, which should be enough for most clusters and not very
disruptive.

Signed-off-by: Sage Weil <sage@redhat.com>
src/common/config_opts.h
src/mon/OSDMonitor.cc

index 46396fa91284fe94cd6c6a23a0ae1bab3f355d31..0410b57a893914762ff00ca1096b114c337956fd 100644 (file)
@@ -194,6 +194,7 @@ OPTION(mon_osd_max_split_count, OPT_INT, 32) // largest number of PGs per "invol
 OPTION(mon_osd_allow_primary_temp, OPT_BOOL, false)  // allow primary_temp to be set in the osdmap
 OPTION(mon_osd_allow_primary_affinity, OPT_BOOL, false)  // allow primary_affinity to be set in the osdmap
 OPTION(mon_osd_prime_pg_temp, OPT_BOOL, false)  // prime osdmap with pg mapping changes
+OPTION(mon_osd_prime_pg_temp_max_time, OPT_FLOAT, .5)  // max time to spend priming
 OPTION(mon_stat_smooth_intervals, OPT_INT, 2)  // smooth stats over last N PGMap maps
 OPTION(mon_lease, OPT_FLOAT, 5)       // lease interval
 OPTION(mon_lease_renew_interval, OPT_FLOAT, 3) // on leader, to renew the lease
index b43511aa89d7aec910f06ad8e9e5d4d513f8a1c7..429047628e9eac67cd3aa96f45f4befed342f34c 100644 (file)
@@ -650,8 +650,17 @@ void OSDMonitor::maybe_prime_pg_temp()
     OSDMap next;
     next.deepish_copy_from(osdmap);
     next.apply_incremental(pending_inc);
+    utime_t stop = ceph_clock_now(NULL);
+    stop += g_conf->mon_osd_prime_pg_temp_max_time;
     for (set<int>::iterator p = osds.begin(); p != osds.end(); ++p) {
       prime_pg_temp(next, &mon->pgmon()->pg_map, *p);
+      if (ceph_clock_now(NULL) > stop) {
+       dout(10) << __func__ << " consumed more than "
+                << g_conf->mon_osd_prime_pg_temp_max_time
+                << " seconds, stopping"
+                << dendl;
+       break;
+      }
     }
   }
 }
@@ -699,10 +708,23 @@ void OSDMonitor::prime_pg_temp(OSDMap& next, PGMap *pg_map, int osd)
 void OSDMonitor::prime_pg_temp(OSDMap& next, PGMap *pg_map)
 {
   dout(10) << __func__ << dendl;
+  utime_t stop = ceph_clock_now(NULL);
+  stop += g_conf->mon_osd_prime_pg_temp_max_time;
+  int n = 0;
   for (ceph::unordered_map<pg_t, pg_stat_t>::iterator pp = pg_map->pg_stat.begin();
        pp != pg_map->pg_stat.end();
        ++pp) {
     prime_pg_temp(next, pp);
+    if (++n == 1000) {
+      n = 0;
+      if (ceph_clock_now(NULL) > stop) {
+       dout(10) << __func__ << " consumed more than "
+                << g_conf->mon_osd_prime_pg_temp_max_time
+                << " seconds, stopping"
+                << dendl;
+       break;
+      }
+    }
   }
 }