mock tikv: distinguish between empty value and non-exsit keys; same behavior with TiKV

Signed-off-by: ekexium <ekexium@gmail.com>
This commit is contained in:
ekexium 2020-09-14 12:17:24 +08:00
parent ee999c50a6
commit 1bf9374939
3 changed files with 20 additions and 14 deletions

View File

@ -178,7 +178,11 @@ impl Tikv for MockTikv {
sink: grpcio::UnarySink<kvproto::kvrpcpb::RawGetResponse>, sink: grpcio::UnarySink<kvproto::kvrpcpb::RawGetResponse>,
) { ) {
let mut resp = RawGetResponse::default(); let mut resp = RawGetResponse::default();
resp.set_value(self.inner.raw_get(req.get_key())); if let Some(v) = self.inner.raw_get(req.get_key()) {
resp.set_value(v);
} else {
resp.set_not_found(true);
}
spawn_unary_success!(ctx, req, resp, sink); spawn_unary_success!(ctx, req, resp, sink);
} }

View File

@ -24,19 +24,23 @@ impl KvStore {
} }
} }
pub fn raw_get(&self, key: &[u8]) -> Vec<u8> { pub fn raw_get(&self, key: &[u8]) -> Option<Vec<u8>> {
let data = self.data.read().unwrap(); let data = self.data.read().unwrap();
data.get(key).map(|v| v.to_vec()).unwrap_or_else(Vec::new) data.get(key).map(|v| v.to_vec())
} }
pub fn raw_batch_get(&self, keys: &[Vec<u8>]) -> Vec<KvPair> { pub fn raw_batch_get(&self, keys: &[Vec<u8>]) -> Vec<KvPair> {
let data = self.data.read().unwrap(); let data = self.data.read().unwrap();
keys.iter() keys.iter()
.map(|key| { .filter_map(|key| {
let mut pair = KvPair::default(); if data.contains_key(key) {
pair.set_value(data.get(key).map(|v| v.to_vec()).unwrap_or_else(Vec::new)); let mut pair = KvPair::default();
pair.set_key(key.to_vec()); pair.set_value(data.get(key).map(|v| v.to_vec()).unwrap_or_else(Vec::new));
pair pair.set_key(key.to_vec());
Some(pair)
} else {
None
}
}) })
.collect() .collect()
} }

View File

@ -20,7 +20,7 @@ mod test {
// empty; get non-existent key // empty; get non-existent key
let res = client.get("k1".to_owned()).await; let res = client.get("k1".to_owned()).await;
assert_eq!(res.unwrap().unwrap(), vec![]); assert_eq!(res.unwrap(), None);
// empty; put then batch_get // empty; put then batch_get
let _ = client.put("k1".to_owned(), "v1".to_owned()).await.unwrap(); let _ = client.put("k1".to_owned(), "v1".to_owned()).await.unwrap();
@ -30,9 +30,9 @@ mod test {
.batch_get(vec!["k1".to_owned(), "k2".to_owned(), "k3".to_owned()]) .batch_get(vec!["k1".to_owned(), "k2".to_owned(), "k3".to_owned()])
.await .await
.unwrap(); .unwrap();
assert_eq!(res.len(), 2);
assert_eq!(res[0].1, "v1".as_bytes()); assert_eq!(res[0].1, "v1".as_bytes());
assert_eq!(res[1].1, "v2".as_bytes()); assert_eq!(res[1].1, "v2".as_bytes());
assert_eq!(res[2].1, "".as_bytes());
// k1,k2; batch_put then batch_get // k1,k2; batch_put then batch_get
let _ = client let _ = client
@ -58,7 +58,7 @@ mod test {
assert!(res.is_err()); assert!(res.is_err());
let res = client.get("k3".to_owned()).await; let res = client.get("k3".to_owned()).await;
assert_eq!(res.unwrap().unwrap(), "".as_bytes()); assert_eq!(res.unwrap(), None);
// k1,k2,k4; batch_delete then batch_get // k1,k2,k4; batch_delete then batch_get
let res = client let res = client
@ -75,9 +75,7 @@ mod test {
]) ])
.await .await
.unwrap(); .unwrap();
for i in 0..3 { assert_eq!(res.len(), 0);
assert_eq!(res[i].1, "".as_bytes());
}
debug!("Pass all tests"); debug!("Pass all tests");