From 7288dddbfeb1a0cb680c10544d0ea4d388eac5db Mon Sep 17 00:00:00 2001 From: Xiubo Li Date: Thu, 26 Dec 2019 21:10:05 -0500 Subject: [PATCH] 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 --- src/mds/MDSPerfMetricTypes.h | 15 ++++++++++++--- src/mds/MetricAggregator.cc | 18 ++++++++++++------ src/mds/MetricsHandler.cc | 3 +++ 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/mds/MDSPerfMetricTypes.h b/src/mds/MDSPerfMetricTypes.h index 8ae2f55065715..c92e41e040442 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 03e06db64998a..fc5e1d6ed8b9e 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 e63b6aca092ed..6ce76cc23a9b7 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) { -- 2.39.5