Commit faed2bcc authored by liuyuhang's avatar liuyuhang Committed by vipwzw

add resease global memTree when reach a height

parent 4bbd8262
......@@ -21,6 +21,7 @@ import (
drivers "github.com/33cn/chain33/system/store"
"github.com/33cn/chain33/types"
"github.com/hashicorp/golang-lru"
"github.com/33cn/chain33/system/store/mavl/db"
)
var (
......@@ -197,6 +198,8 @@ func (kvmMavls *KVmMavlStore) MemSet(datas *types.StoreSet, sync bool) ([]byte,
}
// 删除Mavl数据
if datas.Height > delMavlDataHeight && !isDelMavlData && !isDelMavling() {
// 达到该高度时候,将全局的memTree以及tkCloseCache释放掉
mavl.ReleaseGlobalMem()
wg.Add(1)
go DelMavl(kvmMavls.GetDB())
}
......
......@@ -66,6 +66,15 @@ func EnableMemVal(enable bool) {
enableMemVal = enable
}
func ReleaseGlobalMem() {
if memTree != nil {
memTree = nil
}
if tkCloseCache != nil {
tkCloseCache = nil
}
}
type memNode struct {
data [][]byte //顺序为lefthash, righthash, key, value
Height int32
......@@ -542,43 +551,45 @@ func (ndb *nodeDB) SaveNode(t *Tree, node *Node) {
}
func getNodeMemTree(hash []byte) (*Node, error) {
if memTree == nil && tkCloseCache == nil{
return nil, ErrNodeNotExist
if memTree != nil {
elem, ok := memTree.Get(uintkey(farm.Hash64(hash)))
if ok {
sn := elem.(*memNode)
node := &Node{
height: sn.Height,
size: sn.Size,
hash: hash,
persisted: true,
}
node.leftHash = sn.data[0]
node.rightHash = sn.data[1]
node.key = sn.data[2]
if len(sn.data) == 4 {
node.value = sn.data[3]
}
return node, nil
}
}
elem, ok := memTree.Get(uintkey(farm.Hash64(hash)))
if ok {
sn := elem.(*memNode)
node := &Node{
height: sn.Height,
size: sn.Size,
hash: hash,
persisted: true,
}
node.leftHash = sn.data[0]
node.rightHash = sn.data[1]
node.key = sn.data[2]
if len(sn.data) == 4 {
node.value = sn.data[3]
}
return node, nil
}
// 从tkCloseCache缓存中获取
elem, ok = tkCloseCache.Get(uintkey(farm.Hash64(hash)))
if ok {
sn := elem.(*memNode)
node := &Node{
height: sn.Height,
size: sn.Size,
hash: hash,
persisted: true,
}
node.leftHash = sn.data[0]
node.rightHash = sn.data[1]
node.key = sn.data[2]
if len(sn.data) == 4 {
node.value = sn.data[3]
}
return node, nil
if tkCloseCache != nil {
// 从tkCloseCache缓存中获取
elem, ok := tkCloseCache.Get(uintkey(farm.Hash64(hash)))
if ok {
sn := elem.(*memNode)
node := &Node{
height: sn.Height,
size: sn.Size,
hash: hash,
persisted: true,
}
node.leftHash = sn.data[0]
node.rightHash = sn.data[1]
node.key = sn.data[2]
if len(sn.data) == 4 {
node.value = sn.data[3]
}
return node, nil
}
}
return nil, ErrNodeNotExist
}
......
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