Skip to content

Commit cb2a705

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

File tree

14 files changed

+1115
-94
lines changed

14 files changed

+1115
-94
lines changed

pkg/ddl/ddl_test.go

Lines changed: 232 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,3 +304,235 @@ func TestCheckDuplicateConstraint(t *testing.T) {
304304
err = checkDuplicateConstraint(constrNames, "u1", ast.ConstraintUniq)
305305
require.EqualError(t, err, "[ddl:1061]Duplicate key name 'u1'")
306306
}
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+
>>>>>>> 80d6b5683c5 (infosync: refactor server config into dynamic and static sections (#58473))

0 commit comments

Comments
 (0)