solana_runtime/snapshot_package/
compare.rs1use {
2 super::{SnapshotKind, SnapshotPackage},
3 std::cmp::Ordering::{self, Equal, Greater, Less},
4};
5
6#[must_use]
8pub fn cmp_snapshot_packages_by_priority(a: &SnapshotPackage, b: &SnapshotPackage) -> Ordering {
9 cmp_snapshot_kinds_by_priority(&a.snapshot_kind, &b.snapshot_kind).then(a.slot.cmp(&b.slot))
10}
11
12#[must_use]
17pub fn cmp_snapshot_kinds_by_priority(a: &SnapshotKind, b: &SnapshotKind) -> Ordering {
18 use SnapshotKind as Kind;
19 match (a, b) {
20 (Kind::FullSnapshot, Kind::FullSnapshot) => Equal,
21 (Kind::FullSnapshot, Kind::IncrementalSnapshot(_)) => Greater,
22 (Kind::IncrementalSnapshot(_), Kind::FullSnapshot) => Less,
23 (Kind::IncrementalSnapshot(base_slot_a), Kind::IncrementalSnapshot(base_slot_b)) => {
24 base_slot_a.cmp(base_slot_b)
25 }
26 }
27}
28
29#[cfg(test)]
30mod tests {
31 use {super::*, solana_clock::Slot};
32
33 #[test]
34 fn test_cmp_snapshot_packages_by_priority() {
35 fn new(snapshot_kind: SnapshotKind, slot: Slot) -> SnapshotPackage {
36 SnapshotPackage {
37 snapshot_kind,
38 slot,
39 block_height: slot,
40 ..SnapshotPackage::default_for_tests()
41 }
42 }
43
44 for (snapshot_package_a, snapshot_package_b, expected_result) in [
45 (
46 new(SnapshotKind::FullSnapshot, 11),
47 new(SnapshotKind::FullSnapshot, 22),
48 Less,
49 ),
50 (
51 new(SnapshotKind::FullSnapshot, 22),
52 new(SnapshotKind::FullSnapshot, 22),
53 Equal,
54 ),
55 (
56 new(SnapshotKind::FullSnapshot, 33),
57 new(SnapshotKind::FullSnapshot, 22),
58 Greater,
59 ),
60 (
61 new(SnapshotKind::FullSnapshot, 22),
62 new(SnapshotKind::IncrementalSnapshot(88), 99),
63 Greater,
64 ),
65 (
66 new(SnapshotKind::IncrementalSnapshot(11), 55),
67 new(SnapshotKind::IncrementalSnapshot(22), 55),
68 Less,
69 ),
70 (
71 new(SnapshotKind::IncrementalSnapshot(22), 55),
72 new(SnapshotKind::IncrementalSnapshot(22), 55),
73 Equal,
74 ),
75 (
76 new(SnapshotKind::IncrementalSnapshot(33), 55),
77 new(SnapshotKind::IncrementalSnapshot(22), 55),
78 Greater,
79 ),
80 (
81 new(SnapshotKind::IncrementalSnapshot(22), 44),
82 new(SnapshotKind::IncrementalSnapshot(22), 55),
83 Less,
84 ),
85 (
86 new(SnapshotKind::IncrementalSnapshot(22), 55),
87 new(SnapshotKind::IncrementalSnapshot(22), 55),
88 Equal,
89 ),
90 (
91 new(SnapshotKind::IncrementalSnapshot(22), 66),
92 new(SnapshotKind::IncrementalSnapshot(22), 55),
93 Greater,
94 ),
95 ] {
96 let actual_result =
97 cmp_snapshot_packages_by_priority(&snapshot_package_a, &snapshot_package_b);
98 assert_eq!(expected_result, actual_result);
99 }
100 }
101
102 #[test]
103 fn test_cmp_snapshot_kinds_by_priority() {
104 for (snapshot_kind_a, snapshot_kind_b, expected_result) in [
105 (
106 SnapshotKind::FullSnapshot,
107 SnapshotKind::FullSnapshot,
108 Equal,
109 ),
110 (
111 SnapshotKind::FullSnapshot,
112 SnapshotKind::IncrementalSnapshot(5),
113 Greater,
114 ),
115 (
116 SnapshotKind::IncrementalSnapshot(5),
117 SnapshotKind::FullSnapshot,
118 Less,
119 ),
120 (
121 SnapshotKind::IncrementalSnapshot(5),
122 SnapshotKind::IncrementalSnapshot(6),
123 Less,
124 ),
125 (
126 SnapshotKind::IncrementalSnapshot(5),
127 SnapshotKind::IncrementalSnapshot(5),
128 Equal,
129 ),
130 (
131 SnapshotKind::IncrementalSnapshot(5),
132 SnapshotKind::IncrementalSnapshot(4),
133 Greater,
134 ),
135 ] {
136 let actual_result = cmp_snapshot_kinds_by_priority(&snapshot_kind_a, &snapshot_kind_b);
137 assert_eq!(expected_result, actual_result);
138 }
139 }
140}