Mercurial > lbo > hg > leveldb-rs
view src/error.rs @ 387:2ac6eedcc9dc
db_impl: Use a BufWriter inside LogWriter
Unbuffered write-a-lot with 32768 entries written, first four iterations on a new DB:
usr=0.32 sys=0.12 elap=0.46
usr=0.47 sys=0.12 elap=0.60
usr=0.59 sys=0.11 elap=0.72
usr=0.50 sys=0.15 elap=0.67
Buffered write-a-lot with 32768 entries written, first four iterations on a new DB:
usr=0.22 sys=0.01 elap=0.24 (delta = -0.1/-0.11/-0.22)
usr=0.43 sys=0.03 elap=0.48 (delta = -0.04/-0.09/-0.12)
usr=0.54 sys=0.05 elap=0.62 (delta = -0.05/-0.06/-0.1)
usr=0.42 sys=0.03 elap=0.47 (delta = (-0.08/-0.12/-0.2)
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Mon, 09 Oct 2017 05:51:43 +0000 |
parents | 0c1c12771889 |
children | 4c3bc235f465 |
line wrap: on
line source
use std::convert::From; use std::error::Error; use std::fmt::{self, Display, Formatter}; use std::io; use std::result; use std::sync; #[derive(Clone, Debug, PartialEq)] #[allow(dead_code)] pub enum StatusCode { OK, AlreadyExists, Corruption, IOError, InvalidArgument, InvalidData, LockError, NotFound, NotSupported, PermissionDenied, Unknown, } #[derive(Clone, Debug, PartialEq)] pub struct Status { pub code: StatusCode, pub err: String, } impl Default for Status { fn default() -> Status { Status { code: StatusCode::OK, err: String::new(), } } } impl Display for Status { fn fmt(&self, fmt: &mut Formatter) -> result::Result<(), fmt::Error> { fmt.write_str(self.description()) } } impl Error for Status { fn description(&self) -> &str { &self.err } } impl Status { pub fn new(code: StatusCode, msg: &str) -> Status { let err; if msg.is_empty() { err = format!("{:?}", code) } else { err = format!("{:?}: {}", code, msg); } return Status { code: code, err: err, }; } } /// LevelDB's result type pub type Result<T> = result::Result<T, Status>; /// err returns a new Status wrapped in a Result. pub fn err<T>(code: StatusCode, msg: &str) -> Result<T> { Err(Status::new(code, msg)) } impl From<io::Error> for Status { fn from(e: io::Error) -> Status { let c = match e.kind() { io::ErrorKind::NotFound => StatusCode::NotFound, io::ErrorKind::InvalidData => StatusCode::Corruption, io::ErrorKind::InvalidInput => StatusCode::InvalidArgument, io::ErrorKind::PermissionDenied => StatusCode::PermissionDenied, _ => StatusCode::IOError, }; Status::new(c, e.description()) } } impl<T> From<sync::PoisonError<T>> for Status { fn from(_: sync::PoisonError<T>) -> Status { Status::new(StatusCode::LockError, "lock poisoned") } }