txnkv: fix the issue that deleteRange cannot use nil as endkey (#429)

Signed-off-by: disksing <i@disksing.com>
This commit is contained in:
disksing 2022-02-24 15:51:38 +08:00 committed by GitHub
parent f43cc3acc0
commit e5f932ae27
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 13 additions and 4 deletions

View File

@ -118,7 +118,7 @@ func (s *testDeleteRangeSuite) deleteRange(startKey []byte, endKey []byte) int {
func deleteRangeFromMap(m map[string]string, startKey []byte, endKey []byte) {
for keyStr := range m {
key := []byte(keyStr)
if bytes.Compare(startKey, key) <= 0 && bytes.Compare(key, endKey) < 0 {
if bytes.Compare(startKey, key) <= 0 && (len(endKey) == 0 || bytes.Compare(key, endKey) < 0) {
delete(m, keyStr)
}
}
@ -160,4 +160,5 @@ func (s *testDeleteRangeSuite) TestDeleteRange() {
s.mustDeleteRange([]byte("d0\x00"), []byte("d1\x00"), testData, 1)
s.mustDeleteRange([]byte("c5"), []byte("d5"), testData, 2)
s.mustDeleteRange([]byte("a"), []byte("z"), testData, 4)
s.mustDeleteRange(nil, nil, testData, 4)
}

View File

@ -1538,7 +1538,11 @@ func (mvcc *MVCCLevelDB) GC(startKey, endKey []byte, safePoint uint64) error {
// DeleteRange implements the MVCCStore interface.
func (mvcc *MVCCLevelDB) DeleteRange(startKey, endKey []byte) error {
return mvcc.doRawDeleteRange(codec.EncodeBytes(nil, startKey), codec.EncodeBytes(nil, endKey))
var end []byte
if len(endKey) > 0 {
end = codec.EncodeBytes(nil, endKey)
}
return mvcc.doRawDeleteRange(codec.EncodeBytes(nil, startKey), end)
}
// Close calls leveldb's Close to free resources.

View File

@ -123,7 +123,7 @@ func (t *DeleteRangeTask) sendReqOnRange(ctx context.Context, r kv.KeyRange) (Ta
default:
}
if bytes.Compare(startKey, rangeEndKey) >= 0 {
if len(rangeEndKey) > 0 && bytes.Compare(startKey, rangeEndKey) >= 0 {
break
}
@ -135,8 +135,9 @@ func (t *DeleteRangeTask) sendReqOnRange(ctx context.Context, r kv.KeyRange) (Ta
// Delete to the end of the region, except if it's the last region overlapping the range
endKey := loc.EndKey
isLast := len(endKey) == 0 || (len(rangeEndKey) > 0 && bytes.Compare(endKey, rangeEndKey) >= 0)
// If it is the last region
if loc.Contains(rangeEndKey) {
if isLast {
endKey = rangeEndKey
}
@ -169,6 +170,9 @@ func (t *DeleteRangeTask) sendReqOnRange(ctx context.Context, r kv.KeyRange) (Ta
return stat, errors.Errorf("unexpected delete range err: %v", err)
}
stat.CompletedRegions++
if isLast {
break
}
startKey = endKey
}