rate-limiter: re-validate burst window in loop after sleep
Signed-off-by: NotAShelf <raf@notashelf.dev> Change-Id: Iaa63eef1f055b9a98c90739025bd3ff36a6a6964
This commit is contained in:
parent
255220b43c
commit
5a7762ac13
1 changed files with 21 additions and 24 deletions
|
|
@ -72,32 +72,29 @@ impl RateLimiter {
|
|||
|
||||
let interval = Duration::from_secs(60) / rate.max(1);
|
||||
|
||||
let mut inner = self.inner.lock().await;
|
||||
let now = Instant::now();
|
||||
let platform_requests =
|
||||
inner.requests.entry(platform.to_string()).or_default();
|
||||
loop {
|
||||
let mut inner = self.inner.lock().await;
|
||||
let now = Instant::now();
|
||||
let platform_requests =
|
||||
inner.requests.entry(platform.to_string()).or_default();
|
||||
|
||||
platform_requests
|
||||
.retain(|t| now.duration_since(*t) < Duration::from_secs(60));
|
||||
platform_requests
|
||||
.retain(|t| now.duration_since(*t) < Duration::from_secs(60));
|
||||
|
||||
if platform_requests.len() >= burst as usize
|
||||
&& let Some(oldest) = platform_requests.first()
|
||||
{
|
||||
let wait_time = interval.saturating_sub(now.duration_since(*oldest));
|
||||
if wait_time > Duration::ZERO {
|
||||
drop(inner);
|
||||
tokio::time::sleep(wait_time).await;
|
||||
let mut inner = self.inner.lock().await;
|
||||
let platform_requests =
|
||||
inner.requests.entry(platform.to_string()).or_default();
|
||||
platform_requests.push(Instant::now());
|
||||
return Ok(());
|
||||
if platform_requests.len() >= burst as usize
|
||||
&& let Some(oldest) = platform_requests.first()
|
||||
{
|
||||
let wait_time = interval.saturating_sub(now.duration_since(*oldest));
|
||||
if wait_time > Duration::ZERO {
|
||||
drop(inner);
|
||||
tokio::time::sleep(wait_time).await;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
platform_requests.push(Instant::now());
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
platform_requests.push(Instant::now());
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub async fn wait_for(&self, platform: &str) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue