@@ -182,6 +182,32 @@ impl TruncateKeyspace for Vec<crate::proto::kvrpcpb::LockInfo> {
182182 }
183183}
184184
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+
185211fn keyspace_prefix ( keyspace_id : u32 , key_mode : KeyMode ) -> [ u8 ; KEYSPACE_PREFIX_LEN ] {
186212 let mut prefix = keyspace_id. to_be_bytes ( ) ;
187213 prefix[ 0 ] = match key_mode {
@@ -273,23 +299,103 @@ mod tests {
273299 mutation. encode_keyspace( keyspace, key_mode) ,
274300 expected_mutation
275301 ) ;
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+ ) ;
276321 }
277322
278323 #[ test]
279324 fn test_truncate_version ( ) {
280- let key = Key :: from ( vec ! [ b'r' , 0 , 0xDE , 0xAD , 0xBE , 0xEF ] ) ;
281325 let keyspace = Keyspace :: Enable {
282326 keyspace_id : 0xDEAD ,
283327 } ;
328+
329+ let key = Key :: from ( vec ! [ b'r' , 0 , 0xDE , 0xAD , 0xBE , 0xEF ] ) ;
284330 let expected_key = Key :: from ( vec ! [ 0xBE , 0xEF ] ) ;
285331 assert_eq ! ( key. truncate_keyspace( keyspace) , expected_key) ;
286332
287333 let key = Key :: from ( vec ! [ b'x' , 0 , 0xDE , 0xAD , 0xBE , 0xEF ] ) ;
288- let keyspace = Keyspace :: Enable {
289- keyspace_id : 0xDEAD ,
290- } ;
291334 let expected_key = Key :: from ( vec ! [ 0xBE , 0xEF ] ) ;
292335 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] ) ;
293399 }
294400
295401 #[ test]
@@ -320,6 +426,27 @@ mod tests {
320426 mutation. clone( ) . encode_keyspace( keyspace, key_mode) ,
321427 mutation
322428 ) ;
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+ ) ;
323450 }
324451
325452 #[ test]
0 commit comments