Commit c2a382d9 authored by liuyuhang's avatar liuyuhang

add kvmvccMavl

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