]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: fixup to recently added dynamic perf stats
authorMykola Golub <mgolub@suse.com>
Wed, 14 Nov 2018 07:28:10 +0000 (09:28 +0200)
committerMykola Golub <mgolub@suse.com>
Tue, 20 Nov 2018 11:18:30 +0000 (13:18 +0200)
Signed-off-by: Mykola Golub <mgolub@suse.com>
src/osd/DynamicPerfStats.h
src/osd/OSD.cc

index 45259083736b40b34dc02909f927160f7c686f6e..dddfb69ee87cbe446675ee1f7a872590604e8510 100644 (file)
@@ -19,6 +19,26 @@ public:
     }
   }
 
+  void merge(const DynamicPerfStats &dps) {
+    for (auto &query_it : dps.data) {
+      auto &query = query_it.first;
+      for (auto &key_it : query_it.second) {
+        auto &key = key_it.first;
+        auto counter_it = key_it.second.begin();
+        auto update_counter_fnc =
+            [&counter_it](const PerformanceCounterDescriptor &d,
+                          PerformanceCounter *c) {
+              c->first  += counter_it->first;
+              c->second += counter_it->second;
+              counter_it++;
+            };
+
+        ceph_assert(key_it.second.size() >= data[query][key].size());
+        query.update_counters(update_counter_fnc, &data[query][key]);
+      }
+    }
+  }
+
   void set_queries(const std::list<OSDPerfMetricQuery> &queries) {
     std::map<OSDPerfMetricQuery,
              std::map<OSDPerfMetricKey, PerformanceCounters>> new_data;
index 88b84fe5a26a7f0f295af4fa3cfdaf85908ac233..9b3a7a36104066f16766c0a729f1ef1cb6cee58b 100644 (file)
@@ -9813,12 +9813,18 @@ void OSD::get_perf_reports(
     std::map<OSDPerfMetricQuery, OSDPerfMetricReport> *reports) {
   std::vector<PGRef> pgs;
   _get_pgs(&pgs);
-  DynamicPerfStats dps(m_perf_queries);
+  DynamicPerfStats dps;
   for (auto& pg : pgs) {
     if (pg->is_primary()) {
+      // m_perf_queries can be modified only in set_perf_queries by mgr client
+      // request, and it is protected by by mgr client's lock, which is held
+      // when set_perf_queries/get_perf_reports are called, so we may not hold
+      // m_perf_queries_lock here.
+      DynamicPerfStats pg_dps(m_perf_queries);
       pg->lock();
-      pg->get_dynamic_perf_stats(&dps);
+      pg->get_dynamic_perf_stats(&pg_dps);
       pg->unlock();
+      dps.merge(pg_dps);
     }
   }
   dps.add_to_reports(reports);