@@ -594,11 +594,18 @@ class TAcquireRateLimiterResourceRPC : public TRateLimiterRequest<TAcquireRateLi
594
594
SendRequest ();
595
595
}
596
596
597
+ // Always race when "cancel after" time is not set.
598
+ // If "cancel after" is not set, quoter service can spend resource and say "OK", but we here reply with TIMEOUT.
597
599
void OnOperationTimeout (const TActorContext& ctx) {
598
600
Send (MakeQuoterServiceID (), new TEvQuota::TEvRpcTimeout (GetProtoRequest ()->coordination_node_path (), GetProtoRequest ()->resource_path ()), 0 , 0 );
599
601
TBase::OnOperationTimeout (ctx);
600
602
}
601
603
604
+ // Do nothing here, because quoter service replies after "cancel after" time passes.
605
+ void OnCancelOperation (const TActorContext& ctx) {
606
+ Y_UNUSED (ctx);
607
+ }
608
+
602
609
STFUNC (StateFunc) {
603
610
switch (ev->GetTypeRewrite ()) {
604
611
hFunc (TEvQuota::TEvClearance, Handle );
@@ -637,22 +644,37 @@ class TAcquireRateLimiterResourceRPC : public TRateLimiterRequest<TAcquireRateLi
637
644
true ));
638
645
}
639
646
647
+ StatusIds::StatusCode QuoterDeadlineStatusCode () {
648
+ if (const TDuration cancelAfter = GetCancelAfter (); cancelAfter && cancelAfter < GetOperationTimeout ()) {
649
+ return StatusIds::CANCELLED;
650
+ }
651
+ return StatusIds::TIMEOUT;
652
+ }
653
+
640
654
void SendLeaf (const TEvQuota::TResourceLeaf& leaf) {
655
+ TDuration deadline = GetOperationTimeout ();
656
+ // CancelAfter is an intelligent way to say quoter service that we can wait maximum time.
657
+ // After that time quoter service sends EResult::Deadline.
658
+ // It says that the system lacks the resource.
659
+ if (const TDuration cancelAfter = GetCancelAfter (); cancelAfter && cancelAfter < deadline) {
660
+ deadline = cancelAfter;
661
+ }
662
+
641
663
Send (MakeQuoterServiceID (),
642
- new TEvQuota::TEvRequest (TEvQuota::EResourceOperator::And, { leaf }, GetOperationTimeout () ), 0 , 0 );
664
+ new TEvQuota::TEvRequest (TEvQuota::EResourceOperator::And, { leaf }, deadline ), 0 , 0 );
643
665
}
644
666
645
667
void Handle (TEvQuota::TEvClearance::TPtr& ev) {
646
668
switch (ev->Get ()->Result ) {
647
669
case TEvQuota::TEvClearance::EResult::Success:
648
670
Reply (StatusIds::SUCCESS, TActivationContext::AsActorContext ());
649
- break ;
671
+ break ;
650
672
case TEvQuota::TEvClearance::EResult::UnknownResource:
651
673
Reply (StatusIds::BAD_REQUEST, TActivationContext::AsActorContext ());
652
- break ;
674
+ break ;
653
675
case TEvQuota::TEvClearance::EResult::Deadline:
654
- Reply (StatusIds::TIMEOUT , TActivationContext::AsActorContext ());
655
- break ;
676
+ Reply (QuoterDeadlineStatusCode () , TActivationContext::AsActorContext ());
677
+ break ;
656
678
default :
657
679
Reply (StatusIds::INTERNAL_ERROR, TActivationContext::AsActorContext ());
658
680
}
0 commit comments