@@ -95,7 +95,16 @@ OSD::OSD(int id, uint32_t nonce,
9595 hb_front_msgr{hb_front_msgr},
9696 hb_back_msgr{hb_back_msgr},
9797 monc{new crimson::mon::Client{*public_msgr, *this }},
98- mgrc{new crimson::mgr::Client{*public_msgr, *this }},
98+ mgrc{new crimson::mgr::Client{
99+ *public_msgr,
100+ *this ,
101+ [this ](const ConfigPayload &config_payload) {
102+ return set_perf_queries (config_payload);
103+ },
104+ [this ] {
105+ return get_perf_reports ();
106+ }
107+ }},
99108 store{store},
100109 pg_shard_manager{osd_singleton_state,
101110 shard_services,
@@ -176,6 +185,70 @@ seastar::future<> OSD::open_meta_coll()
176185 });
177186}
178187
188+ seastar::future<> OSD::set_perf_queries (const ConfigPayload &config_payload) {
189+ LOG_PREFIX (OSD::set_perf_queries);
190+ const OSDConfigPayload &osd_config_payload =
191+ boost::get<OSDConfigPayload>(config_payload);
192+ const std::map<OSDPerfMetricQuery, OSDPerfMetricLimits> &queries =
193+ osd_config_payload.config ;
194+ DEBUG (" setting {} queries" , queries.size ());
195+
196+ std::list<OSDPerfMetricQuery> supported_queries;
197+ for (auto &it : queries) {
198+ auto &query = it.first ;
199+ if (!query.key_descriptor .empty ()) {
200+ supported_queries.push_back (query);
201+ }
202+ }
203+ if (supported_queries.size () < queries.size ()) {
204+ DEBUG (" {} unsupported queries" , queries.size () - supported_queries.size ());
205+ }
206+
207+ return shard_services.invoke_on_all (
208+ [supported_queries, queries](auto &local_service) {
209+ auto &pgs = local_service.local_state .pg_map .get_pgs ();
210+ local_service.local_state .m_perf_queries = supported_queries;
211+ local_service.local_state .m_perf_limits = queries;
212+ for (auto &[id, pg] : pgs) {
213+ pg->set_dynamic_perf_stats_queries (supported_queries);
214+ }
215+ });
216+ }
217+
218+ seastar::future<MetricPayload> OSD::get_perf_reports () {
219+ LOG_PREFIX (OSD::get_perf_reports);
220+ OSDMetricPayload payload;
221+ std::map<OSDPerfMetricQuery, OSDPerfMetricReport> &reports = payload.report ;
222+
223+ auto dps = co_await shard_services.map_reduce0 (
224+ [FNAME](auto &local_service) {
225+ auto &pgs = local_service.local_state .pg_map .get_pgs ();
226+ auto &m_perf_queries = local_service.local_state .m_perf_queries ;
227+ DynamicPerfStats dps;
228+ for (auto &[id, pg] : pgs) {
229+ // m_perf_queries can be modified only in set_perf_queries by mgr client
230+ // request, and it is protected by by mgr client's lock, which is held
231+ // when set_perf_queries/get_perf_reports are called, so we may not hold
232+ // m_perf_queries_lock here.
233+ DynamicPerfStats pg_dps (m_perf_queries);
234+ pg->get_dynamic_perf_stats (&pg_dps);
235+ dps.merge (pg_dps);
236+ DEBUG (" reporting for pg {}" , pg->get_pgid ());
237+ }
238+ return dps;
239+ },
240+ DynamicPerfStats (shard_services.local ().local_state .m_perf_queries ),
241+ [](auto left, auto right) {
242+ left.merge (right);
243+ return left;
244+ });
245+
246+ dps.add_to_reports (shard_services.local ().local_state .m_perf_limits , &reports);
247+ DEBUG (" reports for {} queries" , reports.size ());
248+
249+ co_return payload;
250+ }
251+
179252seastar::future<OSDMeta> OSD::open_or_create_meta_coll (FuturizedStore &store)
180253{
181254 return store.get_sharded_store ().open_collection (coll_t::meta ()).then ([&store](auto ch) {
0 commit comments