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