From: Mykola Golub Date: Wed, 14 Nov 2018 07:28:10 +0000 (+0200) Subject: osd: fixup to recently added dynamic perf stats X-Git-Tag: v14.1.0~843^2~3 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=10dba8a6d6b9b19cf85e9d1fb11818ed076023a1;p=ceph-ci.git osd: fixup to recently added dynamic perf stats Signed-off-by: Mykola Golub --- diff --git a/src/osd/DynamicPerfStats.h b/src/osd/DynamicPerfStats.h index 45259083736..dddfb69ee87 100644 --- a/src/osd/DynamicPerfStats.h +++ b/src/osd/DynamicPerfStats.h @@ -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 &queries) { std::map> new_data; diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 88b84fe5a26..9b3a7a36104 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -9813,12 +9813,18 @@ void OSD::get_perf_reports( std::map *reports) { std::vector 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);