Skip to content

Commit 4eeeef8

Browse files
authored
br: clean codes -- restore tables (#55519)
ref #52877
1 parent d041cd0 commit 4eeeef8

30 files changed

+687
-2099
lines changed

br/pkg/restore/internal/log_split/BUILD.bazel

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,9 @@ go_library(
1010
visibility = ["//br/pkg/restore:__subpackages__"],
1111
deps = [
1212
"//br/pkg/logutil",
13-
"//br/pkg/restore/internal/utils",
13+
"//br/pkg/restore/internal/snap_split",
1414
"//br/pkg/restore/split",
1515
"//br/pkg/restore/utils",
16-
"//br/pkg/rtree",
1716
"//br/pkg/utils",
1817
"//pkg/kv",
1918
"//pkg/tablecodec",
@@ -40,7 +39,7 @@ go_test(
4039
flaky = True,
4140
shard_count = 4,
4241
deps = [
43-
"//br/pkg/restore/internal/utils",
42+
"//br/pkg/restore/internal/snap_split",
4443
"//br/pkg/restore/split",
4544
"//br/pkg/restore/utils",
4645
"//br/pkg/utiltest",

br/pkg/restore/internal/log_split/split.go

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,9 @@ import (
2424
"github.com/pingcap/errors"
2525
backuppb "github.com/pingcap/kvproto/pkg/brpb"
2626
"github.com/pingcap/log"
27-
"github.com/pingcap/tidb/br/pkg/restore/internal/utils"
27+
snapsplit "github.com/pingcap/tidb/br/pkg/restore/internal/snap_split"
2828
"github.com/pingcap/tidb/br/pkg/restore/split"
2929
restoreutils "github.com/pingcap/tidb/br/pkg/restore/utils"
30-
"github.com/pingcap/tidb/br/pkg/rtree"
3130
"github.com/pingcap/tidb/pkg/tablecodec"
3231
"github.com/pingcap/tidb/pkg/util"
3332
"github.com/pingcap/tidb/pkg/util/codec"
@@ -139,11 +138,11 @@ func (helper *LogSplitHelper) Merge(file *backuppb.DataFileInfo) {
139138
})
140139
}
141140

142-
type splitFunc = func(context.Context, *utils.RegionSplitter, uint64, int64, *split.RegionInfo, []Valued) error
141+
type splitFunc = func(context.Context, *snapsplit.RegionSplitter, uint64, int64, *split.RegionInfo, []Valued) error
143142

144143
func (helper *LogSplitHelper) splitRegionByPoints(
145144
ctx context.Context,
146-
regionSplitter *utils.RegionSplitter,
145+
regionSplitter *snapsplit.RegionSplitter,
147146
initialLength uint64,
148147
initialNumber int64,
149148
region *split.RegionInfo,
@@ -176,14 +175,10 @@ func (helper *LogSplitHelper) splitRegionByPoints(
176175
newRegions, errSplit := regionSplitter.SplitWaitAndScatter(ctx, region, splitPoints)
177176
if errSplit != nil {
178177
log.Warn("failed to split the scaned region", zap.Error(errSplit))
179-
_, startKey, _ := codec.DecodeBytes(region.Region.StartKey, nil)
180-
ranges := make([]rtree.Range, 0, len(splitPoints))
181-
for _, point := range splitPoints {
182-
ranges = append(ranges, rtree.Range{StartKey: startKey, EndKey: point})
183-
startKey = point
184-
}
185-
186-
return regionSplitter.ExecuteSplit(ctx, ranges)
178+
sort.Slice(splitPoints, func(i, j int) bool {
179+
return bytes.Compare(splitPoints[i], splitPoints[j]) < 0
180+
})
181+
return regionSplitter.ExecuteSplit(ctx, splitPoints)
187182
}
188183
select {
189184
case <-ctx.Done():
@@ -205,7 +200,7 @@ func SplitPoint(
205200
) (err error) {
206201
// common status
207202
var (
208-
regionSplitter *utils.RegionSplitter = utils.NewRegionSplitter(client)
203+
regionSplitter *snapsplit.RegionSplitter = snapsplit.NewRegionSplitter(client)
209204
)
210205
// region traverse status
211206
var (
@@ -357,7 +352,7 @@ func (helper *LogSplitHelper) Split(ctx context.Context) error {
357352
}
358353
}
359354

360-
regionSplitter := utils.NewRegionSplitter(helper.client)
355+
regionSplitter := snapsplit.NewRegionSplitter(helper.client)
361356
// It is too expensive to stop recovery and wait for a small number of regions
362357
// to complete scatter, so the maximum waiting time is reduced to 1 minute.
363358
_ = regionSplitter.WaitForScatterRegionsTimeout(ctx, scatterRegions, time.Minute)

br/pkg/restore/internal/log_split/split_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import (
2323
backuppb "github.com/pingcap/kvproto/pkg/brpb"
2424
"github.com/pingcap/kvproto/pkg/import_sstpb"
2525
logsplit "github.com/pingcap/tidb/br/pkg/restore/internal/log_split"
26-
"github.com/pingcap/tidb/br/pkg/restore/internal/utils"
26+
snapsplit "github.com/pingcap/tidb/br/pkg/restore/internal/snap_split"
2727
"github.com/pingcap/tidb/br/pkg/restore/split"
2828
restoreutils "github.com/pingcap/tidb/br/pkg/restore/utils"
2929
"github.com/pingcap/tidb/br/pkg/utiltest"
@@ -66,7 +66,7 @@ func TestSplitPoint(t *testing.T) {
6666
client.AppendRegion(keyWithTablePrefix(tableID, "j"), keyWithTablePrefix(tableID+1, "a"))
6767

6868
iter := logsplit.NewSplitHelperIteratorForTest(splitHelper, tableID, rewriteRules)
69-
err := logsplit.SplitPoint(ctx, iter, client, func(ctx context.Context, rs *utils.RegionSplitter, u uint64, o int64, ri *split.RegionInfo, v []logsplit.Valued) error {
69+
err := logsplit.SplitPoint(ctx, iter, client, func(ctx context.Context, rs *snapsplit.RegionSplitter, u uint64, o int64, ri *split.RegionInfo, v []logsplit.Valued) error {
7070
require.Equal(t, u, uint64(0))
7171
require.Equal(t, o, int64(0))
7272
require.Equal(t, ri.Region.StartKey, keyWithTablePrefix(tableID, "a"))
@@ -124,7 +124,7 @@ func TestSplitPoint2(t *testing.T) {
124124

125125
firstSplit := true
126126
iter := logsplit.NewSplitHelperIteratorForTest(splitHelper, tableID, rewriteRules)
127-
err := logsplit.SplitPoint(ctx, iter, client, func(ctx context.Context, rs *utils.RegionSplitter, u uint64, o int64, ri *split.RegionInfo, v []logsplit.Valued) error {
127+
err := logsplit.SplitPoint(ctx, iter, client, func(ctx context.Context, rs *snapsplit.RegionSplitter, u uint64, o int64, ri *split.RegionInfo, v []logsplit.Valued) error {
128128
if firstSplit {
129129
require.Equal(t, u, uint64(0))
130130
require.Equal(t, o, int64(0))

br/pkg/restore/internal/utils/BUILD.bazel renamed to br/pkg/restore/internal/snap_split/BUILD.bazel

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,29 @@
11
load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
22

33
go_library(
4-
name = "utils",
4+
name = "snap_split",
55
srcs = ["split.go"],
6-
importpath = "github.com/pingcap/tidb/br/pkg/restore/internal/utils",
6+
importpath = "github.com/pingcap/tidb/br/pkg/restore/internal/snap_split",
77
visibility = ["//br/pkg/restore:__subpackages__"],
88
deps = [
9-
"//br/pkg/errors",
10-
"//br/pkg/logutil",
119
"//br/pkg/restore/split",
12-
"//br/pkg/rtree",
13-
"@com_github_opentracing_opentracing_go//:opentracing-go",
1410
"@com_github_pingcap_errors//:errors",
1511
"@com_github_pingcap_log//:log",
1612
"@org_uber_go_zap//:zap",
1713
],
1814
)
1915

2016
go_test(
21-
name = "utils_test",
17+
name = "snap_split_test",
2218
timeout = "short",
2319
srcs = ["split_test.go"],
2420
flaky = True,
25-
shard_count = 5,
21+
shard_count = 4,
2622
deps = [
27-
":utils",
23+
":snap_split",
2824
"//br/pkg/restore/split",
2925
"//br/pkg/restore/utils",
3026
"//br/pkg/rtree",
31-
"//pkg/tablecodec",
3227
"//pkg/util/codec",
3328
"@com_github_pingcap_kvproto//pkg/import_sstpb",
3429
"@com_github_stretchr_testify//require",

br/pkg/restore/internal/utils/split.go renamed to br/pkg/restore/internal/snap_split/split.go

Lines changed: 6 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,14 @@
11
// Copyright 2020 PingCAP, Inc. Licensed under Apache-2.0.
22

3-
package utils
3+
package snapsplit
44

55
import (
66
"context"
77
"time"
88

9-
"github.com/opentracing/opentracing-go"
109
"github.com/pingcap/errors"
1110
"github.com/pingcap/log"
12-
berrors "github.com/pingcap/tidb/br/pkg/errors"
13-
"github.com/pingcap/tidb/br/pkg/logutil"
1411
"github.com/pingcap/tidb/br/pkg/restore/split"
15-
"github.com/pingcap/tidb/br/pkg/rtree"
1612
"go.uber.org/zap"
1713
)
1814

@@ -41,37 +37,15 @@ func (rs *RegionSplitter) SplitWaitAndScatter(ctx context.Context, region *split
4137
// note: all ranges and rewrite rules must have raw key.
4238
func (rs *RegionSplitter) ExecuteSplit(
4339
ctx context.Context,
44-
ranges []rtree.Range,
40+
sortedSplitKeys [][]byte,
4541
) error {
46-
if len(ranges) == 0 {
47-
log.Info("skip split regions, no range")
42+
if len(sortedSplitKeys) == 0 {
43+
log.Info("skip split regions, no split keys")
4844
return nil
4945
}
5046

51-
if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil {
52-
span1 := span.Tracer().StartSpan("RegionSplitter.Split", opentracing.ChildOf(span.Context()))
53-
defer span1.Finish()
54-
ctx = opentracing.ContextWithSpan(ctx, span1)
55-
}
56-
57-
// Sort the range for getting the min and max key of the ranges
58-
// TODO: this sort may not needed if we sort tables after creatation outside.
59-
sortedRanges, errSplit := SortRanges(ranges)
60-
if errSplit != nil {
61-
return errors.Trace(errSplit)
62-
}
63-
if len(sortedRanges) == 0 {
64-
log.Info("skip split regions after sorted, no range")
65-
return nil
66-
}
67-
sortedKeys := make([][]byte, 0, len(sortedRanges))
68-
totalRangeSize := uint64(0)
69-
for _, r := range sortedRanges {
70-
sortedKeys = append(sortedKeys, r.EndKey)
71-
totalRangeSize += r.Size
72-
}
73-
// the range size must be greater than 0 here
74-
return rs.executeSplitByRanges(ctx, sortedKeys)
47+
log.Info("execute split sorted keys", zap.Int("keys count", len(sortedSplitKeys)))
48+
return rs.executeSplitByRanges(ctx, sortedSplitKeys)
7549
}
7650

7751
func (rs *RegionSplitter) executeSplitByRanges(
@@ -151,20 +125,3 @@ func (rs *RegionSplitter) WaitForScatterRegionsTimeout(ctx context.Context, regi
151125
leftRegions, _ := rs.client.WaitRegionsScattered(ctx2, regionInfos)
152126
return leftRegions
153127
}
154-
155-
// SortRanges checks if the range overlapped and sort them.
156-
func SortRanges(ranges []rtree.Range) ([]rtree.Range, error) {
157-
rangeTree := rtree.NewRangeTree()
158-
for _, rg := range ranges {
159-
if out := rangeTree.InsertRange(rg); out != nil {
160-
log.Error("insert ranges overlapped",
161-
logutil.Key("startKeyOut", out.StartKey),
162-
logutil.Key("endKeyOut", out.EndKey),
163-
logutil.Key("startKeyIn", rg.StartKey),
164-
logutil.Key("endKeyIn", rg.EndKey))
165-
return nil, errors.Annotatef(berrors.ErrInvalidRange, "ranges overlapped")
166-
}
167-
}
168-
sortedRanges := rangeTree.GetSortedRanges()
169-
return sortedRanges, nil
170-
}

0 commit comments

Comments
 (0)