diff --git a/store/mockstore/mocktikv/mock_tikv_test.go b/store/mockstore/mocktikv/mock_tikv_test.go index 9085c792ffe4f..0e5315ad5d08e 100644 --- a/store/mockstore/mocktikv/mock_tikv_test.go +++ b/store/mockstore/mocktikv/mock_tikv_test.go @@ -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) { diff --git a/store/mockstore/mocktikv/mvcc_leveldb.go b/store/mockstore/mocktikv/mvcc_leveldb.go index 35c7a35343978..c99c95759f904 100644 --- a/store/mockstore/mocktikv/mvcc_leveldb.go +++ b/store/mockstore/mocktikv/mvcc_leveldb.go @@ -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. @@ -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) }