use std::time::Duration;
use serde::{Deserialize, Serialize};
use super::selective::SelectiveColumnConfig;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SubscriptionConfig {
#[serde(default = "default_max_per_connection")]
pub max_per_connection: usize,
#[serde(default = "default_max_global")]
pub max_global: usize,
#[serde(default = "default_max_result_rows")]
pub max_result_rows: usize,
#[serde(default = "default_rate_limit_per_second")]
pub rate_limit_per_second: u32,
#[serde(default = "default_channel_buffer_size")]
pub channel_buffer_size: usize,
#[serde(default = "default_slow_consumer_threshold_percent")]
pub slow_consumer_threshold_percent: u8,
#[serde(default)]
pub selective_updates: SelectiveColumnConfig,
}
fn default_max_per_connection() -> usize {
100
}
fn default_max_global() -> usize {
10_000
}
fn default_max_result_rows() -> usize {
10_000
}
fn default_rate_limit_per_second() -> u32 {
10
}
fn default_channel_buffer_size() -> usize {
64
}
fn default_slow_consumer_threshold_percent() -> u8 {
80
}
impl Default for SubscriptionConfig {
fn default() -> Self {
Self {
max_per_connection: default_max_per_connection(),
max_global: default_max_global(),
max_result_rows: default_max_result_rows(),
rate_limit_per_second: default_rate_limit_per_second(),
channel_buffer_size: default_channel_buffer_size(),
slow_consumer_threshold_percent: default_slow_consumer_threshold_percent(),
selective_updates: SelectiveColumnConfig::default(),
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct SubscriptionRetryPolicy {
pub max_retries: u32,
pub base_delay_ms: u64,
pub max_delay_ms: u64,
pub backoff_multiplier: f64,
}
impl Default for SubscriptionRetryPolicy {
fn default() -> Self {
Self { max_retries: 3, base_delay_ms: 1000, max_delay_ms: 30000, backoff_multiplier: 2.0 }
}
}
impl SubscriptionRetryPolicy {
pub(crate) fn calculate_backoff(&self, attempt: u32) -> Duration {
let backoff_ms = self.base_delay_ms as f64 * self.backoff_multiplier.powi(attempt as i32);
let capped_ms = backoff_ms.min(self.max_delay_ms as f64);
Duration::from_millis(capped_ms as u64)
}
}