@@ -304,3 +304,235 @@ func TestCheckDuplicateConstraint(t *testing.T) {
304
304
err = checkDuplicateConstraint (constrNames , "u1" , ast .ConstraintUniq )
305
305
require .EqualError (t , err , "[ddl:1061]Duplicate key name 'u1'" )
306
306
}
307
+ << << << < HEAD
308
+ == == == =
309
+
310
+ func TestGetTableDataKeyRanges (t * testing.T ) {
311
+ // case 1, empty flashbackIDs
312
+ keyRanges := getTableDataKeyRanges ([]int64 {})
313
+ require .Len (t , keyRanges , 1 )
314
+ require .Equal (t , keyRanges [0 ].StartKey , tablecodec .EncodeTablePrefix (0 ))
315
+ require .Equal (t , keyRanges [0 ].EndKey , tablecodec .EncodeTablePrefix (meta .MaxGlobalID ))
316
+
317
+ // case 2, insert a execluded table ID
318
+ keyRanges = getTableDataKeyRanges ([]int64 {3 })
319
+ require .Len (t , keyRanges , 2 )
320
+ require .Equal (t , keyRanges [0 ].StartKey , tablecodec .EncodeTablePrefix (0 ))
321
+ require .Equal (t , keyRanges [0 ].EndKey , tablecodec .EncodeTablePrefix (3 ))
322
+ require .Equal (t , keyRanges [1 ].StartKey , tablecodec .EncodeTablePrefix (4 ))
323
+ require .Equal (t , keyRanges [1 ].EndKey , tablecodec .EncodeTablePrefix (meta .MaxGlobalID ))
324
+
325
+ // case 3, insert some execluded table ID
326
+ keyRanges = getTableDataKeyRanges ([]int64 {3 , 5 , 9 })
327
+ require .Len (t , keyRanges , 4 )
328
+ require .Equal (t , keyRanges [0 ].StartKey , tablecodec .EncodeTablePrefix (0 ))
329
+ require .Equal (t , keyRanges [0 ].EndKey , tablecodec .EncodeTablePrefix (3 ))
330
+ require .Equal (t , keyRanges [1 ].StartKey , tablecodec .EncodeTablePrefix (4 ))
331
+ require .Equal (t , keyRanges [1 ].EndKey , tablecodec .EncodeTablePrefix (5 ))
332
+ require .Equal (t , keyRanges [2 ].StartKey , tablecodec .EncodeTablePrefix (6 ))
333
+ require .Equal (t , keyRanges [2 ].EndKey , tablecodec .EncodeTablePrefix (9 ))
334
+ require .Equal (t , keyRanges [3 ].StartKey , tablecodec .EncodeTablePrefix (10 ))
335
+ require .Equal (t , keyRanges [3 ].EndKey , tablecodec .EncodeTablePrefix (meta .MaxGlobalID ))
336
+ }
337
+
338
+ func TestMergeContinuousKeyRanges (t * testing.T ) {
339
+ cases := []struct {
340
+ input []keyRangeMayExclude
341
+ expect []kv.KeyRange
342
+ }{
343
+ {
344
+ []keyRangeMayExclude {
345
+ {
346
+ r : kv.KeyRange {StartKey : []byte {1 }, EndKey : []byte {2 }},
347
+ exclude : true ,
348
+ },
349
+ },
350
+ []kv.KeyRange {},
351
+ },
352
+ {
353
+ []keyRangeMayExclude {
354
+ {
355
+ r : kv.KeyRange {StartKey : []byte {1 }, EndKey : []byte {2 }},
356
+ exclude : false ,
357
+ },
358
+ },
359
+ []kv.KeyRange {{StartKey : []byte {1 }, EndKey : []byte {2 }}},
360
+ },
361
+ {
362
+ []keyRangeMayExclude {
363
+ {
364
+ r : kv.KeyRange {StartKey : []byte {1 }, EndKey : []byte {2 }},
365
+ exclude : false ,
366
+ },
367
+ {
368
+ r : kv.KeyRange {StartKey : []byte {3 }, EndKey : []byte {4 }},
369
+ exclude : false ,
370
+ },
371
+ },
372
+ []kv.KeyRange {{StartKey : []byte {1 }, EndKey : []byte {4 }}},
373
+ },
374
+ {
375
+ []keyRangeMayExclude {
376
+ {
377
+ r : kv.KeyRange {StartKey : []byte {1 }, EndKey : []byte {2 }},
378
+ exclude : false ,
379
+ },
380
+ {
381
+ r : kv.KeyRange {StartKey : []byte {3 }, EndKey : []byte {4 }},
382
+ exclude : true ,
383
+ },
384
+ {
385
+ r : kv.KeyRange {StartKey : []byte {5 }, EndKey : []byte {6 }},
386
+ exclude : false ,
387
+ },
388
+ },
389
+ []kv.KeyRange {
390
+ {StartKey : []byte {1 }, EndKey : []byte {2 }},
391
+ {StartKey : []byte {5 }, EndKey : []byte {6 }},
392
+ },
393
+ },
394
+ {
395
+ []keyRangeMayExclude {
396
+ {
397
+ r : kv.KeyRange {StartKey : []byte {1 }, EndKey : []byte {2 }},
398
+ exclude : true ,
399
+ },
400
+ {
401
+ r : kv.KeyRange {StartKey : []byte {3 }, EndKey : []byte {4 }},
402
+ exclude : true ,
403
+ },
404
+ {
405
+ r : kv.KeyRange {StartKey : []byte {5 }, EndKey : []byte {6 }},
406
+ exclude : false ,
407
+ },
408
+ },
409
+ []kv.KeyRange {{StartKey : []byte {5 }, EndKey : []byte {6 }}},
410
+ },
411
+ {
412
+ []keyRangeMayExclude {
413
+ {
414
+ r : kv.KeyRange {StartKey : []byte {1 }, EndKey : []byte {2 }},
415
+ exclude : false ,
416
+ },
417
+ {
418
+ r : kv.KeyRange {StartKey : []byte {3 }, EndKey : []byte {4 }},
419
+ exclude : true ,
420
+ },
421
+ {
422
+ r : kv.KeyRange {StartKey : []byte {5 }, EndKey : []byte {6 }},
423
+ exclude : true ,
424
+ },
425
+ },
426
+ []kv.KeyRange {{StartKey : []byte {1 }, EndKey : []byte {2 }}},
427
+ },
428
+ {
429
+ []keyRangeMayExclude {
430
+ {
431
+ r : kv.KeyRange {StartKey : []byte {1 }, EndKey : []byte {2 }},
432
+ exclude : true ,
433
+ },
434
+ {
435
+ r : kv.KeyRange {StartKey : []byte {3 }, EndKey : []byte {4 }},
436
+ exclude : false ,
437
+ },
438
+ {
439
+ r : kv.KeyRange {StartKey : []byte {5 }, EndKey : []byte {6 }},
440
+ exclude : true ,
441
+ },
442
+ },
443
+ []kv.KeyRange {{StartKey : []byte {3 }, EndKey : []byte {4 }}},
444
+ },
445
+ }
446
+
447
+ for i , ca := range cases {
448
+ ranges := mergeContinuousKeyRanges (ca .input )
449
+ require .Equal (t , ca .expect , ranges , "case %d" , i )
450
+ }
451
+ }
452
+
453
+ func TestDetectAndUpdateJobVersion (t * testing.T ) {
454
+ d := & ddl {ddlCtx : & ddlCtx {ctx : context .Background ()}}
455
+
456
+ reset := func () {
457
+ model .SetJobVerInUse (model .JobVersion1 )
458
+ }
459
+ t .Cleanup (reset )
460
+ // other ut in the same address space might change it
461
+ reset ()
462
+ require .Equal (t , model .JobVersion1 , model .GetJobVerInUse ())
463
+
464
+ t .Run ("in ut" , func (t * testing.T ) {
465
+ reset ()
466
+ d .detectAndUpdateJobVersion ()
467
+ if testargsv1 .ForceV1 {
468
+ require .Equal (t , model .JobVersion1 , model .GetJobVerInUse ())
469
+ } else {
470
+ require .Equal (t , model .JobVersion2 , model .GetJobVerInUse ())
471
+ }
472
+ })
473
+
474
+ d .etcdCli = & clientv3.Client {}
475
+ mockGetAllServerInfo := func (t * testing.T , versions ... string ) {
476
+ serverInfos := make (map [string ]* infosync.ServerInfo , len (versions ))
477
+ for i , v := range versions {
478
+ serverInfos [fmt .Sprintf ("node%d" , i )] = & infosync.ServerInfo {
479
+ StaticServerInfo : infosync.StaticServerInfo {
480
+ ServerVersionInfo : infosync.ServerVersionInfo {Version : v },
481
+ }}
482
+ }
483
+ bytes , err := json .Marshal (serverInfos )
484
+ require .NoError (t , err )
485
+ inTerms := fmt .Sprintf ("return(`%s`)" , string (bytes ))
486
+ testfailpoint .Enable (t , "github.com/pingcap/tidb/pkg/domain/infosync/mockGetAllServerInfo" , inTerms )
487
+ }
488
+
489
+ t .Run ("all support v2, even with pre-release label" , func (t * testing.T ) {
490
+ reset ()
491
+ mockGetAllServerInfo (t , "8.0.11-TiDB-v8.4.0-alpha-228-g650888fea7-dirty" ,
492
+ "8.0.11-TiDB-v8.4.1" , "8.0.11-TiDB-8.5.0-beta" )
493
+ d .detectAndUpdateJobVersion ()
494
+ require .Equal (t , model .JobVersion2 , model .GetJobVerInUse ())
495
+ })
496
+
497
+ t .Run ("v1 first, later all support v2" , func (t * testing.T ) {
498
+ reset ()
499
+ intervalBak := detectJobVerInterval
500
+ t .Cleanup (func () {
501
+ detectJobVerInterval = intervalBak
502
+ })
503
+ detectJobVerInterval = time .Millisecond
504
+ // unknown version
505
+ mockGetAllServerInfo (t , "unknown" )
506
+ iterateCnt := 0
507
+ testfailpoint .EnableCall (t , "github.com/pingcap/tidb/pkg/ddl/afterDetectAndUpdateJobVersionOnce" , func () {
508
+ iterateCnt ++
509
+ if iterateCnt == 1 {
510
+ require .Equal (t , model .JobVersion1 , model .GetJobVerInUse ())
511
+ // user set version explicitly in config
512
+ mockGetAllServerInfo (t , "9.0.0-xxx" )
513
+ } else if iterateCnt == 2 {
514
+ require .Equal (t , model .JobVersion1 , model .GetJobVerInUse ())
515
+ // invalid version
516
+ mockGetAllServerInfo (t , "xxx" )
517
+ } else if iterateCnt == 3 {
518
+ require .Equal (t , model .JobVersion1 , model .GetJobVerInUse ())
519
+ // less than 8.4.0
520
+ mockGetAllServerInfo (t , "8.0.11-TiDB-8.3.0" )
521
+ } else if iterateCnt == 4 {
522
+ require .Equal (t , model .JobVersion1 , model .GetJobVerInUse ())
523
+ // upgrade case
524
+ mockGetAllServerInfo (t , "8.0.11-TiDB-v8.3.0" , "8.0.11-TiDB-v8.3.0" , "8.0.11-TiDB-v8.4.0" )
525
+ } else if iterateCnt == 5 {
526
+ require .Equal (t , model .JobVersion1 , model .GetJobVerInUse ())
527
+ // upgrade done
528
+ mockGetAllServerInfo (t , "8.0.11-TiDB-v8.4.0" , "8.0.11-TiDB-v8.4.0" , "8.0.11-TiDB-v8.4.0" )
529
+ } else {
530
+ require .Equal (t , model .JobVersion2 , model .GetJobVerInUse ())
531
+ }
532
+ })
533
+ d .detectAndUpdateJobVersion ()
534
+ d .wg .Wait ()
535
+ require .EqualValues (t , 6 , iterateCnt )
536
+ })
537
+ }
538
+ >> >> >> > 80 d6b5683c5 (infosync : refactor server config into dynamic and static sections (#58473 ))
0 commit comments