Commit c2a382d9 authored by liuyuhang's avatar liuyuhang

add kvmvccMavl

parent a09d4922
...@@ -117,9 +117,9 @@ type RoundState struct { ...@@ -117,9 +117,9 @@ type RoundState struct {
// RoundStateMessage ... // RoundStateMessage ...
func (rs *RoundState) RoundStateMessage() *tmtypes.NewRoundStepMsg { func (rs *RoundState) RoundStateMessage() *tmtypes.NewRoundStepMsg {
return &tmtypes.NewRoundStepMsg{ return &tmtypes.NewRoundStepMsg{
Height: rs.Height, Height: rs.Height,
Round: int32(rs.Round), Round: int32(rs.Round),
Step: int32(rs.Step), Step: int32(rs.Step),
SecondsSinceStartTime: int32(time.Since(rs.StartTime).Seconds()), SecondsSinceStartTime: int32(time.Since(rs.StartTime).Seconds()),
LastCommitRound: int32(rs.LastCommit.Round()), LastCommitRound: int32(rs.LastCommit.Round()),
} }
......
...@@ -78,9 +78,9 @@ func ParseX509CertificateToSm2(x509Cert *x509.Certificate) *sm2.Certificate { ...@@ -78,9 +78,9 @@ func ParseX509CertificateToSm2(x509Cert *x509.Certificate) *sm2.Certificate {
UnknownExtKeyUsage: x509Cert.UnknownExtKeyUsage, UnknownExtKeyUsage: x509Cert.UnknownExtKeyUsage,
BasicConstraintsValid: x509Cert.BasicConstraintsValid, BasicConstraintsValid: x509Cert.BasicConstraintsValid,
IsCA: x509Cert.IsCA, IsCA: x509Cert.IsCA,
MaxPathLen: x509Cert.MaxPathLen, MaxPathLen: x509Cert.MaxPathLen,
MaxPathLenZero: x509Cert.MaxPathLenZero, MaxPathLenZero: x509Cert.MaxPathLenZero,
SubjectKeyId: x509Cert.SubjectKeyId, SubjectKeyId: x509Cert.SubjectKeyId,
AuthorityKeyId: x509Cert.AuthorityKeyId, AuthorityKeyId: x509Cert.AuthorityKeyId,
...@@ -141,9 +141,9 @@ func ParseSm2CertificateToX509(sm2Cert *sm2.Certificate) *x509.Certificate { ...@@ -141,9 +141,9 @@ func ParseSm2CertificateToX509(sm2Cert *sm2.Certificate) *x509.Certificate {
UnknownExtKeyUsage: sm2Cert.UnknownExtKeyUsage, UnknownExtKeyUsage: sm2Cert.UnknownExtKeyUsage,
BasicConstraintsValid: sm2Cert.BasicConstraintsValid, BasicConstraintsValid: sm2Cert.BasicConstraintsValid,
IsCA: sm2Cert.IsCA, IsCA: sm2Cert.IsCA,
MaxPathLen: sm2Cert.MaxPathLen, MaxPathLen: sm2Cert.MaxPathLen,
MaxPathLenZero: sm2Cert.MaxPathLenZero, MaxPathLenZero: sm2Cert.MaxPathLenZero,
SubjectKeyId: sm2Cert.SubjectKeyId, SubjectKeyId: sm2Cert.SubjectKeyId,
AuthorityKeyId: sm2Cert.AuthorityKeyId, AuthorityKeyId: sm2Cert.AuthorityKeyId,
......
package init package init
import ( import (
_ "github.com/33cn/plugin/plugin/store/kvdb" //auto gen _ "github.com/33cn/plugin/plugin/store/kvdb" //auto gen
_ "github.com/33cn/plugin/plugin/store/kvmvcc" //auto gen _ "github.com/33cn/plugin/plugin/store/kvmvcc" //auto gen
_ "github.com/33cn/plugin/plugin/store/mpt" //auto gen
_ "github.com/33cn/plugin/plugin/store/kvmvccMavl" //auto gen _ "github.com/33cn/plugin/plugin/store/kvmvccMavl" //auto gen
_ "github.com/33cn/plugin/plugin/store/mpt" //auto gen
) )
...@@ -2,29 +2,45 @@ ...@@ -2,29 +2,45 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
package kvmvccMavl // Package kvmvccmavl kvmvcc+mavl接口
package kvmvccmavl
import ( import (
"bytes"
"errors"
"fmt"
"sync"
"sync/atomic"
dbm "github.com/33cn/chain33/common/db"
clog "github.com/33cn/chain33/common/log" clog "github.com/33cn/chain33/common/log"
log "github.com/33cn/chain33/common/log/log15" log "github.com/33cn/chain33/common/log/log15"
"github.com/33cn/chain33/queue" "github.com/33cn/chain33/queue"
drivers "github.com/33cn/chain33/system/store" drivers "github.com/33cn/chain33/system/store"
"github.com/33cn/chain33/types" "github.com/33cn/chain33/types"
"github.com/hashicorp/golang-lru" "github.com/hashicorp/golang-lru"
"errors"
) )
var ( var (
kmlog = log.New("module", "kvmvccMavl") kmlog = log.New("module", "kvmvccMavl")
ErrStateHashLost = errors.New("ErrStateHashLost") // ErrStateHashLost ...
kvmvccMavlFork int64 = 200 * 10000 ErrStateHashLost = errors.New("ErrStateHashLost")
kvmvccMavlFork int64 = 200 * 10000
isDelMavlData = false
delMavlDataHeight = kvmvccMavlFork + 10000
delMavlDataState int32
wg sync.WaitGroup
quit bool
) )
const ( const (
canceSize = 2048 //可以缓存2048个roothash, height对 canceSize = 2048 //可以缓存2048个roothash, height对
batchDataSize = 1024 * 1024 * 1
delMavlStateStart = 1
delMavlStateEnd = 0
mvccPrefix = ".-mvcc-." //同common/db中的mvccPrefix一致
) )
// SetLogLevel set log level // SetLogLevel set log level
func SetLogLevel(level string) { func SetLogLevel(level string) {
clog.SetLogLevel(level) clog.SetLogLevel(level)
...@@ -39,13 +55,12 @@ func init() { ...@@ -39,13 +55,12 @@ func init() {
drivers.Reg("kvmvccMavl", New) drivers.Reg("kvmvccMavl", New)
} }
// KVMVCCMavlStore provide kvmvcc and mavl store interface implementation // KVmMavlStore provide kvmvcc and mavl store interface implementation
type KVMVCCMavlStore struct { type KVmMavlStore struct {
*drivers.BaseStore *drivers.BaseStore
*KVMVCCStore *KVMVCCStore
*MavlStore *MavlStore
cance *lru.Cache cance *lru.Cache
} }
type subKVMVCCConfig struct { type subKVMVCCConfig struct {
...@@ -70,7 +85,7 @@ type subConfig struct { ...@@ -70,7 +85,7 @@ type subConfig struct {
// New construct KVMVCCStore module // New construct KVMVCCStore module
func New(cfg *types.Store, sub []byte) queue.Module { func New(cfg *types.Store, sub []byte) queue.Module {
bs := drivers.NewBaseStore(cfg) bs := drivers.NewBaseStore(cfg)
var kvms *KVMVCCMavlStore var kvms *KVmMavlStore
var subcfg subConfig var subcfg subConfig
var subKVMVCCcfg subKVMVCCConfig var subKVMVCCcfg subKVMVCCConfig
var subMavlcfg subMavlConfig var subMavlcfg subMavlConfig
...@@ -78,31 +93,38 @@ func New(cfg *types.Store, sub []byte) queue.Module { ...@@ -78,31 +93,38 @@ func New(cfg *types.Store, sub []byte) queue.Module {
types.MustDecode(sub, &subcfg) types.MustDecode(sub, &subcfg)
subKVMVCCcfg.EnableMVCCIter = subcfg.EnableMVCCIter subKVMVCCcfg.EnableMVCCIter = subcfg.EnableMVCCIter
subMavlcfg.EnableMavlPrefix = subcfg.EnableMavlPrefix subMavlcfg.EnableMavlPrefix = subcfg.EnableMavlPrefix
subMavlcfg.EnableMVCC = subcfg.EnableMVCC subMavlcfg.EnableMVCC = subcfg.EnableMVCC
subMavlcfg.EnableMavlPrune = subcfg.EnableMavlPrune subMavlcfg.EnableMavlPrune = subcfg.EnableMavlPrune
subMavlcfg.PruneHeight = subcfg.PruneHeight subMavlcfg.PruneHeight = subcfg.PruneHeight
} }
cance, err := lru.New(canceSize) cance, err := lru.New(canceSize)
if err != nil { if err != nil {
panic("new KVMVCCMavlStore fail") panic("new KVmMavlStore fail")
} }
kvms = &KVMVCCMavlStore{bs, NewKVMVCC(&subKVMVCCcfg, bs.GetDB()), kvms = &KVmMavlStore{bs, NewKVMVCC(&subKVMVCCcfg, bs.GetDB()),
NewMavl(&subMavlcfg, bs.GetDB()), cance} NewMavl(&subMavlcfg, bs.GetDB()), cance}
// 查询是否已经删除mavl
_, err = bs.GetDB().Get(genDelMavlKey(mvccPrefix))
if err == nil {
isDelMavlData = true
}
bs.SetChild(kvms) bs.SetChild(kvms)
return kvms return kvms
} }
// Close the KVMVCCMavlStore module // Close the KVmMavlStore module
func (kvmMavls *KVMVCCMavlStore) Close() { func (kvmMavls *KVmMavlStore) Close() {
quit = true
wg.Wait()
kvmMavls.BaseStore.Close() kvmMavls.BaseStore.Close()
kvmMavls.KVMVCCStore.Close() kvmMavls.KVMVCCStore.Close()
kvmMavls.MavlStore.Close() kvmMavls.MavlStore.Close()
kmlog.Info("store kvmMavls closed") kmlog.Info("store kvmMavls closed")
} }
// Set kvs with statehash to KVMVCCMavlStore // Set kvs with statehash to KVmMavlStore
func (kvmMavls *KVMVCCMavlStore) Set(datas *types.StoreSet, sync bool) ([]byte, error) { func (kvmMavls *KVmMavlStore) Set(datas *types.StoreSet, sync bool) ([]byte, error) {
// 这里后续需要考虑分叉回退 // 这里后续需要考虑分叉回退
if datas.Height < kvmvccMavlFork { if datas.Height < kvmvccMavlFork {
hash, err := kvmMavls.MavlStore.Set(datas, sync) hash, err := kvmMavls.MavlStore.Set(datas, sync)
...@@ -123,13 +145,18 @@ func (kvmMavls *KVMVCCMavlStore) Set(datas *types.StoreSet, sync bool) ([]byte, ...@@ -123,13 +145,18 @@ func (kvmMavls *KVMVCCMavlStore) Set(datas *types.StoreSet, sync bool) ([]byte,
if err == nil { if err == nil {
kvmMavls.cance.Add(string(hash), datas.Height) kvmMavls.cance.Add(string(hash), datas.Height)
} }
// 删除Mavl数据
if datas.Height > delMavlDataHeight && !isDelMavlData && !isDelMavling() {
wg.Add(1)
go DelMavl(kvmMavls.GetDB())
}
return hash, err return hash, err
} }
// Get kvs with statehash from KVMVCCMavlStore // Get kvs with statehash from KVmMavlStore
func (kvmMavls *KVMVCCMavlStore) Get(datas *types.StoreGet) [][]byte { func (kvmMavls *KVmMavlStore) Get(datas *types.StoreGet) [][]byte {
if value, ok := kvmMavls.cance.Get(string(datas.StateHash)); ok { if value, ok := kvmMavls.cance.Get(string(datas.StateHash)); ok {
if value.(int64) < kvmvccMavlFork { if value.(int64) < kvmvccMavlFork {
return kvmMavls.MavlStore.Get(datas) return kvmMavls.MavlStore.Get(datas)
} }
return kvmMavls.KVMVCCStore.Get(datas) return kvmMavls.KVMVCCStore.Get(datas)
...@@ -137,8 +164,8 @@ func (kvmMavls *KVMVCCMavlStore) Get(datas *types.StoreGet) [][]byte { ...@@ -137,8 +164,8 @@ func (kvmMavls *KVMVCCMavlStore) Get(datas *types.StoreGet) [][]byte {
return kvmMavls.KVMVCCStore.Get(datas) return kvmMavls.KVMVCCStore.Get(datas)
} }
// MemSet set kvs to the mem of KVMVCCMavlStore module and return the StateHash // MemSet set kvs to the mem of KVmMavlStore module and return the StateHash
func (kvmMavls *KVMVCCMavlStore) MemSet(datas *types.StoreSet, sync bool) ([]byte, error) { func (kvmMavls *KVmMavlStore) MemSet(datas *types.StoreSet, sync bool) ([]byte, error) {
// 这里后续需要考虑分叉回退 // 这里后续需要考虑分叉回退
if datas.Height < kvmvccMavlFork { if datas.Height < kvmvccMavlFork {
hash, err := kvmMavls.MavlStore.MemSet(datas, sync) hash, err := kvmMavls.MavlStore.MemSet(datas, sync)
...@@ -159,21 +186,23 @@ func (kvmMavls *KVMVCCMavlStore) MemSet(datas *types.StoreSet, sync bool) ([]byt ...@@ -159,21 +186,23 @@ func (kvmMavls *KVMVCCMavlStore) MemSet(datas *types.StoreSet, sync bool) ([]byt
if err == nil { if err == nil {
kvmMavls.cance.Add(string(hash), datas.Height) kvmMavls.cance.Add(string(hash), datas.Height)
} }
// 删除Mavl数据
if datas.Height > delMavlDataHeight && !isDelMavlData && !isDelMavling() {
wg.Add(1)
go DelMavl(kvmMavls.GetDB())
}
return hash, err return hash, err
} }
// Commit kvs in the mem of KVMVCCMavlStore module to state db and return the StateHash // Commit kvs in the mem of KVmMavlStore module to state db and return the StateHash
func (kvmMavls *KVMVCCMavlStore) Commit(req *types.ReqHash) ([]byte, error) { func (kvmMavls *KVmMavlStore) Commit(req *types.ReqHash) ([]byte, error) {
if value, ok := kvmMavls.cance.Get(string(req.Hash)); ok { if value, ok := kvmMavls.cance.Get(string(req.Hash)); ok {
if value.(int64) < kvmvccMavlFork { if value.(int64) < kvmvccMavlFork {
hash, err := kvmMavls.MavlStore.Commit(req) hash, err := kvmMavls.MavlStore.Commit(req)
if err != nil { if err != nil {
return hash, err return hash, err
} }
_, err = kvmMavls.KVMVCCStore.Commit(req) _, err = kvmMavls.KVMVCCStore.Commit(req)
if err != nil {
return hash, err
}
return hash, err return hash, err
} }
return kvmMavls.KVMVCCStore.Commit(req) return kvmMavls.KVMVCCStore.Commit(req)
...@@ -181,18 +210,15 @@ func (kvmMavls *KVMVCCMavlStore) Commit(req *types.ReqHash) ([]byte, error) { ...@@ -181,18 +210,15 @@ func (kvmMavls *KVMVCCMavlStore) Commit(req *types.ReqHash) ([]byte, error) {
return kvmMavls.KVMVCCStore.Commit(req) return kvmMavls.KVMVCCStore.Commit(req)
} }
// Rollback kvs in the mem of KVMVCCMavlStore module and return the StateHash // Rollback kvs in the mem of KVmMavlStore module and return the StateHash
func (kvmMavls *KVMVCCMavlStore) Rollback(req *types.ReqHash) ([]byte, error) { func (kvmMavls *KVmMavlStore) Rollback(req *types.ReqHash) ([]byte, error) {
if value, ok := kvmMavls.cance.Get(string(req.Hash)); ok { if value, ok := kvmMavls.cance.Get(string(req.Hash)); ok {
if value.(int64) < kvmvccMavlFork { if value.(int64) < kvmvccMavlFork {
hash, err := kvmMavls.MavlStore.Rollback(req) hash, err := kvmMavls.MavlStore.Rollback(req)
if err != nil { if err != nil {
return hash, err return hash, err
} }
_, err = kvmMavls.KVMVCCStore.Rollback(req) _, err = kvmMavls.KVMVCCStore.Rollback(req)
if err != nil {
return hash, err
}
return hash, err return hash, err
} }
return kvmMavls.KVMVCCStore.Rollback(req) return kvmMavls.KVMVCCStore.Rollback(req)
...@@ -201,9 +227,9 @@ func (kvmMavls *KVMVCCMavlStore) Rollback(req *types.ReqHash) ([]byte, error) { ...@@ -201,9 +227,9 @@ func (kvmMavls *KVMVCCMavlStore) Rollback(req *types.ReqHash) ([]byte, error) {
} }
// IterateRangeByStateHash travel with Prefix by StateHash to get the latest version kvs. // IterateRangeByStateHash travel with Prefix by StateHash to get the latest version kvs.
func (kvmMavls *KVMVCCMavlStore) IterateRangeByStateHash(statehash []byte, start []byte, end []byte, ascending bool, fn func(key, value []byte) bool) { func (kvmMavls *KVmMavlStore) IterateRangeByStateHash(statehash []byte, start []byte, end []byte, ascending bool, fn func(key, value []byte) bool) {
if value, ok := kvmMavls.cance.Get(string(statehash)); ok { if value, ok := kvmMavls.cance.Get(string(statehash)); ok {
if value.(int64) < kvmvccMavlFork { if value.(int64) < kvmvccMavlFork {
kvmMavls.MavlStore.IterateRangeByStateHash(statehash, start, end, ascending, fn) kvmMavls.MavlStore.IterateRangeByStateHash(statehash, start, end, ascending, fn)
return return
} }
...@@ -211,16 +237,15 @@ func (kvmMavls *KVMVCCMavlStore) IterateRangeByStateHash(statehash []byte, start ...@@ -211,16 +237,15 @@ func (kvmMavls *KVMVCCMavlStore) IterateRangeByStateHash(statehash []byte, start
return return
} }
kvmMavls.KVMVCCStore.IterateRangeByStateHash(statehash, start, end, ascending, fn) kvmMavls.KVMVCCStore.IterateRangeByStateHash(statehash, start, end, ascending, fn)
return
} }
// ProcEvent handles supported events // ProcEvent handles supported events
func (kvmMavls *KVMVCCMavlStore) ProcEvent(msg queue.Message) { func (kvmMavls *KVmMavlStore) ProcEvent(msg queue.Message) {
msg.ReplyErr("KVMVCCMavlStore", types.ErrActionNotSupport) msg.ReplyErr("KVmMavlStore", types.ErrActionNotSupport)
} }
// Del set kvs to nil with StateHash // Del set kvs to nil with StateHash
func (kvmMavls *KVMVCCMavlStore) Del(req *types.StoreDel) ([]byte, error) { func (kvmMavls *KVmMavlStore) Del(req *types.StoreDel) ([]byte, error) {
// 这里后续需要考虑分叉回退 // 这里后续需要考虑分叉回退
if req.Height < kvmvccMavlFork { if req.Height < kvmvccMavlFork {
hash, err := kvmMavls.MavlStore.Del(req) hash, err := kvmMavls.MavlStore.Del(req)
...@@ -244,6 +269,48 @@ func (kvmMavls *KVMVCCMavlStore) Del(req *types.StoreDel) ([]byte, error) { ...@@ -244,6 +269,48 @@ func (kvmMavls *KVMVCCMavlStore) Del(req *types.StoreDel) ([]byte, error) {
return hash, err return hash, err
} }
// TODO 数据库中mavl的清除 // DelMavl 数据库中mavl的清除
// 达到kvmvccMavlFork + 100000 后触发清除 // 达到kvmvccMavlFork + 100000 后触发清除
// it := db.Iterator(nil, mvccPrefix, true) func DelMavl(db dbm.DB) {
\ No newline at end of file defer wg.Done()
setDelMavl(delMavlStateStart)
defer setDelMavl(delMavlStateEnd)
isDel := delMavlData(db)
if isDel {
isDelMavlData = true
kmlog.Info("DelMavl success")
}
}
func delMavlData(db dbm.DB) bool {
it := db.Iterator(nil, nil, true)
batch := db.NewBatch(true)
for it.Rewind(); it.Valid(); it.Next() {
if quit {
return false
}
if !bytes.HasPrefix(it.Key(), []byte(mvccPrefix)) { // 将非mvcc的mavl数据全部删除
batch.Delete(it.Key())
if batch.ValueSize() > batchDataSize {
batch.Write()
batch.Reset()
}
}
}
batch.Set(genDelMavlKey(mvccPrefix), []byte(""))
batch.Write()
return true
}
func genDelMavlKey(prefix string) []byte {
delMavl := "--delMavlData--"
return []byte(fmt.Sprintf("%s%s", prefix, delMavl))
}
func isDelMavling() bool {
return atomic.LoadInt32(&delMavlDataState) == 1
}
func setDelMavl(state int32) {
atomic.StoreInt32(&delMavlDataState, state)
}
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
package kvmvccMavl package kvmvccmavl
import ( import (
"encoding/json" "encoding/json"
...@@ -37,7 +37,7 @@ func TestKvmvccMavlNewClose(t *testing.T) { ...@@ -37,7 +37,7 @@ func TestKvmvccMavlNewClose(t *testing.T) {
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
var storeCfg = newStoreCfg(dir) var storeCfg = newStoreCfg(dir)
store := New(storeCfg, nil).(*KVMVCCMavlStore) store := New(storeCfg, nil).(*KVmMavlStore)
assert.NotNil(t, store) assert.NotNil(t, store)
store.Close() store.Close()
...@@ -49,7 +49,7 @@ func TestKvmvccMavlSetGet(t *testing.T) { ...@@ -49,7 +49,7 @@ func TestKvmvccMavlSetGet(t *testing.T) {
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
var storeCfg = newStoreCfg(dir) var storeCfg = newStoreCfg(dir)
store := New(storeCfg, nil).(*KVMVCCMavlStore) store := New(storeCfg, nil).(*KVmMavlStore)
assert.NotNil(t, store) assert.NotNil(t, store)
kvmvccMavlFork = 50 kvmvccMavlFork = 50
...@@ -82,7 +82,7 @@ func TestKvmvccMavlMemSet(t *testing.T) { ...@@ -82,7 +82,7 @@ func TestKvmvccMavlMemSet(t *testing.T) {
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
var storeCfg = newStoreCfg(dir) var storeCfg = newStoreCfg(dir)
store := New(storeCfg, nil).(*KVMVCCMavlStore) store := New(storeCfg, nil).(*KVmMavlStore)
assert.NotNil(t, store) assert.NotNil(t, store)
kvmvccMavlFork = 50 kvmvccMavlFork = 50
...@@ -120,7 +120,7 @@ func TestKvmvccMavlCommit(t *testing.T) { ...@@ -120,7 +120,7 @@ func TestKvmvccMavlCommit(t *testing.T) {
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
var storeCfg = newStoreCfg(dir) var storeCfg = newStoreCfg(dir)
store := New(storeCfg, nil).(*KVMVCCMavlStore) store := New(storeCfg, nil).(*KVmMavlStore)
assert.NotNil(t, store) assert.NotNil(t, store)
var kv []*types.KeyValue var kv []*types.KeyValue
...@@ -166,7 +166,7 @@ func TestKvmvccMavlCommit(t *testing.T) { ...@@ -166,7 +166,7 @@ func TestKvmvccMavlCommit(t *testing.T) {
get := &types.StoreGet{StateHash: frontHash, Keys: keys} get := &types.StoreGet{StateHash: frontHash, Keys: keys}
values := store.Get(get) values := store.Get(get)
require.Equal(t, len(values), len(keys)) require.Equal(t, len(values), len(keys))
for i, _ := range keys { for i := range keys {
require.Equal(t, kv[i].Value, values[i]) require.Equal(t, kv[i].Value, values[i])
} }
} }
...@@ -175,7 +175,7 @@ func TestKvmvccMavlCommit(t *testing.T) { ...@@ -175,7 +175,7 @@ func TestKvmvccMavlCommit(t *testing.T) {
get := &types.StoreGet{StateHash: hash, Keys: keys} get := &types.StoreGet{StateHash: hash, Keys: keys}
values := store.Get(get) values := store.Get(get)
require.Equal(t, len(values), len(keys)) require.Equal(t, len(values), len(keys))
for i, _ := range keys { for i := range keys {
require.Equal(t, kv[i].Value, values[i]) require.Equal(t, kv[i].Value, values[i])
} }
} }
...@@ -187,7 +187,7 @@ func TestKvmvccMavlRollback(t *testing.T) { ...@@ -187,7 +187,7 @@ func TestKvmvccMavlRollback(t *testing.T) {
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
var storeCfg = newStoreCfg(dir) var storeCfg = newStoreCfg(dir)
store := New(storeCfg, nil).(*KVMVCCMavlStore) store := New(storeCfg, nil).(*KVmMavlStore)
assert.NotNil(t, store) assert.NotNil(t, store)
var kv []*types.KeyValue var kv []*types.KeyValue
...@@ -250,7 +250,7 @@ func TestKvmvccdbRollbackBatch(t *testing.T) { ...@@ -250,7 +250,7 @@ func TestKvmvccdbRollbackBatch(t *testing.T) {
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
var storeCfg = newStoreCfg(dir) var storeCfg = newStoreCfg(dir)
store := New(storeCfg, nil).(*KVMVCCMavlStore) store := New(storeCfg, nil).(*KVmMavlStore)
assert.NotNil(t, store) assert.NotNil(t, store)
var kv []*types.KeyValue var kv []*types.KeyValue
...@@ -351,7 +351,7 @@ func TestIterateRangeByStateHash(t *testing.T) { ...@@ -351,7 +351,7 @@ func TestIterateRangeByStateHash(t *testing.T) {
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
storeCfg, sub := newStoreCfgIter(dir) storeCfg, sub := newStoreCfgIter(dir)
store := New(storeCfg, sub).(*KVMVCCMavlStore) store := New(storeCfg, sub).(*KVmMavlStore)
assert.NotNil(t, store) assert.NotNil(t, store)
execaddr := "0111vcBNSEA7fZhAdLJphDwQRQJa111" execaddr := "0111vcBNSEA7fZhAdLJphDwQRQJa111"
...@@ -499,6 +499,45 @@ func GetRandomString(length int) string { ...@@ -499,6 +499,45 @@ func GetRandomString(length int) string {
return common.GetRandPrintString(20, length) return common.GetRandPrintString(20, length)
} }
func TestDelMavlData(t *testing.T) {
dir, err := ioutil.TempDir("", "example")
assert.Nil(t, err)
defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录
storeCfg, sub := newStoreCfgIter(dir)
store := New(storeCfg, sub).(*KVmMavlStore)
assert.NotNil(t, store)
db := store.GetDB()
db.Set([]byte(mvccPrefix), []byte("value1"))
db.Set([]byte(fmt.Sprintf("%s123", mvccPrefix)), []byte("value2"))
db.Set([]byte(fmt.Sprintf("%s546", mvccPrefix)), []byte("value3"))
db.Set([]byte(fmt.Sprintf("123%s", mvccPrefix)), []byte("value4"))
db.Set([]byte("key11"), []byte("value11"))
db.Set([]byte("key22"), []byte("value22"))
delMavlData(db)
v, err := db.Get([]byte(mvccPrefix))
require.NoError(t, err)
require.Equal(t, []byte("value1"), v)
v, err = db.Get([]byte(fmt.Sprintf("%s123", mvccPrefix)))
require.NoError(t, err)
require.Equal(t, []byte("value2"), v)
v, err = db.Get([]byte(fmt.Sprintf("%s546", mvccPrefix)))
require.NoError(t, err)
require.Equal(t, []byte("value3"), v)
_, err = db.Get([]byte(fmt.Sprintf("123%s", mvccPrefix)))
require.Error(t, err)
_, err = db.Get([]byte("key11"))
require.Error(t, err)
_, err = db.Get([]byte("key22"))
require.Error(t, err)
_, err = db.Get(genDelMavlKey(mvccPrefix))
require.NoError(t, err)
}
func BenchmarkGetkmvccMavl(b *testing.B) { benchmarkGet(b, false) } func BenchmarkGetkmvccMavl(b *testing.B) { benchmarkGet(b, false) }
func BenchmarkGetkmvcc(b *testing.B) { benchmarkGet(b, true) } func BenchmarkGetkmvcc(b *testing.B) { benchmarkGet(b, true) }
...@@ -509,7 +548,7 @@ func benchmarkGet(b *testing.B, isResetForkHeight bool) { ...@@ -509,7 +548,7 @@ func benchmarkGet(b *testing.B, isResetForkHeight bool) {
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
var storeCfg = newStoreCfg(dir) var storeCfg = newStoreCfg(dir)
store := New(storeCfg, nil).(*KVMVCCMavlStore) store := New(storeCfg, nil).(*KVmMavlStore)
assert.NotNil(b, store) assert.NotNil(b, store)
if isResetForkHeight { if isResetForkHeight {
...@@ -570,7 +609,7 @@ func benchmarkStoreGetKvs4N(b *testing.B, isResetForkHeight bool) { ...@@ -570,7 +609,7 @@ func benchmarkStoreGetKvs4N(b *testing.B, isResetForkHeight bool) {
} }
var storeCfg = newStoreCfg(dir) var storeCfg = newStoreCfg(dir)
store := New(storeCfg, nil).(*KVMVCCMavlStore) store := New(storeCfg, nil).(*KVmMavlStore)
assert.NotNil(b, store) assert.NotNil(b, store)
var kv []*types.KeyValue var kv []*types.KeyValue
...@@ -618,7 +657,7 @@ func benchmarkStoreGetKvsForNN(b *testing.B, isResetForkHeight bool) { ...@@ -618,7 +657,7 @@ func benchmarkStoreGetKvsForNN(b *testing.B, isResetForkHeight bool) {
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
var storeCfg = newStoreCfg(dir) var storeCfg = newStoreCfg(dir)
store := New(storeCfg, nil).(*KVMVCCMavlStore) store := New(storeCfg, nil).(*KVmMavlStore)
assert.NotNil(b, store) assert.NotNil(b, store)
if isResetForkHeight { if isResetForkHeight {
...@@ -688,7 +727,7 @@ func benchmarkStoreGetKvsFor10000(b *testing.B, isResetForkHeight bool) { ...@@ -688,7 +727,7 @@ func benchmarkStoreGetKvsFor10000(b *testing.B, isResetForkHeight bool) {
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
var storeCfg = newStoreCfg(dir) var storeCfg = newStoreCfg(dir)
store := New(storeCfg, nil).(*KVMVCCMavlStore) store := New(storeCfg, nil).(*KVmMavlStore)
assert.NotNil(b, store) assert.NotNil(b, store)
if isResetForkHeight { if isResetForkHeight {
...@@ -763,7 +802,7 @@ func benchmarkGetIter(b *testing.B, isResetForkHeight bool) { ...@@ -763,7 +802,7 @@ func benchmarkGetIter(b *testing.B, isResetForkHeight bool) {
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
storeCfg, sub := newStoreCfgIter(dir) storeCfg, sub := newStoreCfgIter(dir)
store := New(storeCfg, sub).(*KVMVCCMavlStore) store := New(storeCfg, sub).(*KVmMavlStore)
assert.NotNil(b, store) assert.NotNil(b, store)
if isResetForkHeight { if isResetForkHeight {
...@@ -816,7 +855,7 @@ func benchmarkSet(b *testing.B, isResetForkHeight bool) { ...@@ -816,7 +855,7 @@ func benchmarkSet(b *testing.B, isResetForkHeight bool) {
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
var storeCfg = newStoreCfg(dir) var storeCfg = newStoreCfg(dir)
store := New(storeCfg, nil).(*KVMVCCMavlStore) store := New(storeCfg, nil).(*KVmMavlStore)
assert.NotNil(b, store) assert.NotNil(b, store)
b.Log(dir) b.Log(dir)
...@@ -863,7 +902,7 @@ func benchmarkStoreSet(b *testing.B, isResetForkHeight bool) { ...@@ -863,7 +902,7 @@ func benchmarkStoreSet(b *testing.B, isResetForkHeight bool) {
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
var storeCfg = newStoreCfg(dir) var storeCfg = newStoreCfg(dir)
store := New(storeCfg, nil).(*KVMVCCMavlStore) store := New(storeCfg, nil).(*KVmMavlStore)
assert.NotNil(b, store) assert.NotNil(b, store)
if isResetForkHeight { if isResetForkHeight {
...@@ -908,7 +947,7 @@ func benchmarkSetIter(b *testing.B, isResetForkHeight bool) { ...@@ -908,7 +947,7 @@ func benchmarkSetIter(b *testing.B, isResetForkHeight bool) {
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
storeCfg, sub := newStoreCfgIter(dir) storeCfg, sub := newStoreCfgIter(dir)
store := New(storeCfg, sub).(*KVMVCCMavlStore) store := New(storeCfg, sub).(*KVmMavlStore)
assert.NotNil(b, store) assert.NotNil(b, store)
b.Log(dir) b.Log(dir)
...@@ -955,7 +994,7 @@ func benchmarkMemSet(b *testing.B, isResetForkHeight bool) { ...@@ -955,7 +994,7 @@ func benchmarkMemSet(b *testing.B, isResetForkHeight bool) {
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
var storeCfg = newStoreCfg(dir) var storeCfg = newStoreCfg(dir)
store := New(storeCfg, nil).(*KVMVCCMavlStore) store := New(storeCfg, nil).(*KVmMavlStore)
assert.NotNil(b, store) assert.NotNil(b, store)
if isResetForkHeight { if isResetForkHeight {
...@@ -999,7 +1038,7 @@ func benchmarkStoreMemSet(b *testing.B, isResetForkHeight bool) { ...@@ -999,7 +1038,7 @@ func benchmarkStoreMemSet(b *testing.B, isResetForkHeight bool) {
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
var storeCfg = newStoreCfg(dir) var storeCfg = newStoreCfg(dir)
store := New(storeCfg, nil).(*KVMVCCMavlStore) store := New(storeCfg, nil).(*KVmMavlStore)
assert.NotNil(b, store) assert.NotNil(b, store)
if isResetForkHeight { if isResetForkHeight {
...@@ -1047,7 +1086,7 @@ func benchmarkCommit(b *testing.B, isResetForkHeight bool) { ...@@ -1047,7 +1086,7 @@ func benchmarkCommit(b *testing.B, isResetForkHeight bool) {
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
var storeCfg = newStoreCfg(dir) var storeCfg = newStoreCfg(dir)
store := New(storeCfg, nil).(*KVMVCCMavlStore) store := New(storeCfg, nil).(*KVmMavlStore)
assert.NotNil(b, store) assert.NotNil(b, store)
if isResetForkHeight { if isResetForkHeight {
...@@ -1097,7 +1136,7 @@ func benchmarkStoreCommit(b *testing.B, isResetForkHeight bool) { ...@@ -1097,7 +1136,7 @@ func benchmarkStoreCommit(b *testing.B, isResetForkHeight bool) {
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
var storeCfg = newStoreCfg(dir) var storeCfg = newStoreCfg(dir)
store := New(storeCfg, nil).(*KVMVCCMavlStore) store := New(storeCfg, nil).(*KVmMavlStore)
assert.NotNil(b, store) assert.NotNil(b, store)
if isResetForkHeight { if isResetForkHeight {
...@@ -1151,7 +1190,7 @@ func benchmarkIterMemSet(b *testing.B, isResetForkHeight bool) { ...@@ -1151,7 +1190,7 @@ func benchmarkIterMemSet(b *testing.B, isResetForkHeight bool) {
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
storeCfg, sub := newStoreCfgIter(dir) storeCfg, sub := newStoreCfgIter(dir)
store := New(storeCfg, sub).(*KVMVCCMavlStore) store := New(storeCfg, sub).(*KVmMavlStore)
assert.NotNil(b, store) assert.NotNil(b, store)
if isResetForkHeight { if isResetForkHeight {
...@@ -1194,7 +1233,7 @@ func benchmarkIterCommit(b *testing.B, isResetForkHeight bool) { ...@@ -1194,7 +1233,7 @@ func benchmarkIterCommit(b *testing.B, isResetForkHeight bool) {
defer os.RemoveAll(dir) // clean up defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录 os.RemoveAll(dir) //删除已存在目录
storeCfg, sub := newStoreCfgIter(dir) storeCfg, sub := newStoreCfgIter(dir)
store := New(storeCfg, sub).(*KVMVCCMavlStore) store := New(storeCfg, sub).(*KVmMavlStore)
assert.NotNil(b, store) assert.NotNil(b, store)
if isResetForkHeight { if isResetForkHeight {
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
package kvmvccMavl package kvmvccmavl
import ( import (
"github.com/33cn/chain33/common" "github.com/33cn/chain33/common"
...@@ -12,10 +12,8 @@ import ( ...@@ -12,10 +12,8 @@ import (
"github.com/golang/protobuf/proto" "github.com/golang/protobuf/proto"
) )
var maxRollbackNum = 200 var maxRollbackNum = 200
// KVMVCCStore provide kvmvcc store interface implementation // KVMVCCStore provide kvmvcc store interface implementation
type KVMVCCStore struct { type KVMVCCStore struct {
db dbm.DB db dbm.DB
...@@ -24,7 +22,6 @@ type KVMVCCStore struct { ...@@ -24,7 +22,6 @@ type KVMVCCStore struct {
enableMVCCIter bool enableMVCCIter bool
} }
// NewKVMVCC construct KVMVCCStore module // NewKVMVCC construct KVMVCCStore module
func NewKVMVCC(sub *subKVMVCCConfig, db dbm.DB) *KVMVCCStore { func NewKVMVCC(sub *subKVMVCCConfig, db dbm.DB) *KVMVCCStore {
var kvs *KVMVCCStore var kvs *KVMVCCStore
......
...@@ -2,20 +2,19 @@ ...@@ -2,20 +2,19 @@
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file. // license that can be found in the LICENSE file.
// Package mavl 默克尔平衡树接口 package kvmvccmavl
package kvmvccMavl
import ( import (
"sync" "sync"
"github.com/33cn/chain33/common" "github.com/33cn/chain33/common"
dbm "github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/queue" "github.com/33cn/chain33/queue"
"github.com/33cn/chain33/system/store/mavl/db" "github.com/33cn/chain33/system/store/mavl/db"
"github.com/33cn/chain33/types" "github.com/33cn/chain33/types"
dbm "github.com/33cn/chain33/common/db"
) )
// Store mavl store struct // MavlStore mavl store struct
type MavlStore struct { type MavlStore struct {
db dbm.DB db dbm.DB
trees *sync.Map trees *sync.Map
...@@ -30,9 +29,9 @@ func NewMavl(sub *subMavlConfig, db dbm.DB) *MavlStore { ...@@ -30,9 +29,9 @@ func NewMavl(sub *subMavlConfig, db dbm.DB) *MavlStore {
var subcfg subMavlConfig var subcfg subMavlConfig
if sub != nil { if sub != nil {
subcfg.EnableMavlPrefix = sub.EnableMavlPrefix subcfg.EnableMavlPrefix = sub.EnableMavlPrefix
subcfg.EnableMVCC = sub.EnableMVCC subcfg.EnableMVCC = sub.EnableMVCC
subcfg.EnableMavlPrune = sub.EnableMavlPrune subcfg.EnableMavlPrune = sub.EnableMavlPrune
subcfg.PruneHeight = sub.PruneHeight subcfg.PruneHeight = sub.PruneHeight
} }
mavls := &MavlStore{db, &sync.Map{}, subcfg.EnableMavlPrefix, subcfg.EnableMVCC, subcfg.EnableMavlPrune, subcfg.PruneHeight} mavls := &MavlStore{db, &sync.Map{}, subcfg.EnableMavlPrefix, subcfg.EnableMVCC, subcfg.EnableMavlPrune, subcfg.PruneHeight}
mavl.EnableMavlPrefix(subcfg.EnableMavlPrefix) mavl.EnableMavlPrefix(subcfg.EnableMavlPrefix)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment