Skip to main content

ps_datalake/
error.rs

1use std::{fmt::Display, num::TryFromIntError, sync::PoisonError};
2use thiserror::Error;
3
4#[derive(Error, Debug)]
5pub enum DataLakeError {
6    #[error(transparent)]
7    Alignment(#[from] AlignmentError),
8    #[error(transparent)]
9    DataStoreCorrupted(#[from] DataStoreCorrupted),
10    #[error("Hkey construction error: {0}")]
11    HkeyConstruction(#[from] ps_hkey::HkeyConstructionError),
12    #[error(transparent)]
13    Io(#[from] std::io::Error),
14    #[error(transparent)]
15    MmapMap(#[from] ps_mmap::MapError),
16    #[error("Tried to get a RW-handle on a read-only store.")]
17    MmapReadOnly,
18    #[error(transparent)]
19    Offset(#[from] OffsetError),
20    #[error(transparent)]
21    DataChunk(#[from] ps_datachunk::DataChunkError),
22    #[error(transparent)]
23    Hkey(#[from] ps_hkey::HkeyError),
24    #[error(transparent)]
25    TomlSer(#[from] Box<toml::ser::Error>),
26    #[error(transparent)]
27    TomlDeser(#[from] Box<toml::de::Error>),
28    #[error("Integer conversion error")]
29    TryFromInt(#[from] TryFromIntError),
30    #[error("Index out of range")]
31    Range,
32    #[error("DataChunk not found")]
33    NotFound,
34    #[error("Index overflowed - too many index buckets")]
35    IndexBucketOverflow,
36    #[error("The store being written to is read-only")]
37    DataStoreNotRw,
38    #[error("DataStore is out of space!")]
39    DataStoreOutOfSpace,
40    #[error("DataLake is out of available stores!")]
41    DataLakeOutOfStores,
42    #[error("Failed to acquire a poisoned mutex")]
43    MutexPoison,
44    #[error("Failed to store data")]
45    StorageFailure,
46    #[error("Invalid input format")]
47    Format,
48    #[error("To initialize a DataStore, please provision at least 64 kB of space.")]
49    InitFailedNotEnoughSpace(usize),
50}
51
52pub type Result<T> = std::result::Result<T, DataLakeError>;
53
54#[derive(Error, Debug)]
55pub struct AlignmentError;
56
57impl Display for AlignmentError {
58    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
59        f.write_str("DataStore is not memory-aligned properly.")
60    }
61}
62
63#[derive(Error, Debug)]
64pub enum OffsetError {
65    #[error(transparent)]
66    Alignment(#[from] AlignmentError),
67    #[error("Integer conversion error")]
68    TryFromInt(#[from] TryFromIntError),
69}
70
71impl<T> From<PoisonError<T>> for DataLakeError {
72    fn from(_: PoisonError<T>) -> Self {
73        Self::MutexPoison
74    }
75}
76
77impl From<ps_mmap::DerefError> for DataLakeError {
78    fn from(value: ps_mmap::DerefError) -> Self {
79        match value {
80            ps_mmap::DerefError::ReadOnly => Self::MmapReadOnly,
81        }
82    }
83}
84
85impl From<toml::ser::Error> for DataLakeError {
86    fn from(value: toml::ser::Error) -> Self {
87        Self::TomlSer(Box::from(value))
88    }
89}
90
91impl From<toml::de::Error> for DataLakeError {
92    fn from(value: toml::de::Error) -> Self {
93        Self::TomlDeser(Box::from(value))
94    }
95}
96
97#[derive(Clone, Debug, Error, Hash, PartialEq, Eq, PartialOrd, Ord)]
98pub enum DataStoreCorrupted {
99    #[error("DataStore has a size of {0} bytes")]
100    InvalidDataStoreSize(usize),
101    #[error("DataStore has an invalid file signature: {0}")]
102    InvalidMagic(String),
103    #[error("Index offset out of bounds: {0} > {1}")]
104    IndexOffsetOutOfBounds(u64, usize),
105    #[error("Data offset out of bounds: {0} > {1}")]
106    DataOffsetOutOfBounds(u64, usize),
107    #[error("Index ends out of bounds: {0} > {1}")]
108    IndexEndsOutOfBounds(usize, usize),
109    #[error("Data ends out of bounds: {0} > {1}")]
110    DataEndsOutOfBounds(usize, usize),
111    #[error("Index overlaps with data: {0} > {1}")]
112    IndexDataOverlap(usize, usize),
113    #[error("Index modulo {0} > index length {1}")]
114    IndexModuloTooSmall(u32, u32),
115}