use std::fmt;
use rocketmq_error::RocketMQError;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RocksDbErrorKind {
Open,
ColumnFamilyMissing,
ColumnFamilyCreate,
Read,
Write,
Batch,
Iterator,
Snapshot,
Property,
Flush,
Compaction,
Checkpoint,
Backup,
Restore,
Codec,
Corruption,
Reloading,
Closed,
InvalidConfig,
}
impl fmt::Display for RocksDbErrorKind {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{self:?}")
}
}
pub trait RocksDbResultExt<T> {
fn map_rocksdb(self, kind: RocksDbErrorKind) -> Result<T, RocketMQError>;
}
impl<T> RocksDbResultExt<T> for Result<T, ::rocksdb::Error> {
fn map_rocksdb(self, kind: RocksDbErrorKind) -> Result<T, RocketMQError> {
self.map_err(|error| match kind {
RocksDbErrorKind::Read
| RocksDbErrorKind::Iterator
| RocksDbErrorKind::Snapshot
| RocksDbErrorKind::Property => RocketMQError::storage_read_failed("rocksdb", format!("{kind}: {error}")),
RocksDbErrorKind::Corruption => RocketMQError::StorageCorrupted {
path: "rocksdb".to_string(),
},
RocksDbErrorKind::InvalidConfig => RocketMQError::ConfigInvalidValue {
key: "rocksdb",
value: String::new(),
reason: error.to_string(),
},
_ => RocketMQError::storage_write_failed("rocksdb", format!("{kind}: {error}")),
})
}
}
pub fn closed_error() -> RocketMQError {
RocketMQError::storage_write_failed("rocksdb", "store is closed")
}
pub fn reloading_error() -> RocketMQError {
RocketMQError::storage_write_failed("rocksdb", "store is reloading")
}
pub fn column_family_missing_error(name: &str) -> RocketMQError {
RocketMQError::storage_read_failed("rocksdb", format!("column family not found: {name}"))
}
pub fn codec_error(reason: impl Into<String>) -> RocketMQError {
RocketMQError::deserialization_failed("rocksdb-codec", reason)
}