OPTION(mon_osd_down_out_subtree_limit, OPT_STR, "rack") // largest crush unit/type that we will automatically mark out
OPTION(mon_osd_min_up_ratio, OPT_DOUBLE, .3) // min osds required to be up to mark things down
OPTION(mon_osd_min_in_ratio, OPT_DOUBLE, .3) // min osds required to be in to mark things out
+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
OPTION(mon_lease_ack_timeout, OPT_FLOAT, 10.0) // on leader, if lease isn't acked by all peons
// --
-void PGMap::apply_incremental(const Incremental& inc)
+void PGMap::apply_incremental(CephContext *cct, const Incremental& inc)
{
assert(inc.version == version+1);
version++;
- stamp_delta = inc.stamp;
- stamp_delta -= stamp;
+ utime_t delta_t;
+ delta_t = inc.stamp;
+ delta_t -= stamp;
stamp = inc.stamp;
pool_stat_t pg_sum_old = pg_sum;
full_osds.erase(*p);
}
- pg_sum_delta = pg_sum;
- pg_sum_delta.stats.sub(pg_sum_old.stats);
+ // calculate a delta, and average over the last 2 deltas.
+ pool_stat_t d = pg_sum;
+ d.stats.sub(pg_sum_old.stats);
+ pg_sum_deltas.push_back(make_pair(d, delta_t));
+ stamp_delta += delta_t;
+
+ pg_sum_delta.stats.add(d.stats);
+ if (pg_sum_deltas.size() > MIN(1, cct ? cct->_conf->mon_stat_smooth_intervals : 1)) {
+ pg_sum_delta.stats.sub(pg_sum_deltas.front().first.stats);
+ stamp_delta -= pg_sum_deltas.front().second;
+ pg_sum_deltas.pop_front();
+ }
if (inc.osdmap_epoch)
last_osdmap_epoch = inc.osdmap_epoch;
Incremental::generate_test_instances(inc);
inc.pop_front();
while (!inc.empty()) {
- o.back()->apply_incremental(*inc.front());
+ o.back()->apply_incremental(NULL, *inc.front());
delete inc.front();
inc.pop_front();
}
utime_t stamp;
- // delta since the previous map
+ // recent deltas, and summation
+ list< pair<pool_stat_t, utime_t> > pg_sum_deltas;
pool_stat_t pg_sum_delta;
utime_t stamp_delta;
num_osd(0)
{}
- void apply_incremental(const Incremental& inc);
+ void apply_incremental(CephContext *cct, const Incremental& inc);
void redo_full_sets();
void register_nearfull_status(int osd, const osd_stat_t& s);
void calc_stats();
return;
}
- pg_map.apply_incremental(inc);
+ pg_map.apply_incremental(g_ceph_context, inc);
dout(10) << pg_map << dendl;