@@ -13,6 +13,7 @@ use std::{
13
13
thread,
14
14
} ;
15
15
use tikv_client_pd:: Cluster ;
16
+ use tikv_client_proto:: kvrpcpb;
16
17
use tikv_client_store:: { KvClient , KvConnect , TikvConnect } ;
17
18
18
19
const CQ_COUNT : usize = 1 ;
@@ -53,8 +54,8 @@ pub trait PdClient: Send + Sync + 'static {
53
54
async fn update_safepoint ( self : Arc < Self > , safepoint : u64 ) -> Result < bool > ;
54
55
55
56
/// In transactional API, `key` is in raw format
56
- async fn store_for_key ( self : Arc < Self > , key : Key ) -> Result < Store > {
57
- let region = self . region_for_key ( & key) . await ?;
57
+ async fn store_for_key ( self : Arc < Self > , key : & Key ) -> Result < Store > {
58
+ let region = self . region_for_key ( key) . await ?;
58
59
self . map_region_to_store ( region) . await
59
60
}
60
61
@@ -63,23 +64,27 @@ pub trait PdClient: Send + Sync + 'static {
63
64
self . map_region_to_store ( region) . await
64
65
}
65
66
66
- fn group_keys_by_region < K : AsRef < Key > + Send + Sync + ' static > (
67
+ fn group_keys_by_region < K , K2 > (
67
68
self : Arc < Self > ,
68
69
keys : impl Iterator < Item = K > + Send + Sync + ' static ,
69
- ) -> BoxStream < ' static , Result < ( RegionId , Vec < K > ) > > {
70
+ ) -> BoxStream < ' static , Result < ( RegionId , Vec < K2 > ) > >
71
+ where
72
+ K : AsRef < Key > + Into < K2 > + Send + Sync + ' static ,
73
+ K2 : Send + Sync + ' static ,
74
+ {
70
75
let keys = keys. peekable ( ) ;
71
76
stream_fn ( keys, move |mut keys| {
72
77
let this = self . clone ( ) ;
73
78
async move {
74
79
if let Some ( key) = keys. next ( ) {
75
80
let region = this. region_for_key ( key. as_ref ( ) ) . await ?;
76
81
let id = region. id ( ) ;
77
- let mut grouped = vec ! [ key] ;
82
+ let mut grouped = vec ! [ key. into ( ) ] ;
78
83
while let Some ( key) = keys. peek ( ) {
79
84
if !region. contains ( key. as_ref ( ) ) {
80
85
break ;
81
86
}
82
- grouped. push ( keys. next ( ) . unwrap ( ) ) ;
87
+ grouped. push ( keys. next ( ) . unwrap ( ) . into ( ) ) ;
83
88
}
84
89
Ok ( Some ( ( keys, ( id, grouped) ) ) )
85
90
} else {
@@ -121,8 +126,8 @@ pub trait PdClient: Send + Sync + 'static {
121
126
/// Returns a Stream which iterates over the contexts for ranges in the same region.
122
127
fn group_ranges_by_region (
123
128
self : Arc < Self > ,
124
- mut ranges : Vec < BoundRange > ,
125
- ) -> BoxStream < ' static , Result < ( RegionId , Vec < BoundRange > ) > > {
129
+ mut ranges : Vec < kvrpcpb :: KeyRange > ,
130
+ ) -> BoxStream < ' static , Result < ( RegionId , Vec < kvrpcpb :: KeyRange > ) > > {
126
131
ranges. reverse ( ) ;
127
132
stream_fn ( Some ( ranges) , move |ranges| {
128
133
let this = self . clone ( ) ;
@@ -133,38 +138,42 @@ pub trait PdClient: Send + Sync + 'static {
133
138
} ;
134
139
135
140
if let Some ( range) = ranges. pop ( ) {
136
- let ( start_key, end_key) = range. clone ( ) . into_keys ( ) ;
141
+ let start_key: Key = range. start_key . clone ( ) . into ( ) ;
142
+ let end_key: Key = range. end_key . clone ( ) . into ( ) ;
137
143
let region = this. region_for_key ( & start_key) . await ?;
138
144
let id = region. id ( ) ;
139
145
let region_start = region. start_key ( ) ;
140
146
let region_end = region. end_key ( ) ;
141
147
let mut grouped = vec ! [ ] ;
142
- if !region_end. is_empty ( )
143
- && end_key
144
- . clone ( )
145
- . map ( |x| x > region_end || x. is_empty ( ) )
146
- . unwrap_or ( true )
147
- {
148
- grouped. push ( ( start_key, region_end. clone ( ) ) . into ( ) ) ;
149
- ranges. push ( ( region_end, end_key) . into ( ) ) ;
148
+ if !region_end. is_empty ( ) && ( end_key > region_end || end_key. is_empty ( ) ) {
149
+ grouped. push ( kvrpcpb:: KeyRange {
150
+ start_key : start_key. into ( ) ,
151
+ end_key : region_end. clone ( ) . into ( ) ,
152
+ } ) ;
153
+ ranges. push ( kvrpcpb:: KeyRange {
154
+ start_key : region_end. into ( ) ,
155
+ end_key : end_key. into ( ) ,
156
+ } ) ;
150
157
return Ok ( Some ( ( Some ( ranges) , ( id, grouped) ) ) ) ;
151
158
}
152
159
grouped. push ( range) ;
153
160
154
161
while let Some ( range) = ranges. pop ( ) {
155
- let ( start_key, end_key) = range. clone ( ) . into_keys ( ) ;
162
+ let start_key: Key = range. start_key . clone ( ) . into ( ) ;
163
+ let end_key: Key = range. end_key . clone ( ) . into ( ) ;
156
164
if start_key < region_start {
157
165
ranges. push ( range) ;
158
166
break ;
159
167
}
160
- if !region_end. is_empty ( )
161
- && end_key
162
- . clone ( )
163
- . map ( |x| x > region_end || x. is_empty ( ) )
164
- . unwrap_or ( true )
165
- {
166
- grouped. push ( ( start_key, region_end. clone ( ) ) . into ( ) ) ;
167
- ranges. push ( ( region_end, end_key) . into ( ) ) ;
168
+ if !region_end. is_empty ( ) && ( end_key > region_end || end_key. is_empty ( ) ) {
169
+ grouped. push ( kvrpcpb:: KeyRange {
170
+ start_key : start_key. into ( ) ,
171
+ end_key : region_end. clone ( ) . into ( ) ,
172
+ } ) ;
173
+ ranges. push ( kvrpcpb:: KeyRange {
174
+ start_key : region_end. into ( ) ,
175
+ end_key : end_key. into ( ) ,
176
+ } ) ;
168
177
return Ok ( Some ( ( Some ( ranges) , ( id, grouped) ) ) ) ;
169
178
}
170
179
grouped. push ( range) ;
@@ -204,7 +213,7 @@ impl<KvC: KvConnect + Send + Sync + 'static> PdClient for PdRpcClient<KvC> {
204
213
let store_id = region. get_store_id ( ) ?;
205
214
let store = self . pd . clone ( ) . get_store ( store_id) . await ?;
206
215
let kv_client = self . kv_client ( store. get_address ( ) ) ?;
207
- Ok ( Store :: new ( region, Box :: new ( kv_client) ) )
216
+ Ok ( Store :: new ( region, Arc :: new ( kv_client) ) )
208
217
}
209
218
210
219
async fn region_for_key ( & self , key : & Key ) -> Result < Region > {
@@ -351,8 +360,9 @@ pub mod test {
351
360
let stream = Arc :: new ( client) . group_keys_by_region ( tasks. into_iter ( ) ) ;
352
361
let mut stream = executor:: block_on_stream ( stream) ;
353
362
363
+ let result: Vec < Key > = stream. next ( ) . unwrap ( ) . unwrap ( ) . 1 ;
354
364
assert_eq ! (
355
- stream . next ( ) . unwrap ( ) . unwrap ( ) . 1 ,
365
+ result ,
356
366
vec![
357
367
vec![ 1 ] . into( ) ,
358
368
vec![ 2 ] . into( ) ,
@@ -388,15 +398,24 @@ pub mod test {
388
398
#[ test]
389
399
fn test_group_ranges_by_region ( ) {
390
400
let client = Arc :: new ( MockPdClient :: default ( ) ) ;
391
- let k1: Key = vec ! [ 1 ] . into ( ) ;
392
- let k2: Key = vec ! [ 5 , 2 ] . into ( ) ;
393
- let k3: Key = vec ! [ 11 , 4 ] . into ( ) ;
394
- let k4: Key = vec ! [ 16 , 4 ] . into ( ) ;
395
- let k_split: Key = vec ! [ 10 ] . into ( ) ;
396
- let range1 = ( k1. clone ( ) , k2. clone ( ) ) . into ( ) ;
397
- let range2 = ( k1. clone ( ) , k3. clone ( ) ) . into ( ) ;
398
- let range3 = ( k2. clone ( ) , k4. clone ( ) ) . into ( ) ;
399
- let ranges: Vec < BoundRange > = vec ! [ range1, range2, range3] ;
401
+ let k1 = vec ! [ 1 ] ;
402
+ let k2 = vec ! [ 5 , 2 ] ;
403
+ let k3 = vec ! [ 11 , 4 ] ;
404
+ let k4 = vec ! [ 16 , 4 ] ;
405
+ let k_split = vec ! [ 10 ] ;
406
+ let range1 = kvrpcpb:: KeyRange {
407
+ start_key : k1. clone ( ) ,
408
+ end_key : k2. clone ( ) ,
409
+ } ;
410
+ let range2 = kvrpcpb:: KeyRange {
411
+ start_key : k1. clone ( ) ,
412
+ end_key : k3. clone ( ) ,
413
+ } ;
414
+ let range3 = kvrpcpb:: KeyRange {
415
+ start_key : k2. clone ( ) ,
416
+ end_key : k4. clone ( ) ,
417
+ } ;
418
+ let ranges = vec ! [ range1, range2, range3] ;
400
419
401
420
let mut stream = executor:: block_on_stream ( client. group_ranges_by_region ( ranges) ) ;
402
421
let ranges1 = stream. next ( ) . unwrap ( ) . unwrap ( ) ;
@@ -408,22 +427,40 @@ pub mod test {
408
427
assert_eq ! (
409
428
ranges1. 1 ,
410
429
vec![
411
- ( k1. clone( ) , k2. clone( ) ) . into( ) ,
412
- ( k1, k_split. clone( ) ) . into( )
413
- ] as Vec <BoundRange >
430
+ kvrpcpb:: KeyRange {
431
+ start_key: k1. clone( ) ,
432
+ end_key: k2. clone( )
433
+ } ,
434
+ kvrpcpb:: KeyRange {
435
+ start_key: k1,
436
+ end_key: k_split. clone( )
437
+ }
438
+ ]
414
439
) ;
415
440
assert_eq ! ( ranges2. 0 , 2 ) ;
416
441
assert_eq ! (
417
442
ranges2. 1 ,
418
- vec![ ( k_split. clone( ) , k3) . into( ) ] as Vec <BoundRange >
443
+ vec![ kvrpcpb:: KeyRange {
444
+ start_key: k_split. clone( ) ,
445
+ end_key: k3
446
+ } ]
419
447
) ;
420
448
assert_eq ! ( ranges3. 0 , 1 ) ;
421
449
assert_eq ! (
422
450
ranges3. 1 ,
423
- vec![ ( k2, k_split. clone( ) ) . into( ) ] as Vec <BoundRange >
451
+ vec![ kvrpcpb:: KeyRange {
452
+ start_key: k2,
453
+ end_key: k_split. clone( )
454
+ } ]
424
455
) ;
425
456
assert_eq ! ( ranges4. 0 , 2 ) ;
426
- assert_eq ! ( ranges4. 1 , vec![ ( k_split, k4) . into( ) ] as Vec <BoundRange >) ;
457
+ assert_eq ! (
458
+ ranges4. 1 ,
459
+ vec![ kvrpcpb:: KeyRange {
460
+ start_key: k_split,
461
+ end_key: k4
462
+ } ]
463
+ ) ;
427
464
assert ! ( stream. next( ) . is_none( ) ) ;
428
465
}
429
466
}
0 commit comments