ai_lib/rate_limiter/
backpressure.rs

1//! Backpressure control for managing concurrent requests
2
3use std::sync::Arc;
4use tokio::sync::Semaphore;
5
6/// Backpressure controller for managing concurrent requests
7pub struct BackpressureController {
8    max_concurrent_requests: usize,
9    semaphore: Arc<Semaphore>,
10}
11
12/// Permit for executing a request under backpressure control
13pub struct BackpressurePermit {
14    _permit: tokio::sync::OwnedSemaphorePermit,
15}
16
17impl BackpressureController {
18    /// Create a new backpressure controller
19    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    /// Acquire a permit for executing a request
27    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    /// Get the maximum number of concurrent requests
39    pub fn max_concurrent_requests(&self) -> usize {
40        self.max_concurrent_requests
41    }
42
43    /// Get the number of available permits
44    pub fn available_permits(&self) -> usize {
45        self.semaphore.available_permits()
46    }
47}
48
49/// Backpressure error types
50#[derive(Debug, thiserror::Error)]
51pub enum BackpressureError {
52    #[error("Semaphore is closed")]
53    SemaphoreClosed,
54    #[error("No permits available")]
55    NoPermitsAvailable,
56}