@@ -14,8 +14,6 @@ type Prefix = [u8; KEYSPACE_PREFIX_LEN];
1414
1515const KEYSPACE_PREFIX_LEN : usize = 4 ;
1616
17- const MAX_KEYSPACE_ID : KeySpaceId = KeySpaceId ( [ 0xff , 0xff , 0xff ] ) ;
18-
1917pub trait RequestCodec : Sized + Clone + Sync + Send + ' static {
2018 fn encode_request < ' a , R : KvRequest < Self > > ( & self , req : & ' a R ) -> Cow < ' a , R > {
2119 Cow :: Borrowed ( req)
@@ -29,7 +27,7 @@ pub trait RequestCodec: Sized + Clone + Sync + Send + 'static {
2927 Ok ( ( ) )
3028 }
3129
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 > ) {
3331 ( start, end)
3432 }
3533
@@ -74,6 +72,10 @@ pub trait RequestCodecExt: RequestCodec {
7472 keys. into_iter ( ) . map ( |key| self . encode_key ( key) ) . collect ( )
7573 }
7674
75+ fn encode_secondaries ( & self , secondaries : Vec < Vec < u8 > > ) -> Vec < Vec < u8 > > {
76+ self . encode_keys ( secondaries)
77+ }
78+
7779 fn encode_pairs ( & self , mut pairs : Vec < kvrpcpb:: KvPair > ) -> Vec < kvrpcpb:: KvPair > {
7880 for pair in pairs. iter_mut ( ) {
7981 * pair. mut_key ( ) = self . encode_key ( pair. take_key ( ) ) ;
@@ -82,9 +84,14 @@ pub trait RequestCodecExt: RequestCodec {
8284 pairs
8385 }
8486
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 > {
8692 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) ;
8895 * range. mut_start_key ( ) = start;
8996 * range. mut_end_key ( ) = end;
9097 }
@@ -217,18 +224,18 @@ pub trait Mode: Clone + Copy + Sync + Send + 'static {
217224 const MAX_KEY : & ' static [ u8 ] = & [ Self :: PREFIX + 1 , 0 , 0 , 0 ] ;
218225}
219226
220- #[ derive( Clone , Copy ) ]
227+ #[ derive( Default , Clone , Copy ) ]
221228pub struct RawMode ;
222229
223- #[ derive( Clone , Copy ) ]
230+ #[ derive( Default , Clone , Copy ) ]
224231pub struct TxnMode ;
225232
226233impl Mode for RawMode {
227234 const PREFIX : u8 = b'r' ;
228235}
229236
230237impl Mode for TxnMode {
231- const PREFIX : u8 = b't ' ;
238+ const PREFIX : u8 = b'x ' ;
232239}
233240
234241#[ derive( Clone ) ]
@@ -263,18 +270,37 @@ impl RequestCodec for ApiV1<TxnMode> {
263270
264271impl TxnCodec for ApiV1 < TxnMode > { }
265272
266- #[ derive( Clone , Copy , Default ) ]
273+ #[ derive( Clone , Copy ) ]
267274pub struct KeySpace < M : Mode > {
268275 id : KeySpaceId ,
269276 _phantom : PhantomData < M > ,
270277}
271278
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+
272288impl < M : Mode > From < KeySpace < M > > for Prefix {
273289 fn from ( s : KeySpace < M > ) -> Self {
274290 [ M :: PREFIX , s. id [ 0 ] , s. id [ 1 ] , s. id [ 2 ] ]
275291 }
276292}
277293
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+
278304#[ derive( Default , Clone ) ]
279305pub struct ApiV2 < M : Mode > {
280306 keyspace : KeySpace < M > ,
@@ -318,12 +344,21 @@ impl<M: Mode> RequestCodec for ApiV2<M> {
318344 Ok ( ( ) )
319345 }
320346
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) ;
326351 }
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)
327362 }
328363
329364 fn encode_pd_query ( & self , key : Vec < u8 > ) -> Vec < u8 > {
@@ -335,14 +370,15 @@ impl<M: Mode> RequestCodec for ApiV2<M> {
335370 decode_bytes_in_place ( region. mut_end_key ( ) , false ) ?;
336371
337372 // 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 ( ) {
339374 * region. mut_start_key ( ) = vec ! [ ] ;
340375 } else {
341376 self . decode_key ( region. mut_start_key ( ) ) ?;
342377 }
343378
344379 // 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+ {
346382 * region. mut_end_key ( ) = vec ! [ ] ;
347383 } else {
348384 self . decode_key ( region. mut_end_key ( ) ) ?;
0 commit comments