Skip to content

Commit 17e2708

Browse files
3pointerguoliang.zhu
authored andcommitted
txn: restore failed due to file end key is empty (pingcap#52572)
close pingcap#52574
1 parent f7d66f4 commit 17e2708

File tree

3 files changed

+91
-13
lines changed

3 files changed

+91
-13
lines changed

br/pkg/restore/client.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1588,7 +1588,10 @@ func (rc *Client) WaitForFilesRestored(ctx context.Context, files []*backuppb.Fi
15881588
fileReplica := file
15891589
rc.workerPool.ApplyOnErrorGroup(eg,
15901590
func() error {
1591-
defer updateCh.Inc()
1591+
defer func() {
1592+
log.Info("import sst files done", logutil.Files(files))
1593+
updateCh.Inc()
1594+
}()
15921595
return rc.fileImporter.ImportSSTFiles(ectx, []*backuppb.File{fileReplica}, EmptyRewriteRule(), rc.cipher, rc.backupMeta.ApiVersion)
15931596
})
15941597
}

br/pkg/restore/import.go

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,30 @@ func (importer *FileImporter) SetRawRange(startKey, endKey []byte) error {
485485
return nil
486486
}
487487

488+
func getKeyRangeByMode(mode KvMode) func(f *backuppb.File, rules *RewriteRules) ([]byte, []byte, error) {
489+
switch mode {
490+
case Raw:
491+
return func(f *backuppb.File, rules *RewriteRules) ([]byte, []byte, error) {
492+
return f.GetStartKey(), f.GetEndKey(), nil
493+
}
494+
case Txn:
495+
return func(f *backuppb.File, rules *RewriteRules) ([]byte, []byte, error) {
496+
start, end := f.GetStartKey(), f.GetEndKey()
497+
if len(start) != 0 {
498+
start = codec.EncodeBytes([]byte{}, f.GetStartKey())
499+
}
500+
if len(end) != 0 {
501+
end = codec.EncodeBytes([]byte{}, f.GetEndKey())
502+
}
503+
return start, end, nil
504+
}
505+
default:
506+
return func(f *backuppb.File, rules *RewriteRules) ([]byte, []byte, error) {
507+
return GetRewriteRawKeys(f, rules)
508+
}
509+
}
510+
}
511+
488512
// getKeyRangeForFiles gets the maximum range on files.
489513
func (importer *FileImporter) getKeyRangeForFiles(
490514
files []*backuppb.File,
@@ -495,20 +519,12 @@ func (importer *FileImporter) getKeyRangeForFiles(
495519
start, end []byte
496520
err error
497521
)
498-
522+
getRangeFn := getKeyRangeByMode(importer.kvMode)
499523
for _, f := range files {
500-
if importer.kvMode == Raw {
501-
start, end = f.GetStartKey(), f.GetEndKey()
502-
} else if importer.kvMode == Txn {
503-
start = codec.EncodeBytes([]byte{}, f.GetStartKey())
504-
end = codec.EncodeBytes([]byte{}, f.GetEndKey())
505-
} else {
506-
start, end, err = GetRewriteRawKeys(f, rewriteRules)
507-
if err != nil {
508-
return nil, nil, errors.Trace(err)
509-
}
524+
start, end, err = getRangeFn(f, rewriteRules)
525+
if err != nil {
526+
return nil, nil, errors.Trace(err)
510527
}
511-
512528
if len(startKey) == 0 || bytes.Compare(start, startKey) < 0 {
513529
startKey = start
514530
}

br/pkg/restore/util_test.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,65 @@ import (
1616
"github.com/stretchr/testify/require"
1717
)
1818

19+
func TestGetKeyRangeByMode(t *testing.T) {
20+
file := &backuppb.File{
21+
Name: "file_write.sst",
22+
StartKey: []byte("t1a"),
23+
EndKey: []byte("t1ccc"),
24+
}
25+
endFile := &backuppb.File{
26+
Name: "file_write.sst",
27+
StartKey: []byte("t1a"),
28+
EndKey: []byte(""),
29+
}
30+
rule := &RewriteRules{
31+
Data: []*import_sstpb.RewriteRule{
32+
{
33+
OldKeyPrefix: []byte("t1"),
34+
NewKeyPrefix: []byte("t2"),
35+
},
36+
},
37+
}
38+
// raw kv
39+
testRawFn := getKeyRangeByMode(Raw)
40+
start, end, err := testRawFn(file, rule)
41+
require.NoError(t, err)
42+
require.Equal(t, []byte("t1a"), start)
43+
require.Equal(t, []byte("t1ccc"), end)
44+
45+
start, end, err = testRawFn(endFile, rule)
46+
require.NoError(t, err)
47+
require.Equal(t, []byte("t1a"), start)
48+
require.Equal(t, []byte(""), end)
49+
50+
// txn kv: the keys must be encoded.
51+
testTxnFn := getKeyRangeByMode(Txn)
52+
start, end, err = testTxnFn(file, rule)
53+
require.NoError(t, err)
54+
require.Equal(t, codec.EncodeBytes(nil, []byte("t1a")), start)
55+
require.Equal(t, codec.EncodeBytes(nil, []byte("t1ccc")), end)
56+
57+
start, end, err = testTxnFn(endFile, rule)
58+
require.NoError(t, err)
59+
require.Equal(t, codec.EncodeBytes(nil, []byte("t1a")), start)
60+
require.Equal(t, []byte(""), end)
61+
62+
// normal kv: the keys must be encoded.
63+
testFn := getKeyRangeByMode(TiDB)
64+
start, end, err = testFn(file, rule)
65+
require.NoError(t, err)
66+
require.Equal(t, codec.EncodeBytes(nil, []byte("t2a")), start)
67+
require.Equal(t, codec.EncodeBytes(nil, []byte("t2ccc")), end)
68+
69+
// TODO maybe fix later
70+
// current restore does not support rewrite empty endkey.
71+
// because backup guarantees that the end key is not empty.
72+
// start, end, err = testFn(endFile, rule)
73+
// require.NoError(t, err)
74+
// require.Equal(t, codec.EncodeBytes(nil, []byte("t2a")), start)
75+
// require.Equal(t, []byte(""), end)
76+
}
77+
1978
func TestParseQuoteName(t *testing.T) {
2079
schema, table := ParseQuoteName("`a`.`b`")
2180
require.Equal(t, "a", schema)

0 commit comments

Comments
 (0)