}
}
+ 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;
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);