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