mirror of
https://github.com/Cuprate/cuprate.git
synced 2024-12-23 03:59:31 +00:00
backend: impl From<heed::Error>
for RuntimeError
This commit is contained in:
parent
6eb0981829
commit
ddce2fa70c
3 changed files with 75 additions and 20 deletions
61
database/src/backend/heed/error.rs
Normal file
61
database/src/backend/heed/error.rs
Normal file
|
@ -0,0 +1,61 @@
|
|||
//! Conversion from `heed::Error` -> `cuprate_database::RuntimeError`.
|
||||
|
||||
//---------------------------------------------------------------------------------------------------- Import
|
||||
use std::borrow::Cow;
|
||||
|
||||
//---------------------------------------------------------------------------------------------------- Error
|
||||
impl From<heed::Error> for crate::RuntimeError {
|
||||
fn from(error: heed::Error) -> Self {
|
||||
use heed::Error as E1;
|
||||
use heed::MdbError as E2;
|
||||
|
||||
match error {
|
||||
// I/O errors.
|
||||
E1::Io(io_error) => Self::Io(io_error),
|
||||
|
||||
// LMDB errors.
|
||||
E1::Mdb(mdb_error) => match mdb_error {
|
||||
E2::KeyExist => Self::KeyExists,
|
||||
E2::NotFound => Self::KeyNotFound,
|
||||
E2::VersionMismatch => Self::VersionMismatch,
|
||||
E2::MapFull => Self::MapFull,
|
||||
E2::ReadersFull => Self::ReadersFull,
|
||||
E2::PageFull => Self::PageFull,
|
||||
E2::Other(c_int) => {
|
||||
Self::Unknown(Cow::Owned(format!("heed::Error::Other({c_int})")))
|
||||
}
|
||||
E2::DbsFull
|
||||
| E2::PageNotFound
|
||||
| E2::Corrupted
|
||||
| E2::Panic
|
||||
| E2::Invalid
|
||||
| E2::TlsFull
|
||||
| E2::TxnFull
|
||||
| E2::CursorFull
|
||||
| E2::MapResized
|
||||
| E2::Incompatible
|
||||
| E2::BadRslot
|
||||
| E2::BadTxn
|
||||
| E2::BadValSize
|
||||
| E2::BadDbi
|
||||
| E2::Problem => Self::Unknown(Cow::from(std::any::type_name_of_val(&mdb_error))),
|
||||
},
|
||||
|
||||
// Database is shutting down.
|
||||
E1::DatabaseClosing => Self::ShuttingDown,
|
||||
|
||||
// TODO: these will never occur once correct?
|
||||
// TODO: (de)serialization is infallible?
|
||||
E1::InvalidDatabaseTyping
|
||||
| E1::BadOpenOptions { .. }
|
||||
| E1::Encoding(_)
|
||||
| E1::Decoding(_) => unreachable!(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------------------------- Tests
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
// use super::*;
|
||||
}
|
|
@ -3,6 +3,8 @@
|
|||
mod env;
|
||||
pub use env::ConcreteEnv;
|
||||
|
||||
mod error;
|
||||
|
||||
mod database;
|
||||
|
||||
mod serde;
|
||||
|
|
|
@ -4,8 +4,6 @@
|
|||
//---------------------------------------------------------------------------------------------------- Import
|
||||
use std::{borrow::Cow, fmt::Debug};
|
||||
|
||||
use crate::constants::DATABASE_BACKEND;
|
||||
|
||||
//---------------------------------------------------------------------------------------------------- InitError
|
||||
/// Database errors that occur during initialization.
|
||||
///
|
||||
|
@ -45,18 +43,12 @@ pub enum InitError {
|
|||
#[derive(thiserror::Error, Debug)]
|
||||
pub enum RuntimeError {
|
||||
/// The given key already existed in the database.
|
||||
///
|
||||
/// The string inside is the output of
|
||||
/// [`std::any::type_name`] on the key type.
|
||||
#[error("key of type `{0}` already existed")]
|
||||
KeyExists(&'static str),
|
||||
#[error("key already existed")]
|
||||
KeyExists,
|
||||
|
||||
/// The given key did not exist in the database.
|
||||
///
|
||||
/// The string inside is the output of
|
||||
/// [`std::any::type_name`] on the key type.
|
||||
#[error("key/value pair was not found: {0}")]
|
||||
KeyNotFound(&'static str),
|
||||
#[error("key/value pair was not found")]
|
||||
KeyNotFound,
|
||||
|
||||
/// The database environment has reached
|
||||
/// maximum memory map size, it must be
|
||||
|
@ -76,21 +68,21 @@ pub enum RuntimeError {
|
|||
#[error("I/O error: {0}")]
|
||||
Io(#[from] std::io::Error),
|
||||
|
||||
/// The database is currently in the process
|
||||
/// of shutting down and cannot respond.
|
||||
#[error("database is shutting down")]
|
||||
ShuttingDown,
|
||||
|
||||
/// The expected database version was not the version found.
|
||||
#[error("database version mismatch: expected {expected}, found {found}")]
|
||||
VersionMismatch {
|
||||
/// The expected database version.
|
||||
expected: &'static str,
|
||||
/// The database version found.
|
||||
found: &'static str,
|
||||
},
|
||||
#[error("database version mismatch")]
|
||||
VersionMismatch,
|
||||
|
||||
/// The database has reached maximum parallel readers.
|
||||
///
|
||||
/// TODO: this can be used for retry logic in reader threads,
|
||||
/// although, does this error ever actually occur in practice?
|
||||
#[error("database maximum parallel readers reached")]
|
||||
MaxReaders,
|
||||
ReadersFull,
|
||||
|
||||
// TODO: this could be removed once we have all errors figured out.
|
||||
/// An unknown error occurred.
|
||||
|
|
Loading…
Reference in a new issue