fraiseql_server/config/
pool_tuning.rs1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
26pub struct PoolPressureMonitorConfig {
27 #[serde(default)]
29 pub enabled: bool,
30
31 #[serde(default = "default_min_pool_size")]
33 pub min_pool_size: u32,
34
35 #[serde(default = "default_max_pool_size")]
37 pub max_pool_size: u32,
38
39 #[serde(default = "default_target_queue_depth")]
41 pub target_queue_depth: u32,
42
43 #[serde(default = "default_scale_up_step")]
45 pub scale_up_step: u32,
46
47 #[serde(default = "default_scale_down_step")]
49 pub scale_down_step: u32,
50
51 #[serde(default = "default_scale_down_idle_ratio")]
54 pub scale_down_idle_ratio: f64,
55
56 #[serde(default = "default_tuning_interval_ms")]
58 pub tuning_interval_ms: u64,
59
60 #[serde(default = "default_samples_before_action")]
62 pub samples_before_action: u32,
63}
64
65const fn default_min_pool_size() -> u32 {
66 5
67}
68const fn default_max_pool_size() -> u32 {
69 50
70}
71const fn default_target_queue_depth() -> u32 {
72 3
73}
74const fn default_scale_up_step() -> u32 {
75 5
76}
77const fn default_scale_down_step() -> u32 {
78 2
79}
80const fn default_scale_down_idle_ratio() -> f64 {
81 0.5
82}
83const fn default_tuning_interval_ms() -> u64 {
84 30_000
85}
86const fn default_samples_before_action() -> u32 {
87 3
88}
89
90impl Default for PoolPressureMonitorConfig {
91 fn default() -> Self {
92 Self {
93 enabled: false,
94 min_pool_size: default_min_pool_size(),
95 max_pool_size: default_max_pool_size(),
96 target_queue_depth: default_target_queue_depth(),
97 scale_up_step: default_scale_up_step(),
98 scale_down_step: default_scale_down_step(),
99 scale_down_idle_ratio: default_scale_down_idle_ratio(),
100 tuning_interval_ms: default_tuning_interval_ms(),
101 samples_before_action: default_samples_before_action(),
102 }
103 }
104}
105
106#[deprecated(since = "2.0.1", note = "Use PoolPressureMonitorConfig")]
112pub type PoolTuningConfig = PoolPressureMonitorConfig;
113
114impl PoolPressureMonitorConfig {
115 #[must_use = "builder does nothing until .build() is called"]
117 pub fn builder() -> PoolPressureMonitorConfigBuilder {
118 PoolPressureMonitorConfigBuilder::default()
119 }
120
121 pub fn validate(&self) -> Result<(), String> {
131 if self.min_pool_size >= self.max_pool_size {
132 return Err(format!(
133 "pool_tuning: min_pool_size ({}) must be less than max_pool_size ({})",
134 self.min_pool_size, self.max_pool_size
135 ));
136 }
137 if self.scale_up_step == 0 {
138 return Err("pool_tuning: scale_up_step must be > 0".to_string());
139 }
140 if self.scale_down_step == 0 {
141 return Err("pool_tuning: scale_down_step must be > 0".to_string());
142 }
143 if !(0.0..=1.0).contains(&self.scale_down_idle_ratio) {
144 return Err(format!(
145 "pool_tuning: scale_down_idle_ratio ({}) must be in [0.0, 1.0]",
146 self.scale_down_idle_ratio
147 ));
148 }
149 if self.tuning_interval_ms < 100 {
150 return Err(format!(
151 "pool_tuning: tuning_interval_ms ({}) must be >= 100",
152 self.tuning_interval_ms
153 ));
154 }
155 Ok(())
156 }
157}
158
159#[derive(Debug, Default)]
161pub struct PoolPressureMonitorConfigBuilder {
162 inner: PoolPressureMonitorConfig,
163}
164
165impl PoolPressureMonitorConfigBuilder {
166 #[must_use = "builder method returns modified builder"]
168 pub const fn enabled(mut self, enabled: bool) -> Self {
169 self.inner.enabled = enabled;
170 self
171 }
172
173 #[must_use = "builder method returns modified builder"]
175 pub const fn min_pool_size(mut self, min_pool_size: u32) -> Self {
176 self.inner.min_pool_size = min_pool_size;
177 self
178 }
179
180 #[must_use = "builder method returns modified builder"]
182 pub const fn max_pool_size(mut self, max_pool_size: u32) -> Self {
183 self.inner.max_pool_size = max_pool_size;
184 self
185 }
186
187 #[must_use = "builder method returns modified builder"]
189 pub const fn target_queue_depth(mut self, target_queue_depth: u32) -> Self {
190 self.inner.target_queue_depth = target_queue_depth;
191 self
192 }
193
194 #[must_use = "builder method returns modified builder"]
196 pub const fn scale_up_step(mut self, scale_up_step: u32) -> Self {
197 self.inner.scale_up_step = scale_up_step;
198 self
199 }
200
201 #[must_use = "builder method returns modified builder"]
203 pub const fn scale_down_step(mut self, scale_down_step: u32) -> Self {
204 self.inner.scale_down_step = scale_down_step;
205 self
206 }
207
208 #[must_use = "builder method returns modified builder"]
210 pub const fn scale_down_idle_ratio(mut self, scale_down_idle_ratio: f64) -> Self {
211 self.inner.scale_down_idle_ratio = scale_down_idle_ratio;
212 self
213 }
214
215 #[must_use = "builder method returns modified builder"]
217 pub const fn tuning_interval_ms(mut self, tuning_interval_ms: u64) -> Self {
218 self.inner.tuning_interval_ms = tuning_interval_ms;
219 self
220 }
221
222 #[must_use = "builder method returns modified builder"]
224 pub const fn samples_before_action(mut self, samples_before_action: u32) -> Self {
225 self.inner.samples_before_action = samples_before_action;
226 self
227 }
228
229 #[must_use = "building a config that is not used has no effect"]
231 pub const fn build(self) -> PoolPressureMonitorConfig {
232 self.inner
233 }
234}