1use noxu_dbi::ReplicaAckPolicyKind;
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
10pub enum SyncPolicy {
11 #[default]
16 Sync,
17
18 WriteNoSync,
23
24 NoSync,
30}
31
32#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
37pub enum ReplicaAckPolicy {
38 All,
40
41 None,
43
44 #[default]
46 SimpleMajority,
47}
48
49#[derive(Debug, Clone, Copy, PartialEq, Eq)]
59pub struct Durability {
60 pub local_sync: SyncPolicy,
62
63 pub replica_sync: SyncPolicy,
65
66 pub replica_ack: ReplicaAckPolicy,
68}
69
70impl ReplicaAckPolicy {
71 pub fn as_kind(self) -> ReplicaAckPolicyKind {
74 match self {
75 ReplicaAckPolicy::All => ReplicaAckPolicyKind::All,
76 ReplicaAckPolicy::SimpleMajority => {
77 ReplicaAckPolicyKind::SimpleMajority
78 }
79 ReplicaAckPolicy::None => ReplicaAckPolicyKind::None,
80 }
81 }
82}
83
84impl Durability {
85 pub fn new(
87 local_sync: SyncPolicy,
88 replica_sync: SyncPolicy,
89 replica_ack: ReplicaAckPolicy,
90 ) -> Self {
91 Self { local_sync, replica_sync, replica_ack }
92 }
93
94 pub const COMMIT_SYNC: Self = Self {
96 local_sync: SyncPolicy::Sync,
97 replica_sync: SyncPolicy::Sync,
98 replica_ack: ReplicaAckPolicy::SimpleMajority,
99 };
100
101 pub const COMMIT_NO_SYNC: Self = Self {
103 local_sync: SyncPolicy::NoSync,
104 replica_sync: SyncPolicy::NoSync,
105 replica_ack: ReplicaAckPolicy::None,
106 };
107
108 pub const COMMIT_WRITE_NO_SYNC: Self = Self {
110 local_sync: SyncPolicy::WriteNoSync,
111 replica_sync: SyncPolicy::WriteNoSync,
112 replica_ack: ReplicaAckPolicy::SimpleMajority,
113 };
114}
115
116impl Default for Durability {
117 fn default() -> Self {
118 Self::COMMIT_SYNC
119 }
120}
121
122#[cfg(test)]
123mod tests {
124 use super::*;
125
126 #[test]
127 fn test_sync_policy_default() {
128 assert_eq!(SyncPolicy::default(), SyncPolicy::Sync);
129 }
130
131 #[test]
132 fn test_sync_policy_equality() {
133 assert_eq!(SyncPolicy::Sync, SyncPolicy::Sync);
134 assert_ne!(SyncPolicy::Sync, SyncPolicy::NoSync);
135 }
136
137 #[test]
138 fn test_replica_ack_policy_default() {
139 assert_eq!(
140 ReplicaAckPolicy::default(),
141 ReplicaAckPolicy::SimpleMajority
142 );
143 }
144
145 #[test]
146 fn test_replica_ack_policy_equality() {
147 assert_eq!(ReplicaAckPolicy::All, ReplicaAckPolicy::All);
148 assert_ne!(ReplicaAckPolicy::All, ReplicaAckPolicy::None);
149 }
150
151 #[test]
152 fn test_durability_new() {
153 let d = Durability::new(
154 SyncPolicy::Sync,
155 SyncPolicy::WriteNoSync,
156 ReplicaAckPolicy::All,
157 );
158 assert_eq!(d.local_sync, SyncPolicy::Sync);
159 assert_eq!(d.replica_sync, SyncPolicy::WriteNoSync);
160 assert_eq!(d.replica_ack, ReplicaAckPolicy::All);
161 }
162
163 #[test]
164 fn test_durability_commit_sync() {
165 let d = Durability::COMMIT_SYNC;
166 assert_eq!(d.local_sync, SyncPolicy::Sync);
167 assert_eq!(d.replica_sync, SyncPolicy::Sync);
168 assert_eq!(d.replica_ack, ReplicaAckPolicy::SimpleMajority);
169 }
170
171 #[test]
172 fn test_durability_commit_no_sync() {
173 let d = Durability::COMMIT_NO_SYNC;
174 assert_eq!(d.local_sync, SyncPolicy::NoSync);
175 assert_eq!(d.replica_sync, SyncPolicy::NoSync);
176 assert_eq!(d.replica_ack, ReplicaAckPolicy::None);
177 }
178
179 #[test]
180 fn test_durability_commit_write_no_sync() {
181 let d = Durability::COMMIT_WRITE_NO_SYNC;
182 assert_eq!(d.local_sync, SyncPolicy::WriteNoSync);
183 assert_eq!(d.replica_sync, SyncPolicy::WriteNoSync);
184 assert_eq!(d.replica_ack, ReplicaAckPolicy::SimpleMajority);
185 }
186
187 #[test]
188 fn test_durability_default() {
189 let d = Durability::default();
190 assert_eq!(d, Durability::COMMIT_SYNC);
191 }
192
193 #[test]
194 fn test_durability_equality() {
195 let d1 = Durability::new(
196 SyncPolicy::Sync,
197 SyncPolicy::Sync,
198 ReplicaAckPolicy::SimpleMajority,
199 );
200 let d2 = Durability::COMMIT_SYNC;
201 assert_eq!(d1, d2);
202 }
203
204 #[test]
205 fn test_durability_clone() {
206 let d1 = Durability::COMMIT_SYNC;
207 let d2 = d1;
208 assert_eq!(d1, d2);
209 }
210
211 #[test]
212 fn test_sync_policy_copy() {
213 let s1 = SyncPolicy::Sync;
214 let s2 = s1;
215 assert_eq!(s1, s2);
216 }
217
218 #[test]
219 fn test_replica_ack_policy_copy() {
220 let r1 = ReplicaAckPolicy::All;
221 let r2 = r1;
222 assert_eq!(r1, r2);
223 }
224}