ai_lib/rate_limiter/
backpressure.rs1use std::sync::Arc;
4use tokio::sync::Semaphore;
5
6pub struct BackpressureController {
8 max_concurrent_requests: usize,
9 semaphore: Arc<Semaphore>,
10}
11
12pub struct BackpressurePermit {
14 _permit: tokio::sync::OwnedSemaphorePermit,
15}
16
17impl BackpressureController {
18 pub fn new(max_concurrent_requests: usize) -> Self {
20 Self {
21 max_concurrent_requests,
22 semaphore: Arc::new(Semaphore::new(max_concurrent_requests)),
23 }
24 }
25
26 pub async fn acquire_permit(&self) -> Result<BackpressurePermit, BackpressureError> {
28 let permit = self
29 .semaphore
30 .clone()
31 .acquire_owned()
32 .await
33 .map_err(|_| BackpressureError::SemaphoreClosed)?;
34
35 Ok(BackpressurePermit { _permit: permit })
36 }
37
38 pub fn max_concurrent_requests(&self) -> usize {
40 self.max_concurrent_requests
41 }
42
43 pub fn available_permits(&self) -> usize {
45 self.semaphore.available_permits()
46 }
47}
48
49#[derive(Debug, thiserror::Error)]
51pub enum BackpressureError {
52 #[error("Semaphore is closed")]
53 SemaphoreClosed,
54 #[error("No permits available")]
55 NoPermitsAvailable,
56}