Skip to content

Commit bf5fda5

Browse files
you06ti-chi-bot
authored andcommitted
This is an automated cherry-pick of pingcap#58473
Signed-off-by: ti-chi-bot <[email protected]>
1 parent e5ec1ed commit bf5fda5

File tree

14 files changed

+1328
-76
lines changed

14 files changed

+1328
-76
lines changed

pkg/ddl/ddl_test.go

Lines changed: 254 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,3 +285,257 @@ func TestError(t *testing.T) {
285285
require.Equal(t, uint16(err.Code()), code)
286286
}
287287
}
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+
>>>>>>> 80d6b5683c5 (infosync: refactor server config into dynamic and static sections (#58473))

0 commit comments

Comments
 (0)