Skip to main content

commonware_storage/qmdb/sync/
error.rs

1//! Shared sync error types that can be used across different database implementations.
2
3use crate::{
4    merkle::{Family, Location},
5    qmdb::{self},
6};
7use commonware_cryptography::Digest;
8
9/// Errors from a [`Source`](crate::qmdb::sync::source::Source) when serving a request.
10#[derive(Debug, thiserror::Error)]
11pub enum ServeError<F: Family> {
12    #[error("source database error: {0}")]
13    Database(#[from] qmdb::Error<F>),
14    #[error("source missing")]
15    MissingSource,
16}
17
18#[derive(Debug, thiserror::Error)]
19pub enum EngineError<F: Family, D: Digest> {
20    /// Hash mismatch after sync
21    #[error("root digest mismatch - expected {expected:?}, got {actual:?}")]
22    RootMismatch { expected: D, actual: D },
23    /// The source served a response that cannot satisfy the target and is not accepting
24    /// feedback. Retrying cannot yield a different answer.
25    #[error("response failed validation and the source accepts no feedback")]
26    InvalidResponse,
27    /// Invalid target parameters
28    #[error("invalid bounds: lower bound {lower_bound_pos} > upper bound {upper_bound_pos}")]
29    InvalidTarget {
30        lower_bound_pos: Location<F>,
31        upper_bound_pos: Location<F>,
32    },
33    /// Invalid client state
34    #[error("invalid client state")]
35    InvalidState,
36    /// Sync target root unchanged
37    #[error("sync target root unchanged")]
38    SyncTargetRootUnchanged,
39    /// Sync stalled - no pending fetches
40    #[error("sync stalled - no pending fetches")]
41    SyncStalled,
42    /// Sync finish signal channel closed before finish was requested.
43    #[error("sync finish signal channel closed before finish was requested")]
44    FinishChannelClosed,
45}
46
47/// Errors that can occur during database synchronization.
48#[derive(Debug, thiserror::Error)]
49pub enum Error<F, U, D>
50where
51    F: Family,
52    U: std::error::Error + Send + 'static,
53    D: Digest,
54{
55    /// Database error
56    #[error("database error: {0}")]
57    Database(crate::qmdb::Error<F>),
58
59    /// Source error
60    #[error("source error: {0:?}")]
61    Source(U),
62
63    /// Engine error
64    #[error("engine error: {0}")]
65    Engine(EngineError<F, D>),
66}
67
68impl<F, T, U, D> From<T> for Error<F, U, D>
69where
70    F: Family,
71    U: std::error::Error + Send + 'static,
72    D: Digest,
73    T: Into<crate::qmdb::Error<F>>,
74{
75    fn from(err: T) -> Self {
76        Self::Database(err.into())
77    }
78}