From: Xiubo Li Date: Fri, 27 Dec 2019 02:10:05 +0000 (-0500) Subject: mds: only update the requesting metrics X-Git-Tag: v16.1.0~686^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7288dddbfeb1a0cb680c10544d0ea4d388eac5db;p=ceph.git mds: only update the requesting metrics Currently for the MDSs without global metrics needed to be refreshed, the global metric counters will be zero and then after update_rank0, the previous counters in aggregator will be reset. Fixes: https://tracker.ceph.com/issues/47844 Signed-off-by: Xiubo Li --- diff --git a/src/mds/MDSPerfMetricTypes.h b/src/mds/MDSPerfMetricTypes.h index 8ae2f5506571..c92e41e04044 100644 --- a/src/mds/MDSPerfMetricTypes.h +++ b/src/mds/MDSPerfMetricTypes.h @@ -39,10 +39,13 @@ struct CapHitMetric { struct ReadLatencyMetric { utime_t lat; + bool updated = false; DENC(ReadLatencyMetric, v, p) { - DENC_START(1, 1, p); + DENC_START(2, 1, p); denc(v.lat, p); + if (struct_v >= 2) + denc(v.updated, p); DENC_FINISH(p); } @@ -58,10 +61,13 @@ struct ReadLatencyMetric { struct WriteLatencyMetric { utime_t lat; + bool updated = false; DENC(WriteLatencyMetric, v, p) { - DENC_START(1, 1, p); + DENC_START(2, 1, p); denc(v.lat, p); + if (struct_v >= 2) + denc(v.updated, p); DENC_FINISH(p); } @@ -77,10 +83,13 @@ struct WriteLatencyMetric { struct MetadataLatencyMetric { utime_t lat; + bool updated = false; DENC(MetadataLatencyMetric, v, p) { - DENC_START(1, 1, p); + DENC_START(2, 1, p); denc(v.lat, p); + if (struct_v >= 2) + denc(v.updated, p); DENC_FINISH(p); } diff --git a/src/mds/MetricAggregator.cc b/src/mds/MetricAggregator.cc index 03e06db64998..fc5e1d6ed8b9 100644 --- a/src/mds/MetricAggregator.cc +++ b/src/mds/MetricAggregator.cc @@ -111,16 +111,22 @@ void MetricAggregator::refresh_metrics_for_rank(const entity_inst_t &client, c->second = metrics.cap_hit_metric.misses; break; case MDSPerformanceCounterType::READ_LATENCY_METRIC: - c->first = metrics.read_latency_metric.lat.tv.tv_sec; - c->second = metrics.read_latency_metric.lat.tv.tv_nsec; + if (metrics.read_latency_metric.updated) { + c->first = metrics.read_latency_metric.lat.tv.tv_sec; + c->second = metrics.read_latency_metric.lat.tv.tv_nsec; + } break; case MDSPerformanceCounterType::WRITE_LATENCY_METRIC: - c->first = metrics.write_latency_metric.lat.tv.tv_sec; - c->second = metrics.write_latency_metric.lat.tv.tv_nsec; + if (metrics.write_latency_metric.updated) { + c->first = metrics.write_latency_metric.lat.tv.tv_sec; + c->second = metrics.write_latency_metric.lat.tv.tv_nsec; + } break; case MDSPerformanceCounterType::METADATA_LATENCY_METRIC: - c->first = metrics.metadata_latency_metric.lat.tv.tv_sec; - c->second = metrics.metadata_latency_metric.lat.tv.tv_nsec; + if (metrics.metadata_latency_metric.updated) { + c->first = metrics.metadata_latency_metric.lat.tv.tv_sec; + c->second = metrics.metadata_latency_metric.lat.tv.tv_nsec; + } break; default: ceph_abort_msg("unknown counter type"); diff --git a/src/mds/MetricsHandler.cc b/src/mds/MetricsHandler.cc index e63b6aca092e..6ce76cc23a9b 100644 --- a/src/mds/MetricsHandler.cc +++ b/src/mds/MetricsHandler.cc @@ -165,6 +165,7 @@ void MetricsHandler::handle_payload(Session *session, const ReadLatencyPayload & auto &metrics = it->second.second; metrics.update_type = UPDATE_TYPE_REFRESH; metrics.read_latency_metric.lat = payload.lat; + metrics.read_latency_metric.updated = true; } void MetricsHandler::handle_payload(Session *session, const WriteLatencyPayload &payload) { @@ -178,6 +179,7 @@ void MetricsHandler::handle_payload(Session *session, const WriteLatencyPayload auto &metrics = it->second.second; metrics.update_type = UPDATE_TYPE_REFRESH; metrics.write_latency_metric.lat = payload.lat; + metrics.write_latency_metric.updated = true; } void MetricsHandler::handle_payload(Session *session, const MetadataLatencyPayload &payload) { @@ -191,6 +193,7 @@ void MetricsHandler::handle_payload(Session *session, const MetadataLatencyPaylo auto &metrics = it->second.second; metrics.update_type = UPDATE_TYPE_REFRESH; metrics.metadata_latency_metric.lat = payload.lat; + metrics.metadata_latency_metric.updated = true; } void MetricsHandler::handle_payload(Session *session, const UnknownPayload &payload) {