2020#include " utils/weak_macro.hpp"
2121
2222namespace kagome ::parachain {
23+ constexpr auto kMetricQueueSize = " kagome_pvf_queue_size" ;
24+
2325 struct AsyncPipe : boost::process::async_pipe {
2426 using async_pipe::async_pipe;
2527 using lowest_layer_type = AsyncPipe;
@@ -133,13 +135,26 @@ namespace kagome::parachain {
133135 .cache_dir = app_config.runtimeCacheDirPath (),
134136 .log_params = app_config.log (),
135137 .force_disable_secure_mode = app_config.disableSecureMode (),
136- } {}
138+ } {
139+ metrics_registry_->registerGaugeFamily (kMetricQueueSize , " pvf queue size" );
140+ std::unordered_map<PvfExecTimeoutKind, std::string> kind_name{
141+ {PvfExecTimeoutKind::Approval, " Approval" },
142+ {PvfExecTimeoutKind::Backing, " Backing" },
143+ };
144+ for (auto &[kind, name] : kind_name) {
145+ metric_queue_size_.emplace (kind,
146+ metrics_registry_->registerGaugeMetric (
147+ kMetricQueueSize , {{" kind" , name}}));
148+ }
149+ }
137150
138151 void PvfWorkers::execute (Job &&job) {
139152 REINVOKE (*main_pool_handler_, execute, std::move (job));
140153 if (free_.empty ()) {
141154 if (used_ >= max_) {
142- queue_.emplace (std::move (job));
155+ auto &queue = queues_[job.kind ];
156+ queue.emplace_back (std::move (job));
157+ metric_queue_size_.at (job.kind )->set (queue.size ());
143158 return ;
144159 }
145160 auto used = std::make_shared<Used>(*this );
@@ -157,10 +172,9 @@ namespace kagome::parachain {
157172 if (not r) {
158173 return job.cb (r.error ());
159174 }
160- self->writeCode (
161- std::move (job),
162- {.process = std::move (process)},
163- std::move (used));
175+ self->writeCode (std::move (job),
176+ {.process = std::move (process)},
177+ std::move (used));
164178 });
165179 return ;
166180 }
@@ -244,11 +258,16 @@ namespace kagome::parachain {
244258 }
245259
246260 void PvfWorkers::dequeue () {
247- if (queue_.empty ()) {
248- return ;
261+ for (auto &kind :
262+ {PvfExecTimeoutKind::Approval, PvfExecTimeoutKind::Backing}) {
263+ auto &queue = queues_[kind];
264+ if (queue.empty ()) {
265+ continue ;
266+ }
267+ auto job = std::move (queue.front ());
268+ queue.pop_front ();
269+ metric_queue_size_.at (kind)->set (queue.size ());
270+ findFree (std::move (job));
249271 }
250- auto job = std::move (queue_.front ());
251- queue_.pop ();
252- findFree (std::move (job));
253272 }
254273} // namespace kagome::parachain
0 commit comments