@@ -361,7 +361,87 @@ func TestBuildTasksByBuckets(t *testing.T) {
361
361
}
362
362
}
363
363
364
- func TestSplitRegionRanges (t * testing.T ) {
364
+ func TestSplitKeyRangesByLocationsWithoutBuckets (t * testing.T ) {
365
+ // nil --- 'g' --- 'n' --- 't' --- nil
366
+ // <- 0 -> <- 1 -> <- 2 -> <- 3 ->
367
+ mockClient , cluster , pdClient , err := testutils .NewMockTiKV ("" , nil )
368
+ require .NoError (t , err )
369
+ defer func () {
370
+ pdClient .Close ()
371
+ err = mockClient .Close ()
372
+ require .NoError (t , err )
373
+ }()
374
+
375
+ testutils .BootstrapWithMultiRegions (cluster , []byte ("g" ), []byte ("n" ), []byte ("t" ))
376
+ pdCli := tikv .NewCodecPDClient (tikv .ModeTxn , pdClient )
377
+ defer pdCli .Close ()
378
+
379
+ cache := NewRegionCache (tikv .NewRegionCache (pdCli ))
380
+ defer cache .Close ()
381
+
382
+ bo := backoff .NewBackofferWithVars (context .Background (), 3000 , nil )
383
+
384
+ locRanges , err := cache .SplitKeyRangesByLocationsWithoutBuckets (bo , NewKeyRanges (BuildKeyRanges ("a" , "c" )), UnspecifiedLimit )
385
+ require .NoError (t , err )
386
+ require .Len (t , locRanges , 1 )
387
+ rangeEqual (t , locRanges [0 ].Ranges .ToRanges (), "a" , "c" )
388
+
389
+ locRanges , err = cache .SplitKeyRangesByLocationsWithoutBuckets (bo , NewKeyRanges (BuildKeyRanges ("a" , "c" )), 0 )
390
+ require .NoError (t , err )
391
+ require .Len (t , locRanges , 0 )
392
+
393
+ locRanges , err = cache .SplitKeyRangesByLocationsWithoutBuckets (bo , NewKeyRanges (BuildKeyRanges ("h" , "y" )), UnspecifiedLimit )
394
+ require .NoError (t , err )
395
+ require .Len (t , locRanges , 3 )
396
+ rangeEqual (t , locRanges [0 ].Ranges .ToRanges (), "h" , "n" )
397
+ rangeEqual (t , locRanges [1 ].Ranges .ToRanges (), "n" , "t" )
398
+ rangeEqual (t , locRanges [2 ].Ranges .ToRanges (), "t" , "y" )
399
+
400
+ locRanges , err = cache .SplitKeyRangesByLocationsWithoutBuckets (bo , NewKeyRanges (BuildKeyRanges ("h" , "n" )), UnspecifiedLimit )
401
+ require .NoError (t , err )
402
+ require .Len (t , locRanges , 1 )
403
+ rangeEqual (t , locRanges [0 ].Ranges .ToRanges (), "h" , "n" )
404
+
405
+ locRanges , err = cache .SplitKeyRangesByLocationsWithoutBuckets (bo , NewKeyRanges (BuildKeyRanges ("s" , "s" )), UnspecifiedLimit )
406
+ require .NoError (t , err )
407
+ require .Len (t , locRanges , 1 )
408
+ rangeEqual (t , locRanges [0 ].Ranges .ToRanges (), "s" , "s" )
409
+
410
+ // min --> max
411
+ locRanges , err = cache .SplitKeyRangesByLocationsWithoutBuckets (bo , NewKeyRanges (BuildKeyRanges ("a" , "z" )), UnspecifiedLimit )
412
+ require .NoError (t , err )
413
+ require .Len (t , locRanges , 4 )
414
+ rangeEqual (t , locRanges [0 ].Ranges .ToRanges (), "a" , "g" )
415
+ rangeEqual (t , locRanges [1 ].Ranges .ToRanges (), "g" , "n" )
416
+ rangeEqual (t , locRanges [2 ].Ranges .ToRanges (), "n" , "t" )
417
+ rangeEqual (t , locRanges [3 ].Ranges .ToRanges (), "t" , "z" )
418
+
419
+ locRanges , err = cache .SplitKeyRangesByLocationsWithoutBuckets (bo , NewKeyRanges (BuildKeyRanges ("a" , "z" )), 3 )
420
+ require .NoError (t , err )
421
+ require .Len (t , locRanges , 3 )
422
+ rangeEqual (t , locRanges [0 ].Ranges .ToRanges (), "a" , "g" )
423
+ rangeEqual (t , locRanges [1 ].Ranges .ToRanges (), "g" , "n" )
424
+ rangeEqual (t , locRanges [2 ].Ranges .ToRanges (), "n" , "t" )
425
+
426
+ // many range
427
+ locRanges , err = cache .SplitKeyRangesByLocationsWithoutBuckets (bo , NewKeyRanges (BuildKeyRanges ("a" , "b" , "c" , "d" , "e" , "f" , "g" , "h" , "i" , "j" , "k" , "l" , "m" , "n" , "o" , "p" , "q" , "r" , "s" , "t" , "u" , "v" , "w" , "x" , "y" , "z" )), UnspecifiedLimit )
428
+ require .NoError (t , err )
429
+ require .Len (t , locRanges , 4 )
430
+ rangeEqual (t , locRanges [0 ].Ranges .ToRanges (), "a" , "b" , "c" , "d" , "e" , "f" , "f" , "g" )
431
+ rangeEqual (t , locRanges [1 ].Ranges .ToRanges (), "g" , "h" , "i" , "j" , "k" , "l" , "m" , "n" )
432
+ rangeEqual (t , locRanges [2 ].Ranges .ToRanges (), "o" , "p" , "q" , "r" , "s" , "t" )
433
+ rangeEqual (t , locRanges [3 ].Ranges .ToRanges (), "u" , "v" , "w" , "x" , "y" , "z" )
434
+
435
+ locRanges , err = cache .SplitKeyRangesByLocationsWithoutBuckets (bo , NewKeyRanges (BuildKeyRanges ("a" , "b" , "b" , "h" , "h" , "m" , "n" , "t" , "v" , "w" )), UnspecifiedLimit )
436
+ require .NoError (t , err )
437
+ require .Len (t , locRanges , 4 )
438
+ rangeEqual (t , locRanges [0 ].Ranges .ToRanges (), "a" , "b" , "b" , "g" )
439
+ rangeEqual (t , locRanges [1 ].Ranges .ToRanges (), "g" , "h" , "h" , "m" , "n" )
440
+ rangeEqual (t , locRanges [2 ].Ranges .ToRanges (), "n" , "t" )
441
+ rangeEqual (t , locRanges [3 ].Ranges .ToRanges (), "v" , "w" )
442
+ }
443
+
444
+ func TestSplitKeyRanges (t * testing.T ) {
365
445
// nil --- 'g' --- 'n' --- 't' --- nil
366
446
// <- 0 -> <- 1 -> <- 2 -> <- 3 ->
367
447
mockClient , cluster , pdClient , err := testutils .NewMockTiKV ("" , nil )
@@ -386,6 +466,10 @@ func TestSplitRegionRanges(t *testing.T) {
386
466
require .Len (t , ranges , 1 )
387
467
rangeEqual (t , ranges , "a" , "c" )
388
468
469
+ ranges , err = cache .SplitRegionRanges (bo , BuildKeyRanges ("a" , "c" ), 0 )
470
+ require .NoError (t , err )
471
+ require .Len (t , ranges , 0 )
472
+
389
473
ranges , err = cache .SplitRegionRanges (bo , BuildKeyRanges ("h" , "y" ), UnspecifiedLimit )
390
474
require .NoError (t , err )
391
475
require .Len (t , ranges , 3 )
0 commit comments