1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// Copyright (c) 2024-present, fjall-rs
// This source code is licensed under both the Apache 2.0 and MIT License
// (found in the LICENSE-* files in the repository)
use crate::{
journal::error::RecoveryError as JournalRecoveryError, version::FormatVersion, CompressionType,
};
/// Errors that may occur in the storage engine
#[derive(Debug)]
#[non_exhaustive]
pub enum Error {
/// Error inside LSM-tree
Storage(lsm_tree::Error),
/// I/O error
Io(std::io::Error),
/// Error during journal recovery
JournalRecovery(JournalRecoveryError),
/// Invalid or unparsable data format version
InvalidVersion(Option<FormatVersion>),
/// Decompression failed
Decompress(CompressionType),
/// Invalid journal trailer detected
InvalidTrailer,
/// Invalid tag detected during decoding
InvalidTag((&'static str, u8)),
/// A previous flush / commit operation failed, indicating a hardware-related failure
///
/// Future writes will not be accepted as consistency cannot be guaranteed.
///
/// **At this point, it's best to let the application crash and try to recover.**
///
/// More info: <https://www.usenix.org/system/files/atc20-rebello.pdf>
Poisoned,
/// Keyspace is deleted
KeyspaceDeleted,
/// Database is locked.
Locked,
/// Database is unrecoverable, see logs for details
Unrecoverable,
}
impl std::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "FjallError: {self:?}")
}
}
impl From<std::io::Error> for Error {
fn from(inner: std::io::Error) -> Self {
Self::Io(inner)
}
}
impl From<lsm_tree::Error> for Error {
fn from(inner: lsm_tree::Error) -> Self {
Self::Storage(inner)
}
}
impl std::error::Error for Error {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
Self::Storage(inner) => Some(inner),
Self::Io(inner) => Some(inner),
Self::JournalRecovery(inner) => Some(inner),
_ => None,
}
}
}
/// Result helper type
pub type Result<T> = std::result::Result<T, Error>;