@@ -13,6 +13,7 @@ pub const TXN_KEY_PREFIX: u8 = b'x';
1313pub const KEYSPACE_PREFIX_LEN : usize = 4 ;
1414
1515#[ derive( Debug , Clone , Copy , PartialEq , Eq , Hash , Serialize , Deserialize ) ]
16+ #[ non_exhaustive]
1617pub enum Keyspace {
1718 Disable ,
1819 Enable {
@@ -23,7 +24,6 @@ pub enum Keyspace {
2324 /// This mode is intended for **server-side embedding** use cases (e.g. embedding this client in
2425 /// `tikv-server`) where keys are already in API V2 "logical key bytes" form and must be passed
2526 /// through unchanged.
26- #[ cfg( feature = "apiv2-no-prefix" ) ]
2727 ApiV2NoPrefix ,
2828}
2929
@@ -38,7 +38,6 @@ impl Keyspace {
3838 match self {
3939 Keyspace :: Disable => kvrpcpb:: ApiVersion :: V1 ,
4040 Keyspace :: Enable { .. } => kvrpcpb:: ApiVersion :: V2 ,
41- #[ cfg( feature = "apiv2-no-prefix" ) ]
4241 Keyspace :: ApiV2NoPrefix => kvrpcpb:: ApiVersion :: V2 ,
4342 }
4443 }
@@ -183,6 +182,32 @@ impl TruncateKeyspace for Vec<crate::proto::kvrpcpb::LockInfo> {
183182 }
184183}
185184
185+ impl EncodeKeyspace for Vec < crate :: proto:: kvrpcpb:: LockInfo > {
186+ fn encode_keyspace ( mut self , keyspace : Keyspace , key_mode : KeyMode ) -> Self {
187+ if !matches ! ( keyspace, Keyspace :: Enable { .. } ) {
188+ return self ;
189+ }
190+ for lock in & mut self {
191+ take_mut:: take ( & mut lock. key , |key| {
192+ Key :: from ( key) . encode_keyspace ( keyspace, key_mode) . into ( )
193+ } ) ;
194+ take_mut:: take ( & mut lock. primary_lock , |primary| {
195+ Key :: from ( primary)
196+ . encode_keyspace ( keyspace, key_mode)
197+ . into ( )
198+ } ) ;
199+ for secondary in lock. secondaries . iter_mut ( ) {
200+ take_mut:: take ( secondary, |secondary| {
201+ Key :: from ( secondary)
202+ . encode_keyspace ( keyspace, key_mode)
203+ . into ( )
204+ } ) ;
205+ }
206+ }
207+ self
208+ }
209+ }
210+
186211fn keyspace_prefix ( keyspace_id : u32 , key_mode : KeyMode ) -> [ u8 ; KEYSPACE_PREFIX_LEN ] {
187212 let mut prefix = keyspace_id. to_be_bytes ( ) ;
188213 prefix[ 0 ] = match key_mode {
@@ -274,26 +299,105 @@ mod tests {
274299 mutation. encode_keyspace( keyspace, key_mode) ,
275300 expected_mutation
276301 ) ;
302+
303+ let key_mode = KeyMode :: Txn ;
304+ let lock = crate :: proto:: kvrpcpb:: LockInfo {
305+ key : vec ! [ b'k' , b'1' ] ,
306+ primary_lock : vec ! [ b'p' , b'1' ] ,
307+ secondaries : vec ! [ vec![ b's' , b'1' ] , vec![ b's' , b'2' ] ] ,
308+ ..Default :: default ( )
309+ } ;
310+ let locks = vec ! [ lock] . encode_keyspace ( keyspace, key_mode) ;
311+ assert_eq ! ( locks. len( ) , 1 ) ;
312+ assert_eq ! ( locks[ 0 ] . key, vec![ b'x' , 0 , 0xDE , 0xAD , b'k' , b'1' ] ) ;
313+ assert_eq ! ( locks[ 0 ] . primary_lock, vec![ b'x' , 0 , 0xDE , 0xAD , b'p' , b'1' ] ) ;
314+ assert_eq ! (
315+ locks[ 0 ] . secondaries,
316+ vec![
317+ vec![ b'x' , 0 , 0xDE , 0xAD , b's' , b'1' ] ,
318+ vec![ b'x' , 0 , 0xDE , 0xAD , b's' , b'2' ]
319+ ]
320+ ) ;
277321 }
278322
279323 #[ test]
280324 fn test_truncate_version ( ) {
281- let key = Key :: from ( vec ! [ b'r' , 0 , 0xDE , 0xAD , 0xBE , 0xEF ] ) ;
282325 let keyspace = Keyspace :: Enable {
283326 keyspace_id : 0xDEAD ,
284327 } ;
328+
329+ let key = Key :: from ( vec ! [ b'r' , 0 , 0xDE , 0xAD , 0xBE , 0xEF ] ) ;
285330 let expected_key = Key :: from ( vec ! [ 0xBE , 0xEF ] ) ;
286331 assert_eq ! ( key. truncate_keyspace( keyspace) , expected_key) ;
287332
288333 let key = Key :: from ( vec ! [ b'x' , 0 , 0xDE , 0xAD , 0xBE , 0xEF ] ) ;
289- let keyspace = Keyspace :: Enable {
290- keyspace_id : 0xDEAD ,
291- } ;
292334 let expected_key = Key :: from ( vec ! [ 0xBE , 0xEF ] ) ;
293335 assert_eq ! ( key. truncate_keyspace( keyspace) , expected_key) ;
336+
337+ let pair = KvPair ( Key :: from ( vec ! [ b'x' , 0 , 0xDE , 0xAD , b'k' ] ) , vec ! [ b'v' ] ) ;
338+ let expected_pair = KvPair ( Key :: from ( vec ! [ b'k' ] ) , vec ! [ b'v' ] ) ;
339+ assert_eq ! ( pair. truncate_keyspace( keyspace) , expected_pair) ;
340+
341+ let range = Range {
342+ start : Key :: from ( vec ! [ b'x' , 0 , 0xDE , 0xAD , b'a' ] ) ,
343+ end : Key :: from ( vec ! [ b'x' , 0 , 0xDE , 0xAD , b'b' ] ) ,
344+ } ;
345+ let expected_range = Range {
346+ start : Key :: from ( vec ! [ b'a' ] ) ,
347+ end : Key :: from ( vec ! [ b'b' ] ) ,
348+ } ;
349+ assert_eq ! ( range. truncate_keyspace( keyspace) , expected_range) ;
350+
351+ let ranges = vec ! [
352+ Range {
353+ start: Key :: from( vec![ b'x' , 0 , 0xDE , 0xAD , b'a' ] ) ,
354+ end: Key :: from( vec![ b'x' , 0 , 0xDE , 0xAD , b'b' ] ) ,
355+ } ,
356+ Range {
357+ start: Key :: from( vec![ b'x' , 0 , 0xDE , 0xAD , b'c' ] ) ,
358+ end: Key :: from( vec![ b'x' , 0 , 0xDE , 0xAD , b'd' ] ) ,
359+ } ,
360+ ] ;
361+ let expected_ranges = vec ! [
362+ Range {
363+ start: Key :: from( vec![ b'a' ] ) ,
364+ end: Key :: from( vec![ b'b' ] ) ,
365+ } ,
366+ Range {
367+ start: Key :: from( vec![ b'c' ] ) ,
368+ end: Key :: from( vec![ b'd' ] ) ,
369+ } ,
370+ ] ;
371+ assert_eq ! ( ranges. truncate_keyspace( keyspace) , expected_ranges) ;
372+
373+ let pairs = vec ! [
374+ KvPair ( Key :: from( vec![ b'x' , 0 , 0xDE , 0xAD , b'k' ] ) , vec![ b'v' ] ) ,
375+ KvPair (
376+ Key :: from( vec![ b'x' , 0 , 0xDE , 0xAD , b'k' , b'2' ] ) ,
377+ vec![ b'v' , b'2' ] ,
378+ ) ,
379+ ] ;
380+ let expected_pairs = vec ! [
381+ KvPair ( Key :: from( vec![ b'k' ] ) , vec![ b'v' ] ) ,
382+ KvPair ( Key :: from( vec![ b'k' , b'2' ] ) , vec![ b'v' , b'2' ] ) ,
383+ ] ;
384+ assert_eq ! ( pairs. truncate_keyspace( keyspace) , expected_pairs) ;
385+
386+ let lock = crate :: proto:: kvrpcpb:: LockInfo {
387+ key : vec ! [ b'x' , 0 , 0xDE , 0xAD , b'k' ] ,
388+ primary_lock : vec ! [ b'x' , 0 , 0xDE , 0xAD , b'p' ] ,
389+ secondaries : vec ! [ vec![ b'x' , 0 , 0xDE , 0xAD , b's' ] ] ,
390+ ..Default :: default ( )
391+ } ;
392+ let expected_lock = crate :: proto:: kvrpcpb:: LockInfo {
393+ key : vec ! [ b'k' ] ,
394+ primary_lock : vec ! [ b'p' ] ,
395+ secondaries : vec ! [ vec![ b's' ] ] ,
396+ ..Default :: default ( )
397+ } ;
398+ assert_eq ! ( vec![ lock] . truncate_keyspace( keyspace) , vec![ expected_lock] ) ;
294399 }
295400
296- #[ cfg( feature = "apiv2-no-prefix" ) ]
297401 #[ test]
298402 fn test_apiv2_no_prefix_api_version ( ) {
299403 assert_eq ! (
@@ -302,7 +406,6 @@ mod tests {
302406 ) ;
303407 }
304408
305- #[ cfg( feature = "apiv2-no-prefix" ) ]
306409 #[ test]
307410 fn test_apiv2_no_prefix_encode_is_noop ( ) {
308411 let keyspace = Keyspace :: ApiV2NoPrefix ;
@@ -323,9 +426,29 @@ mod tests {
323426 mutation. clone( ) . encode_keyspace( keyspace, key_mode) ,
324427 mutation
325428 ) ;
429+
430+ let lock = crate :: proto:: kvrpcpb:: LockInfo {
431+ key : vec ! [ b'x' , 0 , 0 , 0 , b'k' ] ,
432+ primary_lock : vec ! [ b'x' , 0 , 0 , 0 , b'p' ] ,
433+ secondaries : vec ! [ vec![ b'x' , 0 , 0 , 0 , b's' ] ] ,
434+ ..Default :: default ( )
435+ } ;
436+ let locks = vec ! [ lock] ;
437+ assert_eq ! ( locks. clone( ) . encode_keyspace( keyspace, key_mode) , locks) ;
438+
439+ let lock = crate :: proto:: kvrpcpb:: LockInfo {
440+ key : vec ! [ b'k' , b'1' ] ,
441+ primary_lock : vec ! [ b'p' , b'1' ] ,
442+ secondaries : vec ! [ vec![ b's' , b'1' ] ] ,
443+ ..Default :: default ( )
444+ } ;
445+ let locks = vec ! [ lock. clone( ) ] ;
446+ assert_eq ! (
447+ locks. clone( ) . encode_keyspace( Keyspace :: Disable , key_mode) ,
448+ locks
449+ ) ;
326450 }
327451
328- #[ cfg( feature = "apiv2-no-prefix" ) ]
329452 #[ test]
330453 fn test_apiv2_no_prefix_truncate_is_noop ( ) {
331454 let keyspace = Keyspace :: ApiV2NoPrefix ;
0 commit comments