1use crate::{
2 LedgerCommitError, PolicyIdentity, PolicyIdentityError, StableCellLedgerError,
3 registry::StaticMemoryDeclarationError, slot::MemoryManagerRangeAuthorityError,
4};
5
6#[non_exhaustive]
15#[derive(Clone, Copy, Debug, Eq, thiserror::Error, PartialEq)]
16pub enum RuntimeGrowError {
17 #[error("virtual memory page count overflows")]
19 ArithmeticOverflow,
20 #[error("growth requires {required_buckets} buckets, exceeding capacity {capacity}")]
22 BucketExhausted {
23 required_buckets: u64,
24 capacity: u16,
25 },
26 #[error("backing memory refused growth by {additional_pages} pages")]
28 BackingRefused { additional_pages: u64 },
29 #[error("runtime memory growth is already in progress")]
31 ReentrantAccess,
32}
33
34#[non_exhaustive]
42#[derive(Clone, Copy, Debug, Eq, thiserror::Error, PartialEq)]
43pub enum RuntimeConstructionError {
44 #[error(transparent)]
46 Growth(#[from] RuntimeGrowError),
47 #[error("bucket size must be nonzero")]
49 InvalidBucketSize,
50 #[error("persisted bucket size {persisted} pages differs from requested {requested}")]
52 BucketSizeMismatch { persisted: u16, requested: u16 },
53 #[error(transparent)]
55 Layout(#[from] super::MemoryManagerLayoutError),
56 #[error(
58 "nonempty backing memory is not an ic-stable-structures MemoryManager \
59 (expected magic 'MGR', found bytes {observed_magic:?})"
60 )]
61 ForeignMemory {
62 observed_magic: [u8; 3],
64 },
65 #[error(
67 "unsupported ic-stable-structures MemoryManager layout version {observed}; \
68 expected {supported}"
69 )]
70 UnsupportedMemoryManagerVersion {
71 observed: u8,
73 supported: u8,
75 },
76}
77
78#[non_exhaustive]
85#[derive(Clone, Copy, Debug, Eq, thiserror::Error, PartialEq)]
86pub enum RuntimeStateError {
87 #[error(transparent)]
89 Construction(#[from] RuntimeConstructionError),
90 #[error("ic-memory default runtime is already borrowed by an active operation")]
92 ReentrantAccess,
93 #[error("ic-memory default runtime is unavailable during thread-local destruction")]
95 Unavailable,
96}
97
98#[non_exhaustive]
105#[derive(Debug, thiserror::Error)]
106pub enum RuntimeBootstrapError<P> {
107 #[error(transparent)]
109 Admission(#[from] super::BootstrapAdmissionError),
110 #[error("bootstrap admission policy rejected recovered allocation metadata")]
112 AdmissionPolicy(P),
113 #[error(transparent)]
114 Resolution(#[from] MemoryResolutionError),
115 #[error(transparent)]
117 PolicyIdentity(#[from] PolicyIdentityError),
118 #[error("runtime bootstrap declaration snapshot differs from the established binding")]
120 DeclarationSnapshotMismatch,
121 #[error("runtime bootstrap policy identity changed from {established:?} to {requested:?}")]
123 PolicyIdentityMismatch {
124 established: PolicyIdentity,
126 requested: PolicyIdentity,
128 },
129 #[error(transparent)]
131 Registry(#[from] StaticMemoryDeclarationError),
132 #[error(transparent)]
134 LedgerCommit(#[from] crate::LedgerCommitError),
135 #[error(transparent)]
137 StableCellLedger(#[from] StableCellLedgerError),
138 #[error("stable-cell ledger record size {value_size} cannot be written to stable memory")]
140 StableCellLedgerWriteTooLarge {
141 value_size: usize,
143 },
144 #[error(transparent)]
146 LedgerGrowth(#[from] RuntimeGrowError),
147 #[error(transparent)]
149 Validation(#[from] crate::AllocationValidationError<RuntimePolicyError<P>>),
150 #[error(transparent)]
152 Staging(#[from] crate::AllocationStageError),
153 #[error(transparent)]
155 State(#[from] RuntimeStateError),
156}
157
158#[non_exhaustive]
165#[derive(Clone, Debug, Eq, thiserror::Error, PartialEq)]
166pub enum RuntimeOpenError {
167 #[error("ic-memory runtime has not completed bootstrap validation")]
169 NotBootstrapped,
170 #[error(transparent)]
172 State(#[from] RuntimeStateError),
173 #[error(transparent)]
175 StableKey(#[from] crate::StableKeyError),
176 #[error("stable key '{0}' was not committed by ic-memory runtime bootstrap")]
178 StableKeyNotCommitted(String),
179 #[error("stable key '{stable_key}' is reserved for ic-memory runtime governance")]
181 ReservedStableKey {
182 stable_key: String,
184 },
185 #[error(
187 "stable key '{stable_key}' is committed for MemoryManager ID {committed_id}, not requested ID {requested_id}"
188 )]
189 MemoryIdMismatch {
190 stable_key: String,
192 committed_id: u8,
194 requested_id: u8,
196 },
197}
198
199#[non_exhaustive]
206#[derive(Debug, thiserror::Error)]
207pub enum RuntimeDiagnosticError {
208 #[error(transparent)]
210 Construction(#[from] RuntimeConstructionError),
211 #[error("ic-memory runtime has not completed bootstrap validation")]
213 NotBootstrapped,
214 #[error(transparent)]
216 Registry(#[from] StaticMemoryDeclarationError),
217 #[error(transparent)]
219 State(#[from] RuntimeStateError),
220 #[error(transparent)]
222 LedgerCommit(#[from] LedgerCommitError),
223 #[error(transparent)]
225 StableCellLedger(#[from] StableCellLedgerError),
226}
227
228#[non_exhaustive]
235#[derive(Clone, Debug, Eq, thiserror::Error, PartialEq)]
236pub enum RuntimePolicyError<P> {
237 #[error(transparent)]
239 Range(#[from] MemoryManagerRangeAuthorityError),
240 #[error(transparent)]
242 Custom(P),
243}
244
245#[non_exhaustive]
252#[derive(Debug, thiserror::Error)]
253pub enum MemoryResolutionError {
254 #[error("no eligible free slot for {stable_key} under authority {authority}")]
255 Exhausted {
256 stable_key: crate::StableKey,
257 authority: String,
258 },
259 #[error(transparent)]
260 Range(#[from] crate::MemoryManagerRangeAuthorityError),
261 #[error(transparent)]
262 Registry(#[from] StaticMemoryDeclarationError),
263}