From 23231d462c74f9520433f93c22d3418774ebd2d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jagoda=20Estera=20=C5=9Al=C4=85zak?= <128227338+j-g00da@users.noreply.github.com> Date: Wed, 28 Jan 2026 17:47:48 +0100 Subject: [PATCH] feat: Configurable rate limiter max burst size (#28) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jagoda Ślązak --- filtermail/src/config.rs | 9 +++++++++ filtermail/src/outbound.rs | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/filtermail/src/config.rs b/filtermail/src/config.rs index 04ef6997..96f7f08e 100644 --- a/filtermail/src/config.rs +++ b/filtermail/src/config.rs @@ -17,7 +17,10 @@ pub struct Config { pub postfix_reinject_port_incoming: u16, #[serde(default = "Config::default_max_message_size")] pub max_message_size: usize, + #[serde(default = "Config::default_max_user_send_per_minute")] pub max_user_send_per_minute: NonZeroU32, + #[serde(default = "Config::default_max_user_send_burst_size")] + pub max_user_send_burst_size: NonZeroU32, #[serde(default, deserialize_with = "deserialize_sequence")] pub passthrough_senders: Vec, #[serde(default, deserialize_with = "deserialize_sequence")] @@ -94,4 +97,10 @@ impl Config { const fn default_max_message_size() -> usize { 31457280 } + const fn default_max_user_send_per_minute() -> NonZeroU32 { + NonZeroU32::new(60).expect("60 != 0") + } + const fn default_max_user_send_burst_size() -> NonZeroU32 { + NonZeroU32::new(10).expect("10 != 0") + } } diff --git a/filtermail/src/outbound.rs b/filtermail/src/outbound.rs index 907e9caf..37858c34 100644 --- a/filtermail/src/outbound.rs +++ b/filtermail/src/outbound.rs @@ -20,7 +20,8 @@ pub struct OutgoingBeforeQueueHandler { impl OutgoingBeforeQueueHandler { pub fn new(config: Config) -> Self { - let quota = Quota::per_minute(config.max_user_send_per_minute); + let quota = Quota::per_minute(config.max_user_send_per_minute) + .allow_burst(config.max_user_send_burst_size); Self { config: Arc::new(config), send_rate_limiter: RateLimiter::keyed(quota),