@@ -15,9 +15,13 @@ use crate::pd::PdClient;
15
15
use crate :: pd:: PdRpcClient ;
16
16
use crate :: proto:: metapb;
17
17
use crate :: raw:: lowering:: * ;
18
+ use crate :: request:: APIVersion ;
18
19
use crate :: request:: Collect ;
19
20
use crate :: request:: CollectSingle ;
21
+ use crate :: request:: EncodeVersion ;
22
+ use crate :: request:: KeyMode ;
20
23
use crate :: request:: Plan ;
24
+ use crate :: request:: TruncateVersion ;
21
25
use crate :: Backoff ;
22
26
use crate :: BoundRange ;
23
27
use crate :: ColumnFamily ;
@@ -41,6 +45,7 @@ pub struct Client<PdC: PdClient = PdRpcClient> {
41
45
backoff : Backoff ,
42
46
/// Whether to use the [`atomic mode`](Client::with_atomic_for_cas).
43
47
atomic : bool ,
48
+ api_version : APIVersion ,
44
49
}
45
50
46
51
impl Clone for Client {
@@ -50,6 +55,7 @@ impl Clone for Client {
50
55
cf : self . cf . clone ( ) ,
51
56
backoff : self . backoff . clone ( ) ,
52
57
atomic : self . atomic ,
58
+ api_version : self . api_version ,
53
59
}
54
60
}
55
61
}
@@ -100,12 +106,13 @@ impl Client<PdRpcClient> {
100
106
config : Config ,
101
107
) -> Result < Self > {
102
108
let pd_endpoints: Vec < String > = pd_endpoints. into_iter ( ) . map ( Into :: into) . collect ( ) ;
103
- let rpc = Arc :: new ( PdRpcClient :: connect ( & pd_endpoints, config, false ) . await ?) ;
109
+ let rpc = Arc :: new ( PdRpcClient :: connect ( & pd_endpoints, config. clone ( ) , false ) . await ?) ;
104
110
Ok ( Client {
105
111
rpc,
106
112
cf : None ,
107
113
backoff : DEFAULT_REGION_BACKOFF ,
108
114
atomic : false ,
115
+ api_version : APIVersion :: V1 ,
109
116
} )
110
117
}
111
118
@@ -140,6 +147,7 @@ impl Client<PdRpcClient> {
140
147
cf : Some ( cf) ,
141
148
backoff : self . backoff . clone ( ) ,
142
149
atomic : self . atomic ,
150
+ api_version : self . api_version ,
143
151
}
144
152
}
145
153
@@ -168,6 +176,7 @@ impl Client<PdRpcClient> {
168
176
cf : self . cf . clone ( ) ,
169
177
backoff,
170
178
atomic : self . atomic ,
179
+ api_version : self . api_version ,
171
180
}
172
181
}
173
182
@@ -185,6 +194,20 @@ impl Client<PdRpcClient> {
185
194
cf : self . cf . clone ( ) ,
186
195
backoff : self . backoff . clone ( ) ,
187
196
atomic : true ,
197
+ api_version : self . api_version ,
198
+ }
199
+ }
200
+
201
+ /// Set the API version to use.
202
+ #[ must_use]
203
+ pub fn with_keyspace ( & self , keyspace : String ) -> Self {
204
+ // FIXME
205
+ Client {
206
+ rpc : self . rpc . clone ( ) ,
207
+ cf : self . cf . clone ( ) ,
208
+ backoff : self . backoff . clone ( ) ,
209
+ atomic : self . atomic ,
210
+ api_version : APIVersion :: V2 { keyspace_id : 0 } ,
188
211
}
189
212
}
190
213
}
@@ -210,8 +233,9 @@ impl<PdC: PdClient> Client<PdC> {
210
233
/// ```
211
234
pub async fn get ( & self , key : impl Into < Key > ) -> Result < Option < Value > > {
212
235
debug ! ( "invoking raw get request" ) ;
213
- let request = new_raw_get_request ( key. into ( ) , self . cf . clone ( ) ) ;
214
- let plan = crate :: request:: PlanBuilder :: new ( self . rpc . clone ( ) , request)
236
+ let key = key. into ( ) . encode_version ( self . api_version , KeyMode :: Raw ) ;
237
+ let request = new_raw_get_request ( key, self . cf . clone ( ) ) ;
238
+ let plan = crate :: request:: PlanBuilder :: new ( self . rpc . clone ( ) , self . api_version , request)
215
239
. retry_multi_region ( self . backoff . clone ( ) )
216
240
. merge ( CollectSingle )
217
241
. post_process_default ( )
@@ -242,14 +266,19 @@ impl<PdC: PdClient> Client<PdC> {
242
266
keys : impl IntoIterator < Item = impl Into < Key > > ,
243
267
) -> Result < Vec < KvPair > > {
244
268
debug ! ( "invoking raw batch_get request" ) ;
245
- let request = new_raw_batch_get_request ( keys. into_iter ( ) . map ( Into :: into) , self . cf . clone ( ) ) ;
246
- let plan = crate :: request:: PlanBuilder :: new ( self . rpc . clone ( ) , request)
269
+ let keys = keys
270
+ . into_iter ( )
271
+ . map ( |k| k. into ( ) . encode_version ( self . api_version , KeyMode :: Raw ) ) ;
272
+ let request = new_raw_batch_get_request ( keys, self . cf . clone ( ) ) ;
273
+ let plan = crate :: request:: PlanBuilder :: new ( self . rpc . clone ( ) , self . api_version , request)
247
274
. retry_multi_region ( self . backoff . clone ( ) )
248
275
. merge ( Collect )
249
276
. plan ( ) ;
250
- plan. execute ( )
251
- . await
252
- . map ( |r| r. into_iter ( ) . map ( Into :: into) . collect ( ) )
277
+ plan. execute ( ) . await . map ( |r| {
278
+ r. into_iter ( )
279
+ . map ( |pair| pair. truncate_version ( self . api_version ) )
280
+ . collect ( )
281
+ } )
253
282
}
254
283
255
284
/// Create a new 'put' request.
@@ -270,8 +299,9 @@ impl<PdC: PdClient> Client<PdC> {
270
299
/// ```
271
300
pub async fn put ( & self , key : impl Into < Key > , value : impl Into < Value > ) -> Result < ( ) > {
272
301
debug ! ( "invoking raw put request" ) ;
273
- let request = new_raw_put_request ( key. into ( ) , value. into ( ) , self . cf . clone ( ) , self . atomic ) ;
274
- let plan = crate :: request:: PlanBuilder :: new ( self . rpc . clone ( ) , request)
302
+ let key = key. into ( ) . encode_version ( self . api_version , KeyMode :: Raw ) ;
303
+ let request = new_raw_put_request ( key, value. into ( ) , self . cf . clone ( ) , self . atomic ) ;
304
+ let plan = crate :: request:: PlanBuilder :: new ( self . rpc . clone ( ) , self . api_version , request)
275
305
. retry_multi_region ( self . backoff . clone ( ) )
276
306
. merge ( CollectSingle )
277
307
. extract_error ( )
@@ -302,12 +332,11 @@ impl<PdC: PdClient> Client<PdC> {
302
332
pairs : impl IntoIterator < Item = impl Into < KvPair > > ,
303
333
) -> Result < ( ) > {
304
334
debug ! ( "invoking raw batch_put request" ) ;
305
- let request = new_raw_batch_put_request (
306
- pairs. into_iter ( ) . map ( Into :: into) ,
307
- self . cf . clone ( ) ,
308
- self . atomic ,
309
- ) ;
310
- let plan = crate :: request:: PlanBuilder :: new ( self . rpc . clone ( ) , request)
335
+ let pairs = pairs
336
+ . into_iter ( )
337
+ . map ( |pair| pair. into ( ) . encode_version ( self . api_version , KeyMode :: Raw ) ) ;
338
+ let request = new_raw_batch_put_request ( pairs, self . cf . clone ( ) , self . atomic ) ;
339
+ let plan = crate :: request:: PlanBuilder :: new ( self . rpc . clone ( ) , self . api_version , request)
311
340
. retry_multi_region ( self . backoff . clone ( ) )
312
341
. extract_error ( )
313
342
. plan ( ) ;
@@ -334,8 +363,9 @@ impl<PdC: PdClient> Client<PdC> {
334
363
/// ```
335
364
pub async fn delete ( & self , key : impl Into < Key > ) -> Result < ( ) > {
336
365
debug ! ( "invoking raw delete request" ) ;
337
- let request = new_raw_delete_request ( key. into ( ) , self . cf . clone ( ) , self . atomic ) ;
338
- let plan = crate :: request:: PlanBuilder :: new ( self . rpc . clone ( ) , request)
366
+ let key = key. into ( ) . encode_version ( self . api_version , KeyMode :: Raw ) ;
367
+ let request = new_raw_delete_request ( key, self . cf . clone ( ) , self . atomic ) ;
368
+ let plan = crate :: request:: PlanBuilder :: new ( self . rpc . clone ( ) , self . api_version , request)
339
369
. retry_multi_region ( self . backoff . clone ( ) )
340
370
. merge ( CollectSingle )
341
371
. extract_error ( )
@@ -364,9 +394,11 @@ impl<PdC: PdClient> Client<PdC> {
364
394
pub async fn batch_delete ( & self , keys : impl IntoIterator < Item = impl Into < Key > > ) -> Result < ( ) > {
365
395
debug ! ( "invoking raw batch_delete request" ) ;
366
396
self . assert_non_atomic ( ) ?;
367
- let request =
368
- new_raw_batch_delete_request ( keys. into_iter ( ) . map ( Into :: into) , self . cf . clone ( ) ) ;
369
- let plan = crate :: request:: PlanBuilder :: new ( self . rpc . clone ( ) , request)
397
+ let keys = keys
398
+ . into_iter ( )
399
+ . map ( |k| k. into ( ) . encode_version ( self . api_version , KeyMode :: Raw ) ) ;
400
+ let request = new_raw_batch_delete_request ( keys, self . cf . clone ( ) ) ;
401
+ let plan = crate :: request:: PlanBuilder :: new ( self . rpc . clone ( ) , self . api_version , request)
370
402
. retry_multi_region ( self . backoff . clone ( ) )
371
403
. extract_error ( )
372
404
. plan ( ) ;
@@ -392,8 +424,9 @@ impl<PdC: PdClient> Client<PdC> {
392
424
pub async fn delete_range ( & self , range : impl Into < BoundRange > ) -> Result < ( ) > {
393
425
debug ! ( "invoking raw delete_range request" ) ;
394
426
self . assert_non_atomic ( ) ?;
395
- let request = new_raw_delete_range_request ( range. into ( ) , self . cf . clone ( ) ) ;
396
- let plan = crate :: request:: PlanBuilder :: new ( self . rpc . clone ( ) , request)
427
+ let range = range. into ( ) . encode_version ( self . api_version , KeyMode :: Raw ) ;
428
+ let request = new_raw_delete_range_request ( range, self . cf . clone ( ) ) ;
429
+ let plan = crate :: request:: PlanBuilder :: new ( self . rpc . clone ( ) , self . api_version , request)
397
430
. retry_multi_region ( self . backoff . clone ( ) )
398
431
. extract_error ( )
399
432
. plan ( ) ;
@@ -543,13 +576,14 @@ impl<PdC: PdClient> Client<PdC> {
543
576
) -> Result < ( Option < Value > , bool ) > {
544
577
debug ! ( "invoking raw compare_and_swap request" ) ;
545
578
self . assert_atomic ( ) ?;
579
+ let key = key. into ( ) . encode_version ( self . api_version , KeyMode :: Raw ) ;
546
580
let req = new_cas_request (
547
- key. into ( ) ,
581
+ key,
548
582
new_value. into ( ) ,
549
583
previous_value. into ( ) ,
550
584
self . cf . clone ( ) ,
551
585
) ;
552
- let plan = crate :: request:: PlanBuilder :: new ( self . rpc . clone ( ) , req)
586
+ let plan = crate :: request:: PlanBuilder :: new ( self . rpc . clone ( ) , self . api_version , req)
553
587
. retry_multi_region ( self . backoff . clone ( ) )
554
588
. merge ( CollectSingle )
555
589
. post_process_default ( )
@@ -563,16 +597,29 @@ impl<PdC: PdClient> Client<PdC> {
563
597
copr_version_req : impl Into < String > ,
564
598
ranges : impl IntoIterator < Item = impl Into < BoundRange > > ,
565
599
request_builder : impl Fn ( metapb:: Region , Vec < Range < Key > > ) -> Vec < u8 > + Send + Sync + ' static ,
566
- ) -> Result < Vec < ( Vec < u8 > , Vec < Range < Key > > ) > > {
600
+ ) -> Result < Vec < ( Vec < Range < Key > > , Vec < u8 > ) > > {
567
601
let copr_version_req = copr_version_req. into ( ) ;
568
602
semver:: VersionReq :: from_str ( & copr_version_req) ?;
603
+ let ranges = ranges
604
+ . into_iter ( )
605
+ . map ( |range| range. into ( ) . encode_version ( self . api_version , KeyMode :: Raw ) ) ;
606
+ let api_version = self . api_version ;
607
+ let request_builder = move |region, ranges : Vec < Range < Key > > | {
608
+ request_builder (
609
+ region,
610
+ ranges
611
+ . into_iter ( )
612
+ . map ( |range| range. truncate_version ( api_version) )
613
+ . collect ( ) ,
614
+ )
615
+ } ;
569
616
let req = new_raw_coprocessor_request (
570
617
copr_name. into ( ) ,
571
618
copr_version_req,
572
- ranges. into_iter ( ) . map ( Into :: into ) ,
619
+ ranges,
573
620
request_builder,
574
621
) ;
575
- let plan = crate :: request:: PlanBuilder :: new ( self . rpc . clone ( ) , req)
622
+ let plan = crate :: request:: PlanBuilder :: new ( self . rpc . clone ( ) , self . api_version , req)
576
623
. preserve_shard ( )
577
624
. retry_multi_region ( self . backoff . clone ( ) )
578
625
. post_process_default ( )
@@ -592,8 +639,9 @@ impl<PdC: PdClient> Client<PdC> {
592
639
max_limit : MAX_RAW_KV_SCAN_LIMIT ,
593
640
} ) ;
594
641
}
642
+
643
+ let mut cur_range = range. into ( ) . encode_version ( self . api_version , KeyMode :: Raw ) ;
595
644
let mut result = Vec :: new ( ) ;
596
- let mut cur_range = range. into ( ) ;
597
645
let mut scan_regions = self . rpc . clone ( ) . stores_for_range ( cur_range. clone ( ) ) . boxed ( ) ;
598
646
let mut region_store =
599
647
scan_regions
@@ -603,22 +651,25 @@ impl<PdC: PdClient> Client<PdC> {
603
651
range : ( cur_range. clone ( ) ) ,
604
652
} ) ??;
605
653
let mut cur_limit = limit;
654
+
606
655
while cur_limit > 0 {
607
656
let request =
608
657
new_raw_scan_request ( cur_range. clone ( ) , cur_limit, key_only, self . cf . clone ( ) ) ;
609
- let resp = crate :: request:: PlanBuilder :: new ( self . rpc . clone ( ) , request)
610
- . single_region_with_store ( region_store. clone ( ) )
611
- . await ?
612
- . plan ( )
613
- . execute ( )
614
- . await ?;
658
+ let resp =
659
+ crate :: request:: PlanBuilder :: new ( self . rpc . clone ( ) , self . api_version , request)
660
+ . single_region_with_store ( region_store. clone ( ) )
661
+ . await ?
662
+ . plan ( )
663
+ . execute ( )
664
+ . await ?;
615
665
let mut region_scan_res = resp
616
666
. kvs
617
667
. into_iter ( )
618
668
. map ( Into :: into)
619
669
. collect :: < Vec < KvPair > > ( ) ;
620
670
let res_len = region_scan_res. len ( ) ;
621
671
result. append ( & mut region_scan_res) ;
672
+
622
673
// if the number of results is less than cur_limit, it means this scan range contains more than one region, so we need to scan next region
623
674
if res_len < cur_limit as usize {
624
675
region_store = match scan_regions. next ( ) . await {
@@ -637,8 +688,13 @@ impl<PdC: PdClient> Client<PdC> {
637
688
break ;
638
689
}
639
690
}
691
+
640
692
// limit is a soft limit, so we need check the number of results
641
693
result. truncate ( limit as usize ) ;
694
+
695
+ // truncate the version of keys
696
+ let result = result. truncate_version ( self . api_version ) ;
697
+
642
698
Ok ( result)
643
699
}
644
700
@@ -655,17 +711,20 @@ impl<PdC: PdClient> Client<PdC> {
655
711
} ) ;
656
712
}
657
713
658
- let request = new_raw_batch_scan_request (
659
- ranges. into_iter ( ) . map ( Into :: into) ,
660
- each_limit,
661
- key_only,
662
- self . cf . clone ( ) ,
663
- ) ;
664
- let plan = crate :: request:: PlanBuilder :: new ( self . rpc . clone ( ) , request)
714
+ let ranges = ranges
715
+ . into_iter ( )
716
+ . map ( |range| range. into ( ) . encode_version ( self . api_version , KeyMode :: Raw ) ) ;
717
+
718
+ let request = new_raw_batch_scan_request ( ranges, each_limit, key_only, self . cf . clone ( ) ) ;
719
+ let plan = crate :: request:: PlanBuilder :: new ( self . rpc . clone ( ) , self . api_version , request)
665
720
. retry_multi_region ( self . backoff . clone ( ) )
666
721
. merge ( Collect )
667
722
. plan ( ) ;
668
- plan. execute ( ) . await
723
+ plan. execute ( ) . await . map ( |r| {
724
+ r. into_iter ( )
725
+ . map ( |pair| pair. truncate_version ( self . api_version ) )
726
+ . collect ( )
727
+ } )
669
728
}
670
729
671
730
fn assert_non_atomic ( & self ) -> Result < ( ) > {
@@ -718,6 +777,7 @@ mod tests {
718
777
cf : Some ( ColumnFamily :: Default ) ,
719
778
backoff : DEFAULT_REGION_BACKOFF ,
720
779
atomic : false ,
780
+ api_version : APIVersion :: V1 ,
721
781
} ;
722
782
let resps = client
723
783
. coprocessor (
@@ -729,25 +789,25 @@ mod tests {
729
789
. await ?;
730
790
let resps: Vec < _ > = resps
731
791
. into_iter ( )
732
- . map ( |( data , ranges ) | ( String :: from_utf8 ( data) . unwrap ( ) , ranges ) )
792
+ . map ( |( ranges , data ) | ( ranges , String :: from_utf8 ( data) . unwrap ( ) ) )
733
793
. collect ( ) ;
734
794
assert_eq ! (
735
795
resps,
736
796
vec![
737
797
(
798
+ vec![ Key :: from( vec![ 5 ] ) ..Key :: from( vec![ 10 ] ) ] ,
738
799
"1:[Key(05)..Key(0A)]" . to_string( ) ,
739
- vec![ Key :: from( vec![ 5 ] ) ..Key :: from( vec![ 10 ] ) ]
740
800
) ,
741
801
(
742
- "2:[Key(0A)..Key(0F), Key(14)..Key(FAFA)]" . to_string( ) ,
743
802
vec![
744
803
Key :: from( vec![ 10 ] ) ..Key :: from( vec![ 15 ] ) ,
745
804
Key :: from( vec![ 20 ] ) ..Key :: from( vec![ 250 , 250 ] )
746
- ]
805
+ ] ,
806
+ "2:[Key(0A)..Key(0F), Key(14)..Key(FAFA)]" . to_string( ) ,
747
807
) ,
748
808
(
809
+ vec![ Key :: from( vec![ 250 , 250 ] ) ..Key :: from( vec![ ] ) ] ,
749
810
"3:[Key(FAFA)..Key()]" . to_string( ) ,
750
- vec![ Key :: from( vec![ 250 , 250 ] ) ..Key :: from( vec![ ] ) ]
751
811
)
752
812
]
753
813
) ;
0 commit comments