nodedb_types/config/tuning/
mod.rs1mod data_plane;
2mod engines;
3mod memory;
4mod network;
5mod scheduler;
6mod shutdown;
7
8pub use data_plane::{DataPlaneTuning, QueryTuning};
9pub use engines::{
10 DEFAULT_MAX_DEPTH, DEFAULT_MAX_VISITED, GraphTuning, KvTuning, SparseTuning, TimeseriesToning,
11 VectorTuning,
12};
13pub use memory::MemoryTuning;
14pub use network::{BridgeTuning, ClusterTransportTuning, NetworkTuning, WalTuning};
15pub use scheduler::SchedulerTuning;
16pub use shutdown::ShutdownTuning;
17
18use serde::{Deserialize, Serialize};
19
20#[derive(Debug, Clone, Default, Serialize, Deserialize)]
25pub struct TuningConfig {
26 #[serde(default)]
27 pub data_plane: DataPlaneTuning,
28 #[serde(default)]
29 pub query: QueryTuning,
30 #[serde(default)]
31 pub vector: VectorTuning,
32 #[serde(default)]
33 pub sparse: SparseTuning,
34 #[serde(default)]
35 pub graph: GraphTuning,
36 #[serde(default)]
37 pub timeseries: TimeseriesToning,
38 #[serde(default)]
39 pub kv: KvTuning,
40 #[serde(default)]
41 pub bridge: BridgeTuning,
42 #[serde(default)]
43 pub network: NetworkTuning,
44 #[serde(default)]
45 pub wal: WalTuning,
46 #[serde(default)]
47 pub cluster_transport: ClusterTransportTuning,
48 #[serde(default)]
49 pub memory: MemoryTuning,
50 #[serde(default)]
51 pub scheduler: SchedulerTuning,
52 #[serde(default)]
53 pub shutdown: ShutdownTuning,
54}
55
56#[cfg(test)]
57mod tests {
58 use super::*;
59
60 #[test]
61 fn default_tuning_roundtrip() {
62 let cfg = TuningConfig::default();
63 let toml_str = toml::to_string_pretty(&cfg).expect("serialize");
64 let parsed: TuningConfig = toml::from_str(&toml_str).expect("deserialize");
65
66 assert_eq!(parsed.data_plane.idle_poll_timeout_ms, 100);
67 assert_eq!(parsed.query.sort_run_size, 100_000);
68 assert_eq!(parsed.vector.flat_index_threshold, 10_000);
69 assert_eq!(parsed.sparse.bm25_k1, 1.2);
70 assert_eq!(parsed.graph.max_visited, 100_000);
71 assert_eq!(parsed.timeseries.memtable_budget_bytes, 64 * 1024 * 1024);
72 assert_eq!(parsed.kv.default_capacity, 16_384);
73 assert_eq!(parsed.kv.rehash_load_factor, 0.75);
74 assert_eq!(parsed.kv.expiry_reap_budget, 1024);
75 assert_eq!(parsed.bridge.slab_page_size, 64 * 1024);
76 assert_eq!(parsed.network.default_deadline_secs, 30);
77 assert_eq!(parsed.wal.write_buffer_size, 2 * 1024 * 1024);
78 assert_eq!(parsed.cluster_transport.raft_tick_interval_ms, 10);
79 assert_eq!(
81 parsed.cluster_transport.broadcast_threshold_bytes,
82 8 * 1024 * 1024
83 );
84 assert_eq!(parsed.cluster_transport.ghost_sweep_interval_secs, 1800);
85 assert_eq!(parsed.cluster_transport.health_ping_interval_secs, 5);
86 assert_eq!(parsed.cluster_transport.health_failure_threshold, 3);
87 assert_eq!(parsed.query.doc_cache_entries, 4096);
89 assert_eq!(parsed.query.columnar_flush_threshold, 65_536);
90 assert_eq!(parsed.query.compaction_target_bytes, 256 * 1024 * 1024);
91 assert_eq!(parsed.memory.overflow_initial_bytes, 64 * 1024 * 1024);
93 assert_eq!(parsed.memory.overflow_max_bytes, 1024 * 1024 * 1024);
94 assert_eq!(parsed.memory.doc_cache_entries, 4096);
95 assert_eq!(parsed.shutdown.deadline_ms, 900);
96 }
97
98 #[test]
99 fn partial_override() {
100 let toml_str = r#"
101[query]
102sort_run_size = 50000
103
104[network]
105default_deadline_secs = 60
106"#;
107 let cfg: TuningConfig = toml::from_str(toml_str).expect("deserialize");
108 assert_eq!(cfg.query.sort_run_size, 50_000);
109 assert_eq!(cfg.network.default_deadline_secs, 60);
110 assert_eq!(cfg.query.aggregate_scan_cap, 10_000_000);
111 assert_eq!(cfg.vector.seal_threshold, 65_536);
112 assert_eq!(cfg.query.columnar_flush_threshold, 65_536);
114 assert_eq!(cfg.query.compaction_target_bytes, 256 * 1024 * 1024);
115 }
116
117 #[test]
118 fn empty_toml_yields_defaults() {
119 let cfg: TuningConfig = toml::from_str("").expect("deserialize");
120 assert_eq!(cfg.data_plane.max_consecutive_panics, 3);
121 assert_eq!(cfg.graph.max_depth, 10);
122 assert_eq!(cfg.memory.overflow_initial_bytes, 64 * 1024 * 1024);
124 assert_eq!(cfg.memory.overflow_max_bytes, 1024 * 1024 * 1024);
125 assert_eq!(cfg.memory.doc_cache_entries, 4096);
126 assert_eq!(
128 cfg.cluster_transport.broadcast_threshold_bytes,
129 8 * 1024 * 1024
130 );
131 assert_eq!(cfg.cluster_transport.ghost_sweep_interval_secs, 1800);
132 assert_eq!(cfg.cluster_transport.health_ping_interval_secs, 5);
133 assert_eq!(cfg.cluster_transport.health_failure_threshold, 3);
134 }
135
136 #[test]
137 fn memory_tuning_override() {
138 let toml_str = r#"
139[memory]
140overflow_initial_bytes = 134217728
141overflow_max_bytes = 2147483648
142doc_cache_entries = 8192
143"#;
144 let cfg: TuningConfig = toml::from_str(toml_str).expect("deserialize");
145 assert_eq!(cfg.memory.overflow_initial_bytes, 128 * 1024 * 1024);
146 assert_eq!(cfg.memory.overflow_max_bytes, 2 * 1024 * 1024 * 1024);
147 assert_eq!(cfg.memory.doc_cache_entries, 8192);
148 }
149}