Skip to main content

solana_runtime/snapshot_package/
compare.rs

1use {
2    super::{SnapshotKind, SnapshotPackage},
3    std::cmp::Ordering::{self, Equal, Greater, Less},
4};
5
6/// Compare snapshot packages by priority; first by type, then by slot
7#[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/// Compare snapshot kinds by priority
13///
14/// Full snapshots are higher in priority than incremental snapshots.
15/// If two `IncrementalSnapshot`s are compared, their base slots are the tiebreaker.
16#[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}