From: Aleksei Gutikov Date: Mon, 16 Oct 2017 14:31:12 +0000 (+0300) Subject: mgr: skip first non-zero incremental in PGMap::apply_incremental() X-Git-Tag: v13.0.1~328^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=013a3803c931ac2e5c390dcd209e1dd0a58418b9;p=ceph-ci.git mgr: skip first non-zero incremental in PGMap::apply_incremental() After initialization of PGMap instance PGMap::stamp is zero and this cause huge first delta. Also after mgr restart first non-zero value coming to PGMap::apply_incremental() is current pg_sum value so it produces unreasonably huge pg_sum_delta. This patch introduces a workaround to save pg_sum and not update pg_sum_delta by first non-zero incremental. Signed-off-by: Aleksei Gutikov Fixes: http://tracker.ceph.com/issues/21773 --- diff --git a/src/mon/PGMap.cc b/src/mon/PGMap.cc index cd4f956016c..5045337a5e7 100644 --- a/src/mon/PGMap.cc +++ b/src/mon/PGMap.cc @@ -1021,11 +1021,6 @@ void PGMap::apply_incremental(CephContext *cct, const Incremental& inc) assert(inc.version == version+1); version++; - utime_t delta_t; - delta_t = inc.stamp; - delta_t -= stamp; - stamp = inc.stamp; - pool_stat_t pg_sum_old = pg_sum; mempool::pgmap::unordered_map pg_pool_sum_old; @@ -1085,20 +1080,26 @@ void PGMap::apply_incremental(CephContext *cct, const Incremental& inc) } } - // 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); - auto smooth_intervals = - cct ? cct->_conf->get_val("mon_stat_smooth_intervals") : 1; - if (pg_sum_deltas.size() > smooth_intervals) { - pg_sum_delta.stats.sub(pg_sum_deltas.front().first.stats); - stamp_delta -= pg_sum_deltas.front().second; - pg_sum_deltas.pop_front(); + // skip calculating delta while sum was not synchronized + if (!stamp.is_zero() && !pg_sum_old.stats.sum.is_zero()) { + utime_t delta_t; + delta_t = inc.stamp; + delta_t -= stamp; + // 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); + auto smooth_intervals = + cct ? cct->_conf->get_val("mon_stat_smooth_intervals") : 1; + if (pg_sum_deltas.size() > smooth_intervals) { + pg_sum_delta.stats.sub(pg_sum_deltas.front().first.stats); + stamp_delta -= pg_sum_deltas.front().second; + pg_sum_deltas.pop_front(); + } } + stamp = inc.stamp; update_pool_deltas(cct, inc.stamp, pg_pool_sum_old); @@ -1897,13 +1898,16 @@ void PGMap::update_delta( */ pool_stat_t d = current_pool_sum; d.stats.sub(old_pool_sum.stats); - delta_avg_list->push_back(make_pair(d,delta_t)); - *result_ts_delta += delta_t; /* Aggregate current delta, and take out the last seen delta (if any) to * average it out. + * Skip calculating delta while sum was not synchronized. */ - result_pool_delta->stats.add(d.stats); + if(!old_pool_sum.stats.sum.is_zero()) { + delta_avg_list->push_back(make_pair(d,delta_t)); + *result_ts_delta += delta_t; + result_pool_delta->stats.add(d.stats); + } size_t s = cct ? cct->_conf->get_val("mon_stat_smooth_intervals") : 1; if (delta_avg_list->size() > s) { result_pool_delta->stats.sub(delta_avg_list->front().first.stats);