Skip to content

Commit 09bd605

Browse files
committed
handle serde_json error
1 parent c207039 commit 09bd605

File tree

4 files changed

+33
-5
lines changed

4 files changed

+33
-5
lines changed

src/notes/kvs/Cargo.lock

Lines changed: 17 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/notes/kvs/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,4 @@ env_logger = "0.9.0"
1616
clap = "2.33.3"
1717
failure = "0.1.8"
1818
serde_json = "1.0.79"
19+
serde = { version="1.0.136", features = ["derive"]}

src/notes/kvs/src/error.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ pub enum KvsError {
1212
#[fail(display = "key not found")]
1313
KeyNotFound,
1414

15+
#[fail(display = "serde json error")]
16+
ToJsonErr(#[cause] serde_json::Error),
17+
1518
#[fail(display = "error: {}", reason)]
1619
CommonErr { reason: String },
1720
}
@@ -22,4 +25,11 @@ impl From<io::Error> for KvsError {
2225
}
2326
}
2427

28+
impl From<serde_json::Error> for KvsError {
29+
fn from(err: serde_json::Error) -> Self {
30+
KvsError::ToJsonErr(err)
31+
}
32+
}
33+
34+
2535
pub type Result<T> = std::result::Result<T, KvsError>;

src/notes/kvs/src/kv.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use super::util::HandyRwLock;
66
use crate::{KvsError, Result};
77
use indexmap::IndexMap;
8+
use serde::{Deserialize, Serialize};
89
use serde_json::Deserializer;
910
use std::{
1011
collections::{BTreeMap, HashMap},
@@ -75,7 +76,7 @@ fn log_path(dir: &Path, gen: u64) -> PathBuf {
7576
/// 通过文件序号,从对应的文件中读取指令并将其加载到内存中(BTreeMap)
7677
fn load(
7778
gen: u64,
78-
reader: BufReaderWithPos<File>,
79+
reader: &mut BufReaderWithPos<File>,
7980
index: &mut BTreeMap<String, CommandPos>,
8081
) -> Result<u64> {
8182
// 确定从文件的某个位置开始读
@@ -87,7 +88,7 @@ fn load(
8788
match cmd? {
8889
Command::Set { key, .. } => {
8990
if let Some(old_cmd) = index.insert(key, (gen, pos..new_pos).into()) {
90-
uncompacted += old_cmd.len();
91+
uncompacted += old_cmd.len;
9192
}
9293
}
9394
_ => {
@@ -99,6 +100,7 @@ fn load(
99100
Ok(uncompacted)
100101
}
101102

103+
#[derive(Debug, Deserialize, Serialize)]
102104
enum Command {
103105
Set { key: String, value: String },
104106
Remove { key: String },
@@ -128,7 +130,7 @@ impl<R: Seek + Read> Seek for BufReaderWithPos<R> {
128130
}
129131
}
130132

131-
impl <R: Seek + Read> Read for BufReaderWithPos<R> {
133+
impl<R: Seek + Read> Read for BufReaderWithPos<R> {
132134
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
133135
let len = self.reader.read(&mut buf)?;
134136
self.pos += len as u64;

0 commit comments

Comments
 (0)