From: Sage Weil Date: Wed, 21 Jan 2015 02:42:52 +0000 (-0800) Subject: mon: cap the amount of time we spend priming pg_temp X-Git-Tag: v9.0.1~34^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f6fa254cda19df8f2539d27ab5d5c03d8a11d9b8;p=ceph.git mon: cap the amount of time we spend priming pg_temp Default to 500ms, which should be enough for most clusters and not very disruptive. Signed-off-by: Sage Weil --- diff --git a/src/common/config_opts.h b/src/common/config_opts.h index 46396fa91284..0410b57a8939 100644 --- a/src/common/config_opts.h +++ b/src/common/config_opts.h @@ -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 diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index b43511aa89d7..429047628e9e 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -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::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::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; + } + } } }