Skip to main content

nodedb_vector/collection/
tier.rs

1// SPDX-License-Identifier: Apache-2.0
2
3/// Storage tier classification.
4///
5/// Data flows downward: L0 → L1 → L2 as it ages and cools.
6#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7#[non_exhaustive]
8pub enum StorageTier {
9    /// L0 (Hot): Lock-free radix trees, memtables, active CRDT states.
10    /// Pure RAM — no I/O.
11    L0Ram,
12
13    /// L1 (Warm): HNSW graphs, metadata indexes, segment files.
14    /// NVMe via mmap + madvise(MADV_WILLNEED).
15    /// Zero-copy deserialization, SIMD reads directly from mmap.
16    L1Nvme,
17
18    /// L2 (Cold): Historical logs, compressed vector layers.
19    /// Remote object storage (S3/GCS), Parquet-encoded.
20    /// DataFusion predicate pushdown for minimal egress.
21    L2Remote,
22}
23
24impl StorageTier {
25    /// Whether this tier is memory-resident (no I/O needed).
26    pub fn is_memory_resident(self) -> bool {
27        matches!(self, StorageTier::L0Ram)
28    }
29
30    /// Whether this tier uses mmap (potential page faults on TPC cores).
31    pub fn uses_mmap(self) -> bool {
32        matches!(self, StorageTier::L1Nvme)
33    }
34
35    /// Whether this tier requires network I/O.
36    pub fn is_remote(self) -> bool {
37        matches!(self, StorageTier::L2Remote)
38    }
39}
40
41#[cfg(test)]
42mod tests {
43    use super::*;
44
45    #[test]
46    fn tier_properties() {
47        assert!(StorageTier::L0Ram.is_memory_resident());
48        assert!(!StorageTier::L0Ram.uses_mmap());
49        assert!(!StorageTier::L0Ram.is_remote());
50
51        assert!(!StorageTier::L1Nvme.is_memory_resident());
52        assert!(StorageTier::L1Nvme.uses_mmap());
53        assert!(!StorageTier::L1Nvme.is_remote());
54
55        assert!(!StorageTier::L2Remote.is_memory_resident());
56        assert!(!StorageTier::L2Remote.uses_mmap());
57        assert!(StorageTier::L2Remote.is_remote());
58    }
59}