]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: only update the requesting metrics
authorXiubo Li <xiubli@redhat.com>
Fri, 27 Dec 2019 02:10:05 +0000 (21:10 -0500)
committerXiubo Li <xiubli@redhat.com>
Mon, 19 Oct 2020 03:40:33 +0000 (23:40 -0400)
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 <xiubli@redhat.com>
src/mds/MDSPerfMetricTypes.h
src/mds/MetricAggregator.cc
src/mds/MetricsHandler.cc

index 8ae2f550657151b2e6335ef6e8c764bcea4c168f..c92e41e04044228000884041b163e693f99152be 100644 (file)
@@ -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);
   }
 
index 03e06db64998ac27451b554fcecfafe349ac3a4b..fc5e1d6ed8b9ed7d9d2e5fefd710010c0d204961 100644 (file)
@@ -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");
index e63b6aca092ed233378ade75897066666a363768..6ce76cc23a9b788e4b577f20058c3663a63d017f 100644 (file)
@@ -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) {