@@ -14,8 +14,6 @@ type Prefix = [u8; KEYSPACE_PREFIX_LEN];
14
14
15
15
const KEYSPACE_PREFIX_LEN : usize = 4 ;
16
16
17
- const MAX_KEYSPACE_ID : KeySpaceId = KeySpaceId ( [ 0xff , 0xff , 0xff ] ) ;
18
-
19
17
pub trait RequestCodec : Sized + Clone + Sync + Send + ' static {
20
18
fn encode_request < ' a , R : KvRequest < Self > > ( & self , req : & ' a R ) -> Cow < ' a , R > {
21
19
Cow :: Borrowed ( req)
@@ -29,7 +27,7 @@ pub trait RequestCodec: Sized + Clone + Sync + Send + 'static {
29
27
Ok ( ( ) )
30
28
}
31
29
32
- fn encode_range ( & self , start : Vec < u8 > , end : Vec < u8 > ) -> ( Vec < u8 > , Vec < u8 > ) {
30
+ fn encode_range ( & self , start : Vec < u8 > , end : Vec < u8 > , _reverse : bool ) -> ( Vec < u8 > , Vec < u8 > ) {
33
31
( start, end)
34
32
}
35
33
@@ -74,6 +72,10 @@ pub trait RequestCodecExt: RequestCodec {
74
72
keys. into_iter ( ) . map ( |key| self . encode_key ( key) ) . collect ( )
75
73
}
76
74
75
+ fn encode_secondaries ( & self , secondaries : Vec < Vec < u8 > > ) -> Vec < Vec < u8 > > {
76
+ self . encode_keys ( secondaries)
77
+ }
78
+
77
79
fn encode_pairs ( & self , mut pairs : Vec < kvrpcpb:: KvPair > ) -> Vec < kvrpcpb:: KvPair > {
78
80
for pair in pairs. iter_mut ( ) {
79
81
* pair. mut_key ( ) = self . encode_key ( pair. take_key ( ) ) ;
@@ -82,9 +84,14 @@ pub trait RequestCodecExt: RequestCodec {
82
84
pairs
83
85
}
84
86
85
- fn encode_ranges ( & self , mut ranges : Vec < kvrpcpb:: KeyRange > ) -> Vec < kvrpcpb:: KeyRange > {
87
+ fn encode_ranges (
88
+ & self ,
89
+ mut ranges : Vec < kvrpcpb:: KeyRange > ,
90
+ reverse : bool ,
91
+ ) -> Vec < kvrpcpb:: KeyRange > {
86
92
for range in ranges. iter_mut ( ) {
87
- let ( start, end) = self . encode_range ( range. take_start_key ( ) , range. take_end_key ( ) ) ;
93
+ let ( start, end) =
94
+ self . encode_range ( range. take_start_key ( ) , range. take_end_key ( ) , reverse) ;
88
95
* range. mut_start_key ( ) = start;
89
96
* range. mut_end_key ( ) = end;
90
97
}
@@ -217,18 +224,18 @@ pub trait Mode: Clone + Copy + Sync + Send + 'static {
217
224
const MAX_KEY : & ' static [ u8 ] = & [ Self :: PREFIX + 1 , 0 , 0 , 0 ] ;
218
225
}
219
226
220
- #[ derive( Clone , Copy ) ]
227
+ #[ derive( Default , Clone , Copy ) ]
221
228
pub struct RawMode ;
222
229
223
- #[ derive( Clone , Copy ) ]
230
+ #[ derive( Default , Clone , Copy ) ]
224
231
pub struct TxnMode ;
225
232
226
233
impl Mode for RawMode {
227
234
const PREFIX : u8 = b'r' ;
228
235
}
229
236
230
237
impl Mode for TxnMode {
231
- const PREFIX : u8 = b't ' ;
238
+ const PREFIX : u8 = b'x ' ;
232
239
}
233
240
234
241
#[ derive( Clone ) ]
@@ -263,18 +270,37 @@ impl RequestCodec for ApiV1<TxnMode> {
263
270
264
271
impl TxnCodec for ApiV1 < TxnMode > { }
265
272
266
- #[ derive( Clone , Copy , Default ) ]
273
+ #[ derive( Clone , Copy ) ]
267
274
pub struct KeySpace < M : Mode > {
268
275
id : KeySpaceId ,
269
276
_phantom : PhantomData < M > ,
270
277
}
271
278
279
+ impl < M : Mode > Default for KeySpace < M > {
280
+ fn default ( ) -> Self {
281
+ KeySpace {
282
+ id : KeySpaceId :: default ( ) ,
283
+ _phantom : PhantomData ,
284
+ }
285
+ }
286
+ }
287
+
272
288
impl < M : Mode > From < KeySpace < M > > for Prefix {
273
289
fn from ( s : KeySpace < M > ) -> Self {
274
290
[ M :: PREFIX , s. id [ 0 ] , s. id [ 1 ] , s. id [ 2 ] ]
275
291
}
276
292
}
277
293
294
+ impl < M : Mode > KeySpace < M > {
295
+ fn start ( self ) -> Prefix {
296
+ self . into ( )
297
+ }
298
+
299
+ fn end ( self ) -> Prefix {
300
+ ( u32:: from_be_bytes ( self . into ( ) ) + 1 ) . to_be_bytes ( )
301
+ }
302
+ }
303
+
278
304
#[ derive( Default , Clone ) ]
279
305
pub struct ApiV2 < M : Mode > {
280
306
keyspace : KeySpace < M > ,
@@ -318,12 +344,21 @@ impl<M: Mode> RequestCodec for ApiV2<M> {
318
344
Ok ( ( ) )
319
345
}
320
346
321
- fn encode_range ( & self , start : Vec < u8 > , end : Vec < u8 > ) -> ( Vec < u8 > , Vec < u8 > ) {
322
- if self . keyspace . id == MAX_KEYSPACE_ID {
323
- ( self . encode_key ( start) , M :: MAX_KEY . to_vec ( ) )
324
- } else {
325
- ( self . encode_key ( start) , self . encode_key ( end) )
347
+ fn encode_range ( & self , start : Vec < u8 > , end : Vec < u8 > , reverse : bool ) -> ( Vec < u8 > , Vec < u8 > ) {
348
+ if reverse {
349
+ let ( start, end) = self . encode_range ( end, start, false ) ;
350
+ return ( end, start) ;
326
351
}
352
+
353
+ let start = self . encode_key ( start) ;
354
+
355
+ let end = if end. is_empty ( ) {
356
+ self . keyspace . end ( ) . into ( )
357
+ } else {
358
+ self . encode_key ( end)
359
+ } ;
360
+
361
+ ( start, end)
327
362
}
328
363
329
364
fn encode_pd_query ( & self , key : Vec < u8 > ) -> Vec < u8 > {
@@ -335,14 +370,15 @@ impl<M: Mode> RequestCodec for ApiV2<M> {
335
370
decode_bytes_in_place ( region. mut_end_key ( ) , false ) ?;
336
371
337
372
// Map the region's start key to the keyspace start key.
338
- if region. get_start_key ( ) < M :: MIN_KEY {
373
+ if region. get_start_key ( ) <= self . keyspace . start ( ) . as_slice ( ) {
339
374
* region. mut_start_key ( ) = vec ! [ ] ;
340
375
} else {
341
376
self . decode_key ( region. mut_start_key ( ) ) ?;
342
377
}
343
378
344
379
// Map the region's end key to the keyspace end key.
345
- if region. get_end_key ( ) . is_empty ( ) || region. get_end_key ( ) > M :: MAX_KEY {
380
+ if region. get_end_key ( ) . is_empty ( ) || region. get_end_key ( ) >= self . keyspace . end ( ) . as_slice ( )
381
+ {
346
382
* region. mut_end_key ( ) = vec ! [ ] ;
347
383
} else {
348
384
self . decode_key ( region. mut_end_key ( ) ) ?;
0 commit comments