nodedb_types/config/tuning/
calvin.rs1use serde::{Deserialize, Serialize};
10
11fn default_channel_capacity() -> usize {
12 512
13}
14
15fn default_txn_deadline_multiplier() -> u32 {
16 3
17}
18
19fn default_dependent_read_passive_timeout_ms() -> u64 {
20 5_000
25}
26
27fn default_verdict_stall_warn_ms() -> u64 {
28 5_000
30}
31
32fn default_max_inflight_backlog() -> usize {
33 1_024
36}
37
38fn default_catch_up_window() -> u64 {
39 512
41}
42
43fn default_max_redo_entry_bytes() -> usize {
44 8 * 1024 * 1024
47}
48
49fn default_max_open_redo_bytes() -> u64 {
50 512 * 1024 * 1024
52}
53
54fn default_restage_attempts() -> u32 {
55 5
56}
57
58fn default_restage_backoff_ms() -> u64 {
59 100
61}
62
63#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
65pub struct CalvinTuning {
66 #[serde(default = "default_channel_capacity")]
69 pub channel_capacity: usize,
70
71 #[serde(default = "default_txn_deadline_multiplier")]
73 pub txn_deadline_multiplier: u32,
74
75 #[serde(default = "default_dependent_read_passive_timeout_ms")]
80 pub dependent_read_passive_timeout_ms: u64,
81
82 #[serde(default = "default_verdict_stall_warn_ms")]
86 pub verdict_stall_warn_ms: u64,
87
88 #[serde(default = "default_max_inflight_backlog")]
94 pub max_inflight_backlog: usize,
95
96 #[serde(default = "default_catch_up_window")]
98 pub catch_up_window: u64,
99
100 #[serde(default = "default_max_redo_entry_bytes")]
103 pub max_redo_entry_bytes: usize,
104
105 #[serde(default = "default_max_open_redo_bytes")]
109 pub max_open_redo_bytes: u64,
110
111 #[serde(default = "default_restage_attempts")]
116 pub restage_attempts: u32,
117
118 #[serde(default = "default_restage_backoff_ms")]
122 pub restage_backoff_ms: u64,
123}
124
125impl Default for CalvinTuning {
126 fn default() -> Self {
127 Self {
128 channel_capacity: default_channel_capacity(),
129 txn_deadline_multiplier: default_txn_deadline_multiplier(),
130 dependent_read_passive_timeout_ms: default_dependent_read_passive_timeout_ms(),
131 verdict_stall_warn_ms: default_verdict_stall_warn_ms(),
132 max_inflight_backlog: default_max_inflight_backlog(),
133 catch_up_window: default_catch_up_window(),
134 max_redo_entry_bytes: default_max_redo_entry_bytes(),
135 max_open_redo_bytes: default_max_open_redo_bytes(),
136 restage_attempts: default_restage_attempts(),
137 restage_backoff_ms: default_restage_backoff_ms(),
138 }
139 }
140}
141
142#[cfg(test)]
143mod tests {
144 use super::*;
145
146 #[test]
147 fn defaults() {
148 let t = CalvinTuning::default();
149 assert_eq!(t.channel_capacity, 512);
150 assert_eq!(t.txn_deadline_multiplier, 3);
151 assert_eq!(t.dependent_read_passive_timeout_ms, 5_000);
152 assert_eq!(t.verdict_stall_warn_ms, 5_000);
153 assert_eq!(t.max_inflight_backlog, 1_024);
154 assert_eq!(t.catch_up_window, 512);
155 assert_eq!(t.max_redo_entry_bytes, 8 * 1024 * 1024);
156 assert_eq!(t.max_open_redo_bytes, 512 * 1024 * 1024);
157 assert_eq!(t.restage_attempts, 5);
158 assert_eq!(t.restage_backoff_ms, 100);
159 }
160
161 #[test]
162 fn partial_override() {
163 let toml_str = r#"
164max_inflight_backlog = 256
165verdict_stall_warn_ms = 10000
166"#;
167 let t: CalvinTuning = toml::from_str(toml_str).expect("deserialize");
168 assert_eq!(t.max_inflight_backlog, 256);
169 assert_eq!(t.verdict_stall_warn_ms, 10_000);
170 assert_eq!(t.channel_capacity, 512);
171 assert_eq!(t.catch_up_window, 512);
172 }
173
174 #[test]
175 fn empty_table_keeps_the_defaults() {
176 let t: CalvinTuning = toml::from_str("").expect("deserialize");
177 assert_eq!(t, CalvinTuning::default());
178 }
179}