Skip to content

Commit f1f62f7

Browse files
authored
br: Fix RangeTree.GetIncompleteRange when the rangeTree is empty. (pingcap#37086) (pingcap#46168)
1 parent b0f589e commit f1f62f7

File tree

4 files changed

+26
-21
lines changed

4 files changed

+26
-21
lines changed

br/pkg/backup/push.go

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,6 @@ func (push *pushDown) pushBackup(
119119
close(push.respCh)
120120
}()
121121

122-
regionErrorIngestedOnce := false
123122
for {
124123
select {
125124
case respAndStore, ok := <-push.respCh:
@@ -151,19 +150,16 @@ func (push *pushDown) pushBackup(
151150
}
152151
})
153152
failpoint.Inject("tikv-region-error", func(val failpoint.Value) {
154-
if !regionErrorIngestedOnce {
155-
msg := val.(string)
156-
logutil.CL(ctx).Debug("failpoint tikv-regionh-error injected.", zap.String("msg", msg))
157-
resp.Error = &backuppb.Error{
158-
// Msg: msg,
159-
Detail: &backuppb.Error_RegionError{
160-
RegionError: &errorpb.Error{
161-
Message: msg,
162-
},
153+
msg := val.(string)
154+
logutil.CL(ctx).Debug("failpoint tikv-region-error injected.", zap.String("msg", msg))
155+
resp.Error = &backuppb.Error{
156+
// Msg: msg,
157+
Detail: &backuppb.Error_RegionError{
158+
RegionError: &errorpb.Error{
159+
Message: msg,
163160
},
164-
}
161+
},
165162
}
166-
regionErrorIngestedOnce = true
167163
})
168164
if resp.GetError() == nil {
169165
// None error means range has been backuped successfully.

br/pkg/rtree/rtree.go

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -185,17 +185,19 @@ func (rangeTree *RangeTree) GetIncompleteRange(
185185
return []Range{}
186186
}
187187
incomplete := make([]Range, 0, 64)
188-
requsetRange := Range{StartKey: startKey, EndKey: endKey}
188+
requestRange := Range{StartKey: startKey, EndKey: endKey}
189189
lastEndKey := startKey
190190
pviot := &Range{StartKey: startKey}
191191
if first := rangeTree.Find(pviot); first != nil {
192192
pviot.StartKey = first.StartKey
193193
}
194+
pviotNotFound := true
194195
rangeTree.AscendGreaterOrEqual(pviot, func(i btree.Item) bool {
196+
pviotNotFound = false
195197
rg := i.(*Range)
196198
if bytes.Compare(lastEndKey, rg.StartKey) < 0 {
197199
start, end, isIntersect :=
198-
requsetRange.Intersect(lastEndKey, rg.StartKey)
200+
requestRange.Intersect(lastEndKey, rg.StartKey)
199201
if isIntersect {
200202
// There is a gap between the last item and the current item.
201203
incomplete =
@@ -207,9 +209,10 @@ func (rangeTree *RangeTree) GetIncompleteRange(
207209
})
208210

209211
// Check whether we need append the last range
210-
if !bytes.Equal(lastEndKey, endKey) && len(lastEndKey) != 0 &&
211-
(len(endKey) == 0 || bytes.Compare(lastEndKey, endKey) < 0) {
212-
start, end, isIntersect := requsetRange.Intersect(lastEndKey, endKey)
212+
if pviotNotFound ||
213+
(!bytes.Equal(lastEndKey, endKey) && len(lastEndKey) != 0 &&
214+
(len(endKey) == 0 || bytes.Compare(lastEndKey, endKey) < 0)) {
215+
start, end, isIntersect := requestRange.Intersect(lastEndKey, endKey)
213216
if isIntersect {
214217
incomplete =
215218
append(incomplete, Range{StartKey: start, EndKey: end})

br/pkg/rtree/rtree_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ func TestRangeTree(t *testing.T) {
4747
}
4848
}
4949

50+
assertIncomplete([]byte(""), []byte("b"), []rtree.Range{{StartKey: []byte(""), EndKey: []byte("b")}})
51+
assertIncomplete([]byte(""), []byte(""), []rtree.Range{{StartKey: []byte(""), EndKey: []byte("")}})
52+
assertIncomplete([]byte("b"), []byte(""), []rtree.Range{{StartKey: []byte("b"), EndKey: []byte("")}})
53+
5054
range0 := newRange([]byte(""), []byte("a"))
5155
rangeA := newRange([]byte("a"), []byte("b"))
5256
rangeB := newRange([]byte("b"), []byte("c"))
@@ -61,6 +65,7 @@ func TestRangeTree(t *testing.T) {
6165
{StartKey: []byte(""), EndKey: []byte("a")},
6266
{StartKey: []byte("b"), EndKey: []byte("")},
6367
})
68+
assertIncomplete([]byte("b"), []byte(""), []rtree.Range{{StartKey: []byte("b"), EndKey: []byte("")}})
6469

6570
rangeTree.Update(*rangeC)
6671
require.Equal(t, 2, rangeTree.Len())

br/tests/br_rawkv/run.sh

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,7 @@ test_full_rawkv() {
5252

5353
checksum_full=$(checksum $check_range_start $check_range_end)
5454
# backup current state of key-values
55-
# raw backup is not working with range [nil, nil]. TODO: fix it.
56-
run_br --pd $PD_ADDR backup raw -s "local://$BACKUP_FULL" --crypter.method "aes128-ctr" --crypter.key "0123456789abcdef0123456789abcdef" --start $check_range_start --format hex
55+
run_br --pd $PD_ADDR backup raw -s "local://$BACKUP_FULL" --crypter.method "aes128-ctr" --crypter.key "0123456789abcdef0123456789abcdef"
5756

5857
clean $check_range_start $check_range_end
5958
# Ensure the data is deleted
@@ -63,7 +62,7 @@ test_full_rawkv() {
6362
fail_and_exit
6463
fi
6564

66-
run_br --pd $PD_ADDR restore raw -s "local://$BACKUP_FULL" --crypter.method "aes128-ctr" --crypter.key "0123456789abcdef0123456789abcdef" --start $check_range_start --format hex
65+
run_br --pd $PD_ADDR restore raw -s "local://$BACKUP_FULL" --crypter.method "aes128-ctr" --crypter.key "0123456789abcdef0123456789abcdef"
6766
checksum_new=$(checksum $check_range_start $check_range_end)
6867
if [ "$checksum_new" != "$checksum_full" ];then
6968
echo "failed to restore"
@@ -185,5 +184,7 @@ run_test() {
185184

186185
run_test ""
187186

188-
# ingest "region error" to trigger fineGrainedBackup
187+
# ingest "region error" to trigger fineGrainedBackup, only one region error.
188+
run_test "github.com/pingcap/tidb/br/pkg/backup/tikv-region-error=1*return(\"region error\")"
189+
# all regions failed.
189190
run_test "github.com/pingcap/tidb/br/pkg/backup/tikv-region-error=return(\"region error\")"

0 commit comments

Comments
 (0)