mirror of https://github.com/tikv/client-rust.git
test group_tasks_by_region (#86)
Signed-off-by: Nick Cameron <nrc@ncameron.org>
This commit is contained in:
parent
abc39fe10f
commit
010fd4bea0
|
|
@ -263,16 +263,17 @@ impl<PdC: PdClient> RpcClient<PdC> {
|
||||||
if tasks.is_empty() {
|
if tasks.is_empty() {
|
||||||
Either::Right(ready(Ok(None)))
|
Either::Right(ready(Ok(None)))
|
||||||
} else {
|
} else {
|
||||||
Either::Left(self.get_region(tasks[0].key()).map_ok(move |location| {
|
Either::Left(self.get_region(tasks[0].key()).map_ok(move |region| {
|
||||||
let ver_id = location.ver_id();
|
let id = region.id();
|
||||||
let mut grouped = Vec::new();
|
let mut grouped = Vec::new();
|
||||||
while let Some(task) = tasks.pop_front() {
|
while let Some(task) = tasks.pop_front() {
|
||||||
if !location.contains(task.key()) {
|
if !region.contains(task.key()) {
|
||||||
|
tasks.push_front(task);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
grouped.push(task);
|
grouped.push(task);
|
||||||
}
|
}
|
||||||
Some((tasks, (ver_id.id, grouped)))
|
Some((tasks, (id, grouped)))
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
@ -384,7 +385,8 @@ impl GroupingTask for (Key, Option<Key>) {
|
||||||
mod test {
|
mod test {
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::rpc::pd::Timestamp;
|
use crate::rpc::pd::Timestamp;
|
||||||
use futures::future::BoxFuture;
|
use futures::executor;
|
||||||
|
use futures::future::{ready, BoxFuture};
|
||||||
|
|
||||||
struct MockPdClient {}
|
struct MockPdClient {}
|
||||||
|
|
||||||
|
|
@ -398,8 +400,20 @@ mod test {
|
||||||
Ok(MockPdClient {})
|
Ok(MockPdClient {})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_region(self: Arc<Self>, _key: &[u8]) -> BoxFuture<'static, Result<Region>> {
|
fn get_region(self: Arc<Self>, key: &[u8]) -> BoxFuture<'static, Result<Region>> {
|
||||||
unimplemented!();
|
let region = if key.len() <= 1 {
|
||||||
|
let mut region = Region::default();
|
||||||
|
region.region.set_start_key(vec![0]);
|
||||||
|
region.region.set_end_key(vec![4]);
|
||||||
|
region
|
||||||
|
} else {
|
||||||
|
let mut region = Region::default();
|
||||||
|
region.region.set_start_key(vec![4]);
|
||||||
|
region.region.set_end_key(vec![8]);
|
||||||
|
region
|
||||||
|
};
|
||||||
|
|
||||||
|
Box::pin(ready(Ok(region)))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_region_by_id(self: Arc<Self>, _id: RegionId) -> BoxFuture<'static, Result<Region>> {
|
fn get_region_by_id(self: Arc<Self>, _id: RegionId) -> BoxFuture<'static, Result<Region>> {
|
||||||
|
|
@ -448,4 +462,30 @@ mod test {
|
||||||
assert!(&*kv1 as *const _ != &*kv2 as *const _);
|
assert!(&*kv1 as *const _ != &*kv2 as *const _);
|
||||||
assert_eq!(&*kv2 as *const _, &*kv3 as *const _);
|
assert_eq!(&*kv2 as *const _, &*kv3 as *const _);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_group_tasks_by_region() {
|
||||||
|
let client = mock_rpc_client();
|
||||||
|
|
||||||
|
let tasks: Vec<Key> = vec![
|
||||||
|
vec![1].into(),
|
||||||
|
vec![2].into(),
|
||||||
|
vec![3].into(),
|
||||||
|
vec![5, 1].into(),
|
||||||
|
vec![5, 2].into(),
|
||||||
|
];
|
||||||
|
|
||||||
|
let stream = Arc::new(client).group_tasks_by_region(tasks);
|
||||||
|
let mut stream = executor::block_on_stream(stream);
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
stream.next().unwrap().unwrap().1,
|
||||||
|
vec![vec![1].into(), vec![2].into(), vec![3].into()]
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
stream.next().unwrap().unwrap().1,
|
||||||
|
vec![vec![5, 1].into(), vec![5, 2].into()]
|
||||||
|
);
|
||||||
|
assert!(stream.next().is_none());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ impl Region {
|
||||||
let key: &[u8] = key.into();
|
let key: &[u8] = key.into();
|
||||||
let start_key = self.region.get_start_key();
|
let start_key = self.region.get_start_key();
|
||||||
let end_key = self.region.get_end_key();
|
let end_key = self.region.get_end_key();
|
||||||
start_key <= key && (end_key > key || end_key.is_empty())
|
key >= start_key && (key < end_key || end_key.is_empty())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn context(&self) -> Result<kvrpcpb::Context> {
|
pub fn context(&self) -> Result<kvrpcpb::Context> {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue