diff --git a/integration_tests/delete_range_test.go b/integration_tests/delete_range_test.go index 644268e81..48aa305b3 100644 --- a/integration_tests/delete_range_test.go +++ b/integration_tests/delete_range_test.go @@ -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) } diff --git a/internal/mockstore/mocktikv/mvcc_leveldb.go b/internal/mockstore/mocktikv/mvcc_leveldb.go index ae3f00459..00ef3f8fb 100644 --- a/internal/mockstore/mocktikv/mvcc_leveldb.go +++ b/internal/mockstore/mocktikv/mvcc_leveldb.go @@ -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. diff --git a/txnkv/rangetask/delete_range.go b/txnkv/rangetask/delete_range.go index 02558915f..8ceb07c95 100644 --- a/txnkv/rangetask/delete_range.go +++ b/txnkv/rangetask/delete_range.go @@ -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 }