velesdb_server/
rate_limit.rs1use std::sync::Arc;
9use std::time::Duration;
10use tower_governor::governor::{GovernorConfig, GovernorConfigBuilder};
11use tower_governor::key_extractor::SmartIpKeyExtractor;
12
13pub use tower_governor::GovernorLayer;
15
16type HeaderMiddleware = ::governor::middleware::StateInformationMiddleware;
18
19pub type RateLimitConfig = GovernorConfig<SmartIpKeyExtractor, HeaderMiddleware>;
21
22pub fn build_rate_limit_config(burst: u32) -> anyhow::Result<Arc<RateLimitConfig>> {
35 let mut builder = GovernorConfigBuilder::default();
36 builder.per_second(u64::from(burst));
37 builder.burst_size(burst);
38 let mut builder = builder.key_extractor(SmartIpKeyExtractor);
39 let mut builder = builder.use_headers();
40
41 let config = Arc::new(
42 builder
43 .finish()
44 .ok_or_else(|| anyhow::anyhow!("failed to build rate limiter configuration"))?,
45 );
46
47 spawn_limiter_cleanup(&config);
48
49 Ok(config)
50}
51
52fn spawn_limiter_cleanup(config: &Arc<RateLimitConfig>) {
54 let limiter = config.limiter().clone();
55 let interval = Duration::from_secs(60);
56 std::thread::spawn(move || loop {
57 std::thread::sleep(interval);
58 tracing::debug!("rate limiter cleanup: {} tracked IPs", limiter.len());
59 limiter.retain_recent();
60 });
61}
62
63#[cfg(test)]
64#[path = "rate_limit_tests.rs"]
65mod tests;