Skip to content

Commit

Permalink
store/mockstore: Fix that DeleteRange didn't encode keys. (pingcap#6264)
Browse files Browse the repository at this point in the history
  • Loading branch information
MyonKeminta authored and tiancaiamao committed Apr 13, 2018
1 parent 998f696 commit 22ebc28
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 16 deletions.
5 changes: 4 additions & 1 deletion store/mockstore/mocktikv/mock_tikv_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -453,8 +453,11 @@ func (s *testMockTiKVSuite) TestDeleteRange(c *C) {
s.mustDeleteRange(c, "41", "42")
s.mustScanOK(c, "0", 10, 50, "1", "v1", "4", "v4", "5", "v5")

s.mustDeleteRange(c, "4\x00", "5\x00")
s.mustScanOK(c, "0", 10, 60, "1", "v1", "4", "v4")

s.mustDeleteRange(c, "0", "9")
s.mustScanOK(c, "0", 10, 60)
s.mustScanOK(c, "0", 10, 70)
}

func (s *testMockTiKVSuite) mustWriteWriteConflict(c *C, errs []error, i int) {
Expand Down
35 changes: 20 additions & 15 deletions store/mockstore/mocktikv/mvcc_leveldb.go
Original file line number Diff line number Diff line change
Expand Up @@ -881,20 +881,7 @@ func (mvcc *MVCCLevelDB) BatchResolveLock(startKey, endKey []byte, txnInfos map[

// DeleteRange implements the MVCCStore interface.
func (mvcc *MVCCLevelDB) DeleteRange(startKey, endKey []byte) error {
mvcc.mu.Lock()
defer mvcc.mu.Unlock()

batch := &leveldb.Batch{}

iter := mvcc.db.NewIterator(&util.Range{
Start: startKey,
Limit: endKey,
}, nil)
for iter.Next() {
batch.Delete(iter.Key())
}

return mvcc.db.Write(batch, nil)
return mvcc.doRawDeleteRange(codec.EncodeBytes(nil, startKey), codec.EncodeBytes(nil, endKey))
}

// Close calls leveldb's Close to free resources.
Expand Down Expand Up @@ -959,5 +946,23 @@ func (mvcc *MVCCLevelDB) RawScan(startKey, endKey []byte, limit int) []Pair {

// RawDeleteRange implements the RawKV interface.
func (mvcc *MVCCLevelDB) RawDeleteRange(startKey, endKey []byte) {
terror.Log(mvcc.DeleteRange(startKey, endKey))
terror.Log(mvcc.doRawDeleteRange(startKey, endKey))
}

// doRawDeleteRange deletes all keys in a range and return the error if any.
func (mvcc *MVCCLevelDB) doRawDeleteRange(startKey, endKey []byte) error {
mvcc.mu.Lock()
defer mvcc.mu.Unlock()

batch := &leveldb.Batch{}

iter := mvcc.db.NewIterator(&util.Range{
Start: startKey,
Limit: endKey,
}, nil)
for iter.Next() {
batch.Delete(iter.Key())
}

return mvcc.db.Write(batch, nil)
}

0 comments on commit 22ebc28

Please sign in to comment.