d_engine/config/
network.rs1use config::ConfigError;
2use serde::Deserialize;
3use serde::Serialize;
4
5use crate::Error;
6use crate::Result;
7
8#[derive(Debug, Serialize, Deserialize, Clone)]
15#[allow(dead_code)]
16pub struct NetworkConfig {
17 #[serde(default = "default_control_params")]
19 pub control: ConnectionParams,
20
21 #[serde(default = "default_data_params")]
23 pub data: ConnectionParams,
24
25 #[serde(default = "default_bulk_params")]
27 pub bulk: ConnectionParams,
28
29 #[serde(default = "default_tcp_nodelay")]
31 pub tcp_nodelay: bool,
32
33 #[serde(default = "default_buffer_size")]
35 pub buffer_size: usize,
36}
37
38#[derive(Debug, Serialize, Deserialize, Clone, Default)]
40pub struct ConnectionParams {
41 #[serde(default = "default_connect_timeout")]
43 pub connect_timeout_in_ms: u64,
44
45 #[serde(default = "default_request_timeout")]
47 pub request_timeout_in_ms: u64,
48
49 #[serde(default = "default_concurrency_limit")]
51 pub concurrency_limit: usize,
52
53 #[serde(default = "default_max_streams")]
55 pub max_concurrent_streams: u32,
56
57 #[serde(default = "default_tcp_keepalive")]
59 pub tcp_keepalive_in_secs: u64,
60
61 #[serde(default = "default_h2_keepalive_interval")]
63 pub http2_keep_alive_interval_in_secs: u64,
64
65 #[serde(default = "default_h2_keepalive_timeout")]
67 pub http2_keep_alive_timeout_in_secs: u64,
68
69 #[serde(default = "default_max_frame_size")]
71 pub max_frame_size: u32,
72
73 #[serde(default = "default_conn_window_size")]
75 pub connection_window_size: u32,
76
77 #[serde(default = "default_stream_window_size")]
79 pub stream_window_size: u32,
80
81 #[serde(default = "default_adaptive_window")]
83 pub adaptive_window: bool,
84}
85
86impl Default for NetworkConfig {
87 fn default() -> Self {
88 Self {
89 control: default_control_params(),
90 data: default_data_params(),
91 bulk: default_bulk_params(),
92 tcp_nodelay: default_tcp_nodelay(),
93 buffer_size: default_buffer_size(),
94 }
95 }
96}
97
98impl NetworkConfig {
99 pub fn validate(&self) -> Result<()> {
101 if self.buffer_size < 1024 {
103 return Err(Error::Config(ConfigError::Message(format!(
104 "Buffer size {} too small, minimum 1024 bytes",
105 self.buffer_size
106 ))));
107 }
108
109 self.control.validate("control")?;
111 self.data.validate("data")?;
112 self.bulk.validate("bulk")?;
113
114 Ok(())
115 }
116}
117
118impl ConnectionParams {
119 pub(crate) fn validate(
121 &self,
122 conn_type: &str,
123 ) -> Result<()> {
124 if self.connect_timeout_in_ms == 0 {
126 return Err(Error::Config(ConfigError::Message(format!(
127 "{conn_type} connection timeout must be > 0",
128 ))));
129 }
130
131 if self.request_timeout_in_ms != 0
132 && self.request_timeout_in_ms <= self.connect_timeout_in_ms
133 {
134 return Err(Error::Config(ConfigError::Message(format!(
135 "{} request timeout {}ms must exceed connect timeout {}ms",
136 conn_type, self.request_timeout_in_ms, self.connect_timeout_in_ms
137 ))));
138 }
139
140 if self.http2_keep_alive_timeout_in_secs >= self.http2_keep_alive_interval_in_secs {
142 return Err(Error::Config(ConfigError::Message(format!(
143 "{} keepalive timeout {}s must be < interval {}s",
144 conn_type,
145 self.http2_keep_alive_timeout_in_secs,
146 self.http2_keep_alive_interval_in_secs
147 ))));
148 }
149
150 if !self.adaptive_window {
152 const MIN_WINDOW: u32 = 65535; if self.stream_window_size < MIN_WINDOW {
154 return Err(Error::Config(ConfigError::Message(format!(
155 "{} stream window size {} below minimum {}",
156 conn_type, self.stream_window_size, MIN_WINDOW
157 ))));
158 }
159
160 if self.connection_window_size < self.stream_window_size {
161 return Err(Error::Config(ConfigError::Message(format!(
162 "{} connection window {} smaller than stream window {}",
163 conn_type, self.connection_window_size, self.stream_window_size
164 ))));
165 }
166 }
167
168 Ok(())
169 }
170}
171
172fn default_control_params() -> ConnectionParams {
175 ConnectionParams {
176 connect_timeout_in_ms: 20, request_timeout_in_ms: 100, concurrency_limit: 1024, max_concurrent_streams: 100, tcp_keepalive_in_secs: 300, http2_keep_alive_interval_in_secs: 30, http2_keep_alive_timeout_in_secs: 5, max_frame_size: default_max_frame_size(),
184 connection_window_size: 1_048_576, stream_window_size: 262_144, adaptive_window: false, }
188}
189
190fn default_data_params() -> ConnectionParams {
191 ConnectionParams {
192 connect_timeout_in_ms: 50, request_timeout_in_ms: 500, concurrency_limit: 8192, max_concurrent_streams: 500, tcp_keepalive_in_secs: 600, http2_keep_alive_interval_in_secs: 120, http2_keep_alive_timeout_in_secs: 30, max_frame_size: default_max_frame_size(),
200 connection_window_size: 6_291_456, stream_window_size: 1_048_576, adaptive_window: true, }
204}
205
206fn default_bulk_params() -> ConnectionParams {
207 ConnectionParams {
208 connect_timeout_in_ms: 500000, request_timeout_in_ms: 5000000, concurrency_limit: 4, max_concurrent_streams: 2, tcp_keepalive_in_secs: 3600, http2_keep_alive_interval_in_secs: 600, http2_keep_alive_timeout_in_secs: 60, max_frame_size: 16_777_215, connection_window_size: 67_108_864, stream_window_size: 16_777_216, adaptive_window: false, }
220}
221
222fn default_connect_timeout() -> u64 {
224 20
225}
226fn default_request_timeout() -> u64 {
227 100
228}
229fn default_concurrency_limit() -> usize {
230 256
231}
232fn default_max_streams() -> u32 {
233 500
234}
235fn default_tcp_nodelay() -> bool {
236 true
237}
238fn default_tcp_keepalive() -> u64 {
239 3600
240}
241fn default_h2_keepalive_interval() -> u64 {
242 300
243}
244fn default_h2_keepalive_timeout() -> u64 {
245 20
246}
247fn default_max_frame_size() -> u32 {
248 16_777_215
249}
250fn default_conn_window_size() -> u32 {
251 20_971_520 }
253fn default_stream_window_size() -> u32 {
254 10_485_760 }
256fn default_buffer_size() -> usize {
257 65_536
258}
259fn default_adaptive_window() -> bool {
260 false
261}