From b56e480b3cd039b89af6295f68654b1d16efe9eb Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Mon, 30 Dec 2024 08:57:39 +0000 Subject: [PATCH] integrate some std io error kinds with our status code abstraction associate rocksdb error kinds with std io error kinds Signed-off-by: Jason Volk --- src/core/error/mod.rs | 1 + src/core/error/response.rs | 14 ++++++++++++++ src/database/util.rs | 26 ++++++++++++++++++++++++-- 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/core/error/mod.rs b/src/core/error/mod.rs index f38178e6..f1e3b924 100644 --- a/src/core/error/mod.rs +++ b/src/core/error/mod.rs @@ -178,6 +178,7 @@ impl Error { | Self::FeatureDisabled(..) => response::bad_request_code(&self.kind()), | Self::Reqwest(error) => error.status().unwrap_or(StatusCode::INTERNAL_SERVER_ERROR), | Self::Conflict(_) => StatusCode::CONFLICT, + | Self::Io(error) => response::io_error_code(error.kind()), | _ => StatusCode::INTERNAL_SERVER_ERROR, } } diff --git a/src/core/error/response.rs b/src/core/error/response.rs index 335fddab..ede1a05d 100644 --- a/src/core/error/response.rs +++ b/src/core/error/response.rs @@ -95,3 +95,17 @@ pub(super) fn ruma_error_message(error: &ruma::api::client::error::Error) -> Str pub(super) fn ruma_error_kind(e: &ruma::api::client::error::Error) -> &ErrorKind { e.error_kind().unwrap_or(&ErrorKind::Unknown) } + +pub(super) fn io_error_code(kind: std::io::ErrorKind) -> StatusCode { + use std::io::ErrorKind; + + match kind { + | ErrorKind::InvalidInput => StatusCode::BAD_REQUEST, + | ErrorKind::PermissionDenied => StatusCode::FORBIDDEN, + | ErrorKind::NotFound => StatusCode::NOT_FOUND, + | ErrorKind::TimedOut => StatusCode::GATEWAY_TIMEOUT, + | ErrorKind::FileTooLarge => StatusCode::PAYLOAD_TOO_LARGE, + | ErrorKind::StorageFull => StatusCode::INSUFFICIENT_STORAGE, + | _ => StatusCode::INTERNAL_SERVER_ERROR, + } +} diff --git a/src/database/util.rs b/src/database/util.rs index c2a020e3..caef94f1 100644 --- a/src/database/util.rs +++ b/src/database/util.rs @@ -1,4 +1,4 @@ -use conduwuit::{err, Result}; +use conduwuit::Result; use rocksdb::{Direction, ErrorKind, IteratorMode}; //#[cfg(debug_assertions)] @@ -51,6 +51,28 @@ pub(crate) fn or_else(e: rocksdb::Error) -> Result { Err pub(crate) fn is_incomplete(e: &rocksdb::Error) -> bool { e.kind() == ErrorKind::Incomplete } pub(crate) fn map_err(e: rocksdb::Error) -> conduwuit::Error { + let kind = io_error_kind(&e.kind()); let string = e.into_string(); - err!(Database(error!("{string}"))) + + std::io::Error::new(kind, string).into() +} + +fn io_error_kind(e: &ErrorKind) -> std::io::ErrorKind { + use std::io; + + match e { + | ErrorKind::NotFound => io::ErrorKind::NotFound, + | ErrorKind::Corruption => io::ErrorKind::InvalidData, + | ErrorKind::InvalidArgument => io::ErrorKind::InvalidInput, + | ErrorKind::Aborted => io::ErrorKind::Interrupted, + | ErrorKind::NotSupported => io::ErrorKind::Unsupported, + | ErrorKind::CompactionTooLarge => io::ErrorKind::FileTooLarge, + | ErrorKind::MergeInProgress | ErrorKind::Busy => io::ErrorKind::ResourceBusy, + | ErrorKind::Expired | ErrorKind::TimedOut => io::ErrorKind::TimedOut, + | ErrorKind::Incomplete | ErrorKind::TryAgain => io::ErrorKind::WouldBlock, + | ErrorKind::ColumnFamilyDropped + | ErrorKind::ShutdownInProgress + | ErrorKind::IOError + | ErrorKind::Unknown => io::ErrorKind::Other, + } }