ic_backup/ops/persistence/
mod.rs1mod artifact_commit;
4mod attempt_journal;
5mod command_lifetime_lock;
6mod consistency;
7mod download_journal;
8mod execution_progress;
9mod execution_settlement;
10mod execution_workflow;
11mod fence_obligation;
12mod immutable_record;
13mod journal_lock;
14mod journal_path;
15pub(crate) mod json;
16mod layout_lifetime;
17mod operation_plan;
18mod restore_reference_release;
19mod restore_safety;
20
21pub use artifact_commit::{ArtifactCommitOutcome, commit_artifact_directory};
22pub use attempt_journal::{AttemptJournalError, AttemptJournalGuard};
23pub use command_lifetime_lock::{
24 COMMAND_CUSTODY_DESCRIPTOR_ENV, CommandLifetimeLock, CommandLifetimeLockError,
25 CommandQuiescenceGuard,
26};
27pub use consistency::{
28 ConsistencyPersistenceError, create_consistency_requirement, read_consistency_requirement,
29};
30pub use download_journal::{
31 DownloadIntegrityError, DownloadJournalError, DownloadJournalGuard, DownloadManifestError,
32 LocalRestoreSourceError, read_download_manifest,
33};
34#[cfg(unix)]
35pub use download_journal::{
36 IcSnapshotArtifactError, IcSnapshotArtifactWriter, IcSnapshotDataUploadPreparationError,
37 IcSnapshotUploadArtifactError,
38};
39pub use execution_progress::{ExecutionProgressPersistenceError, read_execution_progress};
40pub use execution_settlement::{
41 ExecutionSettlementCheckpointError, ExecutionSettlementPersistenceError,
42 read_execution_settlement, reconcile_execution_settlement, replay_execution_settlement,
43};
44pub(crate) use execution_workflow::read_execution_stage_occupancy;
45pub use execution_workflow::{
46 ExecutionStageCheckpointError, ExecutionStageGuard, ExecutionStagePreparationError,
47 ExecutionStageResumeError, ExecutionStageSettlementView, ExecutionWorkflowPersistenceError,
48 ExecutionWorkflowProgressError, ExecutionWorkflowSettlementView, create_execution_workflow,
49 read_complete_execution_workflow, read_complete_execution_workflow_locked,
50 read_execution_workflow, read_execution_workflow_progress,
51};
52pub use fence_obligation::{
53 FenceObligationPersistenceError, FenceObligationRequirement, create_fence_obligation,
54 read_fence_obligation,
55};
56pub use journal_lock::{JournalLock, JournalLockError};
57pub(crate) use json::read_json;
58pub use layout_lifetime::{BackupLayoutGuard, MAX_RESTORE_REFERENCE_BYTES};
59pub use operation_plan::{
60 OperationPlanPersistenceError, create_operation_plan, read_operation_plan,
61};
62pub use restore_reference_release::{
63 MAX_RESTORE_TERMINAL_BYTES, RestoreReferenceReleaseError, RestoreReferenceReleaseOutcome,
64 RestoreTerminalEvidenceProvider,
65};
66pub use restore_safety::{
67 RestoreSafetyPersistenceError, create_restore_safety_requirement,
68 read_restore_safety_requirement,
69};
70
71use crate::{model::artifacts::ChecksumError, ops::artifacts::ArtifactError};
72use std::io;
73use thiserror::Error;
74
75#[derive(Debug, Error)]
77pub enum PersistenceError {
78 #[error("backup layout changed while held: {path:?}")]
80 LayoutChanged {
81 path: std::path::PathBuf,
83 },
84 #[error("unsafe restore reference entry: {path:?}")]
86 InvalidRestoreReferences {
87 path: std::path::PathBuf,
89 },
90 #[error(transparent)]
92 RestoreReference(#[from] crate::model::restore_references::RestoreReferenceError),
93 #[error(transparent)]
96 Io(#[from] io::Error),
97 #[error(transparent)]
100 Publication(#[from] ic_host_fs::durable::NamedWriteError<io::Error>),
101 #[error(transparent)]
103 Json(#[from] serde_json::Error),
104 #[error("record exceeds byte limit {limit}")]
106 RecordTooLarge {
107 limit: u64,
109 },
110 #[error(transparent)]
112 Artifact(#[from] ArtifactError),
113 #[error(transparent)]
115 Checksum(#[from] ChecksumError),
116 #[error("artifact commit paths must be distinct siblings: {temporary}, {canonical}")]
118 ArtifactCommitPathMismatch {
119 temporary: String,
121 canonical: String,
123 },
124 #[error("artifact commit has conflicting paths: {temporary}, {canonical}")]
126 ArtifactCommitPathConflict {
127 temporary: String,
129 canonical: String,
131 },
132 #[error("artifact commit is missing both paths: {temporary}, {canonical}")]
134 ArtifactCommitPathMissing {
135 temporary: String,
137 canonical: String,
139 },
140 #[error("durable artifact publication is unsupported on {platform}")]
142 ArtifactCommitUnsupportedPlatform {
143 platform: &'static str,
145 },
146 #[error("unsupported artifact entry at {path}: {kind}")]
148 UnsupportedArtifactEntry {
149 path: String,
151 kind: String,
153 },
154}