fix key not found and close iter (#132)

Signed-off-by: Connor1996 <zbk602423539@gmail.com>
This commit is contained in:
Connor 2020-03-22 00:04:20 +08:00
parent b46700aa49
commit 8aa0fa7768
6 changed files with 19 additions and 10 deletions

View File

@ -4,7 +4,6 @@ import (
"os"
"testing"
"github.com/Connor1996/badger"
"github.com/pingcap-incubator/tinykv/kv/config"
"github.com/pingcap-incubator/tinykv/kv/storage"
"github.com/pingcap-incubator/tinykv/kv/storage/standalone_storage"
@ -183,8 +182,9 @@ func TestRawDelete1(t *testing.T) {
_, err := server.RawDelete(nil, req)
assert.Nil(t, err)
_, err = Get(s, cf, []byte{99})
assert.Equal(t, err, badger.ErrKeyNotFound)
val, err := Get(s, cf, []byte{99})
assert.Equal(t, err, nil)
assert.Equal(t, val, []byte(nil))
}
func TestRawScan1(t *testing.T) {

View File

@ -23,7 +23,11 @@ func (r *RegionReader) GetCF(cf string, key []byte) ([]byte, error) {
if err := util.CheckKeyInRegion(key, r.region); err != nil {
return nil, err
}
return engine_util.GetCFFromTxn(r.txn, cf, key)
val, err := engine_util.GetCFFromTxn(r.txn, cf, key)
if err == badger.ErrKeyNotFound {
return nil, nil
}
return val, err
}
func (r *RegionReader) IterCF(cf string) engine_util.DBIterator {

View File

@ -15,6 +15,7 @@ type Storage interface {
}
type StorageReader interface {
// When the key doesn't exist, return nil for the value
GetCF(cf string, key []byte) ([]byte, error)
IterCF(cf string) engine_util.DBIterator
Close()

View File

@ -381,6 +381,7 @@ func (c *Cluster) Scan(start, end []byte) [][]byte {
}
values = append(values, value)
}
iter.Close()
key = region.EndKey
if len(key) == 0 {

View File

@ -71,7 +71,7 @@ func TestGetEmpty4B(t *testing.T) {
assert.Nil(t, resp.RegionError)
assert.Nil(t, resp.Error)
assert.Equal(t, []byte(nil), resp.Value)
assert.True(t, resp.NotFound)
}
// TestGetNone4B tests that getting a missing key works.
@ -91,7 +91,7 @@ func TestGetNone4B(t *testing.T) {
resp := builder.runOneRequest(&req).(*kvrpcpb.GetResponse)
assert.Nil(t, resp.RegionError)
assert.Nil(t, resp.Error)
assert.Equal(t, []byte(nil), resp.Value)
assert.True(t, resp.NotFound)
}
// TestGetVersions4B tests we get the correct value when there are multiple versions.
@ -135,7 +135,7 @@ func TestGetVersions4B(t *testing.T) {
assert.Nil(t, resp0.RegionError)
assert.Nil(t, resp0.Error)
assert.Equal(t, []byte(nil), resp0.Value)
assert.True(t, resp0.NotFound)
assert.Nil(t, resp1.RegionError)
assert.Nil(t, resp1.Error)
assert.Equal(t, []byte{42}, resp1.Value)
@ -203,10 +203,10 @@ func TestGetDeleted4B(t *testing.T) {
assert.Equal(t, []byte{42}, resp2.Value)
assert.Nil(t, resp3.RegionError)
assert.Nil(t, resp3.Error)
assert.Equal(t, []byte(nil), resp3.Value)
assert.True(t, resp3.NotFound)
assert.Nil(t, resp4.RegionError)
assert.Nil(t, resp4.Error)
assert.Equal(t, []byte(nil), resp4.Value)
assert.True(t, resp4.NotFound)
assert.Nil(t, resp5.RegionError)
assert.Nil(t, resp5.Error)
assert.Equal(t, []byte{44}, resp5.Value)

View File

@ -77,7 +77,10 @@ func (lock *Lock) IsLockedFor(key []byte, txnStartTs uint64, resp interface{}) b
// AllLocksForTxn returns all locks for the current transaction.
func AllLocksForTxn(txn *MvccTxn) ([]KlPair, error) {
var result []KlPair
for iter := txn.Reader().IterCF(engine_util.CfLock); iter.Valid(); iter.Next() {
iter := txn.Reader.IterCF(engine_util.CfLock)
defer iter.Close()
for ; iter.Valid(); iter.Next() {
item := iter.Item()
val, err := item.Value()
if err != nil {