1use std::collections::HashMap;
4
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
14#[serde(rename_all = "lowercase")]
15pub enum WalFailureMode {
16 Disabled,
18 Warn,
20 #[default]
22 Strict,
23}
24
25impl std::str::FromStr for WalFailureMode {
26 type Err = String;
27
28 fn from_str(s: &str) -> Result<Self, Self::Err> {
29 match s.to_lowercase().as_str() {
30 "disabled" => Ok(Self::Disabled),
31 "warn" => Ok(Self::Warn),
32 "strict" => Ok(Self::Strict),
33 _ => Err(format!("Invalid WAL failure mode: {}", s)),
34 }
35 }
36}
37
38impl std::fmt::Display for WalFailureMode {
39 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
40 match *self {
41 Self::Disabled => write!(f, "disabled"),
42 Self::Warn => write!(f, "warn"),
43 Self::Strict => write!(f, "strict"),
44 }
45 }
46}
47
48#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
54pub struct CollectionWalConfig {
55 pub write_mode: WalFailureMode,
57 pub verification_mode: WalFailureMode,
59 pub auto_verify: bool,
61 pub enable_recovery: bool,
63 pub max_wal_size_bytes: Option<u64>,
65 pub compression_algorithm: Option<crate::CompressionAlgorithm>,
67 pub max_records_per_file: Option<usize>,
69 #[serde(default)]
71 pub format: crate::manager::WalFormat,
72}
73
74impl Default for CollectionWalConfig {
75 fn default() -> Self {
76 Self {
77 write_mode: WalFailureMode::Strict,
78 verification_mode: WalFailureMode::Warn,
79 auto_verify: false,
80 enable_recovery: true,
81 max_wal_size_bytes: Some(10 * 1024 * 1024), compression_algorithm: Some(crate::CompressionAlgorithm::Zstd),
83 max_records_per_file: Some(1000),
84 format: crate::manager::WalFormat::default(),
85 }
86 }
87}
88
89#[derive(Debug, Clone, Default)]
91pub struct CollectionWalConfigOverrides {
92 pub write_mode: Option<WalFailureMode>,
93 pub verification_mode: Option<WalFailureMode>,
94 pub auto_verify: Option<bool>,
95 pub enable_recovery: Option<bool>,
96 pub max_wal_size_bytes: Option<Option<u64>>, pub compression_algorithm: Option<Option<crate::CompressionAlgorithm>>,
98 pub max_records_per_file: Option<Option<usize>>,
99 pub format: Option<crate::manager::WalFormat>,
100 pub persist_overrides: bool,
102}
103
104impl CollectionWalConfig {
105 pub fn apply_overrides(&self, overrides: &CollectionWalConfigOverrides) -> Self {
107 Self {
108 write_mode: overrides.write_mode.unwrap_or(self.write_mode),
109 verification_mode: overrides
110 .verification_mode
111 .unwrap_or(self.verification_mode),
112 auto_verify: overrides.auto_verify.unwrap_or(self.auto_verify),
113 enable_recovery: overrides.enable_recovery.unwrap_or(self.enable_recovery),
114 max_wal_size_bytes: overrides
115 .max_wal_size_bytes
116 .unwrap_or(self.max_wal_size_bytes),
117 compression_algorithm: overrides
118 .compression_algorithm
119 .unwrap_or(self.compression_algorithm),
120 max_records_per_file: overrides
121 .max_records_per_file
122 .unwrap_or(self.max_records_per_file),
123 format: overrides.format.unwrap_or(self.format),
124 }
125 }
126}
127
128#[derive(Debug, Clone, Serialize, Deserialize)]
133pub struct StoreWalConfig {
134 pub default_collection_config: CollectionWalConfig,
136 pub collection_configs: HashMap<String, CollectionWalConfig>,
138 pub store_failure_mode: WalFailureMode,
140 pub auto_checkpoint: bool,
142 pub checkpoint_interval_secs: u64,
144 pub max_wal_size_bytes: u64,
146}
147
148impl Default for StoreWalConfig {
149 fn default() -> Self {
150 Self {
151 default_collection_config: CollectionWalConfig::default(),
152 collection_configs: HashMap::new(),
153 store_failure_mode: WalFailureMode::Strict,
154 auto_checkpoint: true,
155 checkpoint_interval_secs: 300, max_wal_size_bytes: 100 * 1024 * 1024, }
158 }
159}
160
161impl From<CollectionWalConfig> for crate::manager::WalConfig {
162 fn from(config: CollectionWalConfig) -> Self {
163 Self {
164 max_file_size: config.max_wal_size_bytes,
165 compression_algorithm: config.compression_algorithm,
166 max_records_per_file: config.max_records_per_file,
167 format: config.format,
168 }
169 }
170}