Skip to main content

grafeo_common/memory/
usage.rs

1//! Memory usage breakdown types for graph store components.
2//!
3//! These types live in grafeo-common so both grafeo-core (which implements
4//! the estimations) and grafeo-engine (which aggregates them) can use them.
5
6use serde::{Deserialize, Serialize};
7
8/// Memory used by the graph store (nodes, edges, properties).
9#[derive(Debug, Clone, Default, Serialize, Deserialize)]
10pub struct StoreMemory {
11    /// Total store memory.
12    pub total_bytes: usize,
13    /// Node record storage (hash map buckets + `NodeRecord` data).
14    pub nodes_bytes: usize,
15    /// Edge record storage (hash map buckets + `EdgeRecord` data).
16    pub edges_bytes: usize,
17    /// Node property columns.
18    pub node_properties_bytes: usize,
19    /// Edge property columns.
20    pub edge_properties_bytes: usize,
21    /// Number of property columns (node + edge).
22    pub property_column_count: usize,
23}
24
25impl StoreMemory {
26    /// Recomputes `total_bytes` from child values.
27    pub fn compute_total(&mut self) {
28        self.total_bytes = self.nodes_bytes
29            + self.edges_bytes
30            + self.node_properties_bytes
31            + self.edge_properties_bytes;
32    }
33}
34
35/// Memory used by index structures.
36#[derive(Debug, Clone, Default, Serialize, Deserialize)]
37pub struct IndexMemory {
38    /// Total index memory.
39    pub total_bytes: usize,
40    /// Forward adjacency lists.
41    pub forward_adjacency_bytes: usize,
42    /// Backward adjacency lists (0 if disabled).
43    pub backward_adjacency_bytes: usize,
44    /// Label index (label_id -> node set).
45    pub label_index_bytes: usize,
46    /// Node-to-labels reverse index.
47    pub node_labels_bytes: usize,
48    /// Property value indexes.
49    pub property_index_bytes: usize,
50    /// Per-index breakdown for vector indexes.
51    pub vector_indexes: Vec<NamedMemory>,
52    /// Per-index breakdown for text indexes.
53    pub text_indexes: Vec<NamedMemory>,
54}
55
56impl IndexMemory {
57    /// Recomputes `total_bytes` from child values.
58    pub fn compute_total(&mut self) {
59        self.total_bytes = self.forward_adjacency_bytes
60            + self.backward_adjacency_bytes
61            + self.label_index_bytes
62            + self.node_labels_bytes
63            + self.property_index_bytes
64            + self.vector_indexes.iter().map(|v| v.bytes).sum::<usize>()
65            + self.text_indexes.iter().map(|t| t.bytes).sum::<usize>();
66    }
67}
68
69/// Memory usage for a named component (e.g., a specific index).
70#[derive(Debug, Clone, Default, Serialize, Deserialize)]
71pub struct NamedMemory {
72    /// Component name.
73    pub name: String,
74    /// Estimated heap bytes.
75    pub bytes: usize,
76    /// Number of items.
77    pub item_count: usize,
78}
79
80/// MVCC versioning overhead.
81#[derive(Debug, Clone, Default, Serialize, Deserialize)]
82pub struct MvccMemory {
83    /// Total MVCC overhead.
84    pub total_bytes: usize,
85    /// Version chain overhead for nodes.
86    pub node_version_chains_bytes: usize,
87    /// Version chain overhead for edges.
88    pub edge_version_chains_bytes: usize,
89    /// Average version chain depth.
90    pub average_chain_depth: f64,
91    /// Maximum version chain depth seen.
92    pub max_chain_depth: usize,
93}
94
95impl MvccMemory {
96    /// Recomputes `total_bytes` from child values.
97    pub fn compute_total(&mut self) {
98        self.total_bytes = self.node_version_chains_bytes + self.edge_version_chains_bytes;
99    }
100}
101
102/// Memory used by label/edge type registries.
103#[derive(Debug, Clone, Default, Serialize, Deserialize)]
104pub struct StringPoolMemory {
105    /// Total bytes for label/type registries.
106    pub total_bytes: usize,
107    /// Label registry (names + ID maps).
108    pub label_registry_bytes: usize,
109    /// Edge type registry (names + ID maps).
110    pub edge_type_registry_bytes: usize,
111    /// Number of interned labels.
112    pub label_count: usize,
113    /// Number of interned edge types.
114    pub edge_type_count: usize,
115}
116
117impl StringPoolMemory {
118    /// Recomputes `total_bytes` from child values.
119    pub fn compute_total(&mut self) {
120        self.total_bytes = self.label_registry_bytes + self.edge_type_registry_bytes;
121    }
122}