use std::time::Duration;
use crate::ids::ContainerId;
use crate::types::definitions::{ReceiverSettleMode, SenderSettleMode};
#[derive(Debug, Clone)]
pub struct ConnectionConfig {
pub container_id: ContainerId,
pub hostname: Option<String>,
pub max_frame_size: u32,
pub channel_max: u16,
pub idle_timeout: Option<Duration>,
pub command_buffer: usize,
pub reconnect: ReconnectConfig,
}
impl Default for ConnectionConfig {
fn default() -> Self {
ConnectionConfig {
container_id: ContainerId::generate(),
hostname: None,
max_frame_size: 128 * 1024,
channel_max: 1024,
idle_timeout: Some(Duration::from_secs(60)),
command_buffer: 1024,
reconnect: ReconnectConfig::default(),
}
}
}
#[derive(Debug, Clone)]
pub struct ReconnectConfig {
pub enabled: bool,
pub max_retries: Option<u32>,
pub initial_backoff: Duration,
pub max_backoff: Duration,
pub multiplier: f64,
pub jitter: f64,
}
impl Default for ReconnectConfig {
fn default() -> Self {
ReconnectConfig {
enabled: true,
max_retries: None,
initial_backoff: Duration::from_millis(100),
max_backoff: Duration::from_secs(30),
multiplier: 2.0,
jitter: 0.3,
}
}
}
#[derive(Debug, Clone, Copy)]
pub struct SessionConfig {
pub incoming_window: u32,
pub outgoing_window: u32,
pub handle_max: u32,
}
impl Default for SessionConfig {
fn default() -> Self {
SessionConfig {
incoming_window: 2048,
outgoing_window: 2048,
handle_max: 1024,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CreditMode {
Manual,
Auto {
initial: u32,
refill_threshold: u32,
},
}
#[derive(Debug, Clone, Copy)]
pub struct LinkConfig {
pub credit_mode: CreditMode,
pub sender_settle_mode: SenderSettleMode,
pub receiver_settle_mode: ReceiverSettleMode,
pub max_message_size: Option<u64>,
pub max_outbox: usize,
}
impl Default for LinkConfig {
fn default() -> Self {
LinkConfig {
credit_mode: CreditMode::Auto {
initial: 1000,
refill_threshold: 500,
},
sender_settle_mode: SenderSettleMode::Mixed,
receiver_settle_mode: ReceiverSettleMode::First,
max_message_size: None,
max_outbox: 8192,
}
}
}
#[derive(Debug, Clone, Default)]
pub struct Config {
pub connection: ConnectionConfig,
pub session: SessionConfig,
pub link: LinkConfig,
}
impl Config {
pub fn low_latency() -> Self {
Config {
connection: ConnectionConfig {
max_frame_size: 64 * 1024,
command_buffer: 256,
idle_timeout: Some(Duration::from_secs(30)),
..ConnectionConfig::default()
},
session: SessionConfig {
incoming_window: 256,
outgoing_window: 256,
handle_max: 256,
},
link: LinkConfig {
credit_mode: CreditMode::Auto {
initial: 100,
refill_threshold: 50,
},
max_outbox: 1024,
..LinkConfig::default()
},
}
}
pub fn high_throughput() -> Self {
Config {
connection: ConnectionConfig {
max_frame_size: 1024 * 1024,
command_buffer: 8192,
idle_timeout: Some(Duration::from_secs(120)),
..ConnectionConfig::default()
},
session: SessionConfig {
incoming_window: 65_535,
outgoing_window: 65_535,
handle_max: 4096,
},
link: LinkConfig {
credit_mode: CreditMode::Auto {
initial: 10_000,
refill_threshold: 5_000,
},
max_outbox: 65_536,
..LinkConfig::default()
},
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn presets_differ_and_are_sane() {
let ll = Config::low_latency();
let ht = Config::high_throughput();
assert!(ll.session.incoming_window < ht.session.incoming_window);
assert!(ll.connection.max_frame_size < ht.connection.max_frame_size);
assert!(!ll.connection.container_id.as_str().is_empty());
}
}