@@ -192,11 +192,23 @@ class TCreateQueryRequestActor :
192
192
TEvControlPlaneStorage::TEvCreateQueryResponse,
193
193
TEvControlPlaneProxy::TEvCreateQueryRequest,
194
194
TEvControlPlaneProxy::TEvCreateQueryResponse>;
195
- using TBaseRequestActor::TBaseRequestActor;
195
+
196
+ TCreateQueryRequestActor (typename TEvControlPlaneProxy::TEvCreateQueryRequest::TPtr requestProxy,
197
+ const TControlPlaneProxyConfig& config,
198
+ const TActorId& serviceId,
199
+ const TRequestCounters& counters,
200
+ const TRequestCommonCountersPtr& rateLimiterCounters,
201
+ const std::function<void (const TDuration&, bool , bool )>& probe,
202
+ const TPermissions& availablePermissions,
203
+ bool replyWithResponseOnSuccess = true )
204
+ : TBaseRequestActor(requestProxy, config, serviceId, counters, probe, availablePermissions, replyWithResponseOnSuccess)
205
+ , RateLimiterCounters(rateLimiterCounters) {
206
+ }
196
207
197
208
STFUNC (StateFunc) {
198
209
switch (ev->GetTypeRewrite ()) {
199
210
hFunc (TEvRateLimiter::TEvCreateResourceResponse, Handle);
211
+ cFunc (NActors::TEvents::TSystem::Wakeup, HandleTimeout);
200
212
default :
201
213
return TBaseRequestActor::StateFunc (ev);
202
214
}
@@ -208,6 +220,16 @@ class TCreateQueryRequestActor :
208
220
|| !Config.ComputeConfig .YdbComputeControlPlaneEnabled (RequestProxy->Get ()->Scope ));
209
221
}
210
222
223
+ void HandleTimeout () {
224
+ // Don't need to set the RateLimiterCreationInProgress = false
225
+ // because of the PassAway will be called in this callback
226
+ if (RateLimiterCreationInProgress) {
227
+ RateLimiterCounters->Timeout ->Inc ();
228
+ RateLimiterCounters->InFly ->Dec ();
229
+ }
230
+ TBaseRequestActor::HandleTimeout ();
231
+ }
232
+
211
233
void OnBootstrap () override {
212
234
this ->UnsafeBecome (&TCreateQueryRequestActor::StateFunc);
213
235
if (ShouldCreateRateLimiter ()) {
@@ -223,9 +245,13 @@ class TCreateQueryRequestActor :
223
245
10 ); // percent -> milliseconds
224
246
CPP_LOG_T (" Create rate limiter resource for cloud with limit " << cloudLimit
225
247
<< " ms" );
248
+ RateLimiterCreationInProgress = true ;
249
+ RateLimiterCounters->InFly ->Inc ();
250
+ StartRateLimiterCreation = TInstant::Now ();
226
251
Send (RateLimiterControlPlaneServiceId (),
227
252
new TEvRateLimiter::TEvCreateResource (RequestProxy->Get ()->CloudId , cloudLimit));
228
253
} else {
254
+ RateLimiterCounters->Error ->Inc ();
229
255
NYql::TIssues issues;
230
256
NYql::TIssue issue =
231
257
MakeErrorIssue (TIssuesIds::INTERNAL_ERROR,
@@ -238,12 +264,17 @@ class TCreateQueryRequestActor :
238
264
}
239
265
240
266
void Handle (TEvRateLimiter::TEvCreateResourceResponse::TPtr& ev) {
267
+ RateLimiterCreationInProgress = false ;
268
+ RateLimiterCounters->InFly ->Dec ();
269
+ RateLimiterCounters->LatencyMs ->Collect ((TInstant::Now () - StartRateLimiterCreation).MilliSeconds ());
241
270
CPP_LOG_D (
242
271
" Create response from rate limiter service. Success: " << ev->Get ()->Success );
243
272
if (ev->Get ()->Success ) {
273
+ RateLimiterCounters->Ok ->Inc ();
244
274
QuoterResourceCreated = true ;
245
275
SendRequestIfCan ();
246
276
} else {
277
+ RateLimiterCounters->Error ->Inc ();
247
278
NYql::TIssue issue (" Failed to create rate limiter resource" );
248
279
for (const NYql::TIssue& i : ev->Get ()->Issues ) {
249
280
issue.AddSubIssue (MakeIntrusive<NYql::TIssue>(i));
@@ -257,6 +288,11 @@ class TCreateQueryRequestActor :
257
288
bool CanSendRequest () const override {
258
289
return (QuoterResourceCreated || !ShouldCreateRateLimiter ()) && TBaseRequestActor::CanSendRequest ();
259
290
}
291
+
292
+ private:
293
+ TInstant StartRateLimiterCreation;
294
+ bool RateLimiterCreationInProgress = false ;
295
+ TRequestCommonCountersPtr RateLimiterCounters;
260
296
};
261
297
262
298
} // namespace NFq::NPrivate
0 commit comments