Commit 51335caa authored by liuyuhang's avatar liuyuhang Committed by vipwzw

add check the mavl data is have prune

parent faed2bcc
...@@ -19,21 +19,22 @@ import ( ...@@ -19,21 +19,22 @@ import (
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/system/store/mavl/db"
"github.com/33cn/chain33/types" "github.com/33cn/chain33/types"
"github.com/hashicorp/golang-lru" "github.com/hashicorp/golang-lru"
"github.com/33cn/chain33/system/store/mavl/db"
) )
var ( var (
kmlog = log.New("module", "kvmvccMavl") kmlog = log.New("module", "kvmvccMavl")
// ErrStateHashLost ... // ErrStateHashLost ...
ErrStateHashLost = errors.New("ErrStateHashLost") ErrStateHashLost = errors.New("ErrStateHashLost")
kvmvccMavlFork int64 = 200 * 10000 kvmvccMavlFork int64 = 200 * 10000
isDelMavlData = false isDelMavlData = false
delMavlDataHeight = kvmvccMavlFork + 10000 delMavlDataHeight = kvmvccMavlFork + 10000
delMavlDataState int32 delMavlDataState int32
wg sync.WaitGroup wg sync.WaitGroup
quit bool quit bool
isUpgradeCommitMavl bool
) )
const ( const (
...@@ -127,6 +128,9 @@ func New(cfg *types.Store, sub []byte) queue.Module { ...@@ -127,6 +128,9 @@ func New(cfg *types.Store, sub []byte) queue.Module {
if err == nil { if err == nil {
isDelMavlData = true isDelMavlData = true
} }
// 查询是Upgrade是否需保存mavl
isUpgradeCommitMavl = isCommitMavl(bs.GetDB())
bs.SetChild(kvms) bs.SetChild(kvms)
return kvms return kvms
} }
...@@ -262,9 +266,19 @@ func (kvmMavls *KVmMavlStore) ProcEvent(msg *queue.Message) { ...@@ -262,9 +266,19 @@ func (kvmMavls *KVmMavlStore) ProcEvent(msg *queue.Message) {
// MemSetUpgrade set kvs to the mem of KVmMavlStore module not cache the tree and return the StateHash // MemSetUpgrade set kvs to the mem of KVmMavlStore module not cache the tree and return the StateHash
func (kvmMavls *KVmMavlStore) MemSetUpgrade(datas *types.StoreSet, sync bool) ([]byte, error) { func (kvmMavls *KVmMavlStore) MemSetUpgrade(datas *types.StoreSet, sync bool) ([]byte, error) {
if datas.Height < kvmvccMavlFork { if datas.Height < kvmvccMavlFork {
hash, err := kvmMavls.MavlStore.MemSetUpgrade(datas, sync) var hash []byte
if err != nil { var err error
return hash, err
if isUpgradeCommitMavl {
hash, err := kvmMavls.MavlStore.MemSet(datas, sync)
if err != nil {
return hash, err
}
} else {
hash, err = kvmMavls.MavlStore.MemSetUpgrade(datas, sync)
if err != nil {
return hash, err
}
} }
_, err = kvmMavls.KVMVCCStore.MemSet(datas, hash, sync) _, err = kvmMavls.KVMVCCStore.MemSet(datas, hash, sync)
if err != nil { if err != nil {
...@@ -285,7 +299,14 @@ func (kvmMavls *KVmMavlStore) MemSetUpgrade(datas *types.StoreSet, sync bool) ([ ...@@ -285,7 +299,14 @@ func (kvmMavls *KVmMavlStore) MemSetUpgrade(datas *types.StoreSet, sync bool) ([
// CommitUpgrade kvs in the mem of KVmMavlStore module to state db and return the StateHash // CommitUpgrade kvs in the mem of KVmMavlStore module to state db and return the StateHash
func (kvmMavls *KVmMavlStore) CommitUpgrade(req *types.ReqHash) ([]byte, error) { func (kvmMavls *KVmMavlStore) CommitUpgrade(req *types.ReqHash) ([]byte, error) {
return kvmMavls.KVMVCCStore.CommitUpgrade(req) var hash []byte
var err error
if isUpgradeCommitMavl {
hash, err = kvmMavls.Commit(req)
} else {
hash, err = kvmMavls.KVMVCCStore.CommitUpgrade(req)
}
return hash, err
} }
// Del set kvs to nil with StateHash // Del set kvs to nil with StateHash
...@@ -359,3 +380,16 @@ func isDelMavling() bool { ...@@ -359,3 +380,16 @@ func isDelMavling() bool {
func setDelMavl(state int32) { func setDelMavl(state int32) {
atomic.StoreInt32(&delMavlDataState, state) atomic.StoreInt32(&delMavlDataState, state)
} }
func isCommitMavl(db dbm.DB) bool {
prefix := []byte(leafNodePrefix)
it := db.Iterator(prefix, nil, true)
defer it.Close()
var isCommit bool
for it.Rewind(); it.Valid(); it.Next() {
isCommit = true
kmlog.Info("need commit mval")
break
}
return isCommit
}
...@@ -711,6 +711,24 @@ func TestGetKeyVersion(t *testing.T) { ...@@ -711,6 +711,24 @@ func TestGetKeyVersion(t *testing.T) {
} }
} }
func TestIsCommitMavl(t *testing.T) {
dir, err := ioutil.TempDir("", "example")
assert.Nil(t, err)
defer os.RemoveAll(dir) // clean up
os.RemoveAll(dir) //删除已存在目录
storeCfg := newStoreCfg(dir)
store := New(storeCfg, nil).(*KVmMavlStore)
assert.NotNil(t, store)
isComm := isCommitMavl(store.GetDB())
require.Equal(t, false, isComm)
store.GetDB().Set([]byte(fmt.Sprintln(leafNodePrefix, "123")), []byte("v1"))
store.GetDB().Set([]byte(fmt.Sprintln(leafNodePrefix, "456")), []byte("v2"))
isComm = isCommitMavl(store.GetDB())
require.Equal(t, true, isComm)
}
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) }
......
...@@ -14,6 +14,11 @@ import ( ...@@ -14,6 +14,11 @@ import (
"github.com/33cn/chain33/types" "github.com/33cn/chain33/types"
) )
const (
// 同store/mavl中定义保持一致,即裁剪的加前缀
leafNodePrefix = "_mb_"
)
// MavlStore mavl store struct // MavlStore mavl store struct
type MavlStore struct { type MavlStore struct {
db dbm.DB db dbm.DB
......
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