metrale_model_layers/ssm_reserve/
copy_tier.rs1#[derive(Debug, Clone, Copy, PartialEq, Eq)]
19pub struct CopyTier {
20 pub slots: usize,
22 pub drafts: usize,
24}
25
26static PUBLISHED: std::sync::OnceLock<CopyTier> = std::sync::OnceLock::new();
27
28pub fn set_copy_tier(tier: CopyTier) -> anyhow::Result<()> {
30 anyhow::ensure!(
31 tier.slots >= 1 && tier.drafts >= 1,
32 "copy tier needs at least one slot and one draft, got {tier:?}"
33 );
34 let got = *PUBLISHED.get_or_init(|| tier);
35 anyhow::ensure!(
36 got == tier,
37 "copy tier already published as {got:?}, refusing {tier:?}"
38 );
39 Ok(())
40}
41
42pub fn copy_tier() -> Option<CopyTier> {
44 PUBLISHED.get().copied()
45}
46
47pub fn tier_h(base: usize, s: usize, tier: Option<CopyTier>) -> usize {
50 match tier {
51 Some(t) if s < t.slots => base.max(t.drafts),
52 _ => base,
53 }
54}
55
56pub fn tier_rows(k: usize, tier: Option<CopyTier>) -> usize {
59 tier.map_or(k, |t| k.max(t.drafts + 1))
60}
61
62#[cfg(test)]
63mod tests {
64 use super::*;
65
66 const T: CopyTier = CopyTier {
67 slots: 8,
68 drafts: 8,
69 };
70
71 #[test]
72 fn only_copy_slots_are_raised_and_never_lowered() {
73 assert_eq!(tier_h(3, 0, Some(T)), 8);
74 assert_eq!(tier_h(3, 7, Some(T)), 8);
75 assert_eq!(tier_h(3, 8, Some(T)), 3, "slot 8 is outside the tier");
76 assert_eq!(
77 tier_h(12, 0, Some(T)),
78 12,
79 "a deeper ladder slot keeps its depth"
80 );
81 assert_eq!(tier_h(3, 0, None), 3);
82 }
83
84 #[test]
85 fn rows_widen_to_the_copy() {
86 assert_eq!(tier_rows(4, Some(T)), 9);
87 assert_eq!(tier_rows(17, Some(T)), 17);
88 assert_eq!(tier_rows(2, None), 2);
89 }
90
91 #[test]
92 fn an_empty_tier_is_refused() {
93 assert!(
94 set_copy_tier(CopyTier {
95 slots: 0,
96 drafts: 4
97 })
98 .is_err()
99 );
100 assert!(
101 set_copy_tier(CopyTier {
102 slots: 4,
103 drafts: 0
104 })
105 .is_err()
106 );
107 }
108}