Commit 4bbd8262 authored by liuyuhang's avatar liuyuhang Committed by vipwzw

cache close ticket

parent 62273efd
...@@ -41,8 +41,9 @@ var ( ...@@ -41,8 +41,9 @@ var (
heightMtx sync.Mutex heightMtx sync.Mutex
// //
enableMemTree bool enableMemTree bool
memTree MemTreeOpera
enableMemVal bool enableMemVal bool
memTree MemTreeOpera
tkCloseCache MemTreeOpera
) )
// EnableMavlPrefix 使能mavl加前缀 // EnableMavlPrefix 使能mavl加前缀
...@@ -81,6 +82,7 @@ type Tree struct { ...@@ -81,6 +82,7 @@ type Tree struct {
// 树更新之后,废弃的节点(更新缓存中节点先对旧节点进行删除然后再更新) // 树更新之后,废弃的节点(更新缓存中节点先对旧节点进行删除然后再更新)
obsoleteNode map[uintkey]struct{} obsoleteNode map[uintkey]struct{}
updateNode map[uintkey]*memNode updateNode map[uintkey]*memNode
tkCloseNode map[uintkey]*memNode
} }
// NewTree 新建一个merkle avl 树 // NewTree 新建一个merkle avl 树
...@@ -90,6 +92,7 @@ func NewTree(db dbm.DB, sync bool) *Tree { ...@@ -90,6 +92,7 @@ func NewTree(db dbm.DB, sync bool) *Tree {
return &Tree{ return &Tree{
obsoleteNode: make(map[uintkey]struct{}), obsoleteNode: make(map[uintkey]struct{}),
updateNode: make(map[uintkey]*memNode), updateNode: make(map[uintkey]*memNode),
tkCloseNode: make(map[uintkey]*memNode),
} }
} }
// Persistent IAVLTree // Persistent IAVLTree
...@@ -97,11 +100,13 @@ func NewTree(db dbm.DB, sync bool) *Tree { ...@@ -97,11 +100,13 @@ func NewTree(db dbm.DB, sync bool) *Tree {
// 使能情况下非空创建当前整tree的缓存 // 使能情况下非空创建当前整tree的缓存
if enableMemTree && memTree == nil { if enableMemTree && memTree == nil {
memTree = NewTreeMap(50 * 10000) memTree = NewTreeMap(50 * 10000)
tkCloseCache = NewTreeARC(10 * 10000)
} }
return &Tree{ return &Tree{
ndb: ndb, ndb: ndb,
obsoleteNode: make(map[uintkey]struct{}), obsoleteNode: make(map[uintkey]struct{}),
updateNode: make(map[uintkey]*memNode), updateNode: make(map[uintkey]*memNode),
tkCloseNode: make(map[uintkey]*memNode),
} }
} }
...@@ -170,14 +175,17 @@ func (t *Tree) Hash() []byte { ...@@ -170,14 +175,17 @@ func (t *Tree) Hash() []byte {
} }
hash := t.root.Hash(t) hash := t.root.Hash(t)
// 更新memTree // 更新memTree
if enableMemTree && memTree != nil { if enableMemTree && memTree != nil && tkCloseCache != nil {
for k := range t.obsoleteNode { for k := range t.obsoleteNode {
memTree.Delete(k) memTree.Delete(k)
} }
for k, v := range t.updateNode { for k, v := range t.updateNode {
memTree.Add(k, v) memTree.Add(k, v)
} }
treelog.Debug("Tree.Hash", "memTree len", memTree.Len(), "tree height", t.blockHeight) for k, v := range t.tkCloseNode {
tkCloseCache.Add(k, v)
}
treelog.Debug("Tree.Hash", "memTree len", memTree.Len(), "tkCloseCache len", tkCloseCache.Len(), "tree height", t.blockHeight)
} }
return hash return hash
} }
...@@ -459,7 +467,7 @@ func (ndb *nodeDB) GetNode(t *Tree, hash []byte) (*Node, error) { ...@@ -459,7 +467,7 @@ func (ndb *nodeDB) GetNode(t *Tree, hash []byte) (*Node, error) {
} }
//从memtree中获取 //从memtree中获取
if enableMemTree { if enableMemTree {
node, err := getNode4MemTree(hash) node, err := getNodeMemTree(hash)
if err == nil { if err == nil {
return node, nil return node, nil
} }
...@@ -533,8 +541,8 @@ func (ndb *nodeDB) SaveNode(t *Tree, node *Node) { ...@@ -533,8 +541,8 @@ func (ndb *nodeDB) SaveNode(t *Tree, node *Node) {
delete(ndb.orphans, string(node.hash)) delete(ndb.orphans, string(node.hash))
} }
func getNode4MemTree(hash []byte) (*Node, error) { func getNodeMemTree(hash []byte) (*Node, error) {
if memTree == nil { if memTree == nil && tkCloseCache == nil{
return nil, ErrNodeNotExist return nil, ErrNodeNotExist
} }
elem, ok := memTree.Get(uintkey(farm.Hash64(hash))) elem, ok := memTree.Get(uintkey(farm.Hash64(hash)))
...@@ -554,12 +562,30 @@ func getNode4MemTree(hash []byte) (*Node, error) { ...@@ -554,12 +562,30 @@ func getNode4MemTree(hash []byte) (*Node, error) {
} }
return node, nil 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
}
return nil, ErrNodeNotExist return nil, ErrNodeNotExist
} }
// Save node hashInt64 to memTree // Save node hashInt64 to memTree
func updateGlobalMemTree(node *Node) { func updateGlobalMemTree(node *Node) {
if node == nil || memTree == nil { if node == nil || memTree == nil || tkCloseCache == nil {
return return
} }
if !enableMemVal && node.height == 0 { if !enableMemVal && node.height == 0 {
...@@ -569,12 +595,13 @@ func updateGlobalMemTree(node *Node) { ...@@ -569,12 +595,13 @@ func updateGlobalMemTree(node *Node) {
Height: node.height, Height: node.height,
Size: node.size, Size: node.size,
} }
var isTkCloseNode bool
if node.height == 0 { if node.height == 0 {
if bytes.HasPrefix(node.key, ticket.TicketPrefix) { if bytes.HasPrefix(node.key, ticket.TicketPrefix) {
tk := &ticket.Ticket{} tk := &ticket.Ticket{}
err := proto.Unmarshal(node.value, tk) err := proto.Unmarshal(node.value, tk)
if err == nil && tk.Status == ticket.StatusCloseTicket { //ticket为close状态下不做存储 if err == nil && tk.Status == ticket.StatusCloseTicket { //ticket为close状态下不做存储
return isTkCloseNode = true
} }
} }
memN.data = make([][]byte, 4) memN.data = make([][]byte, 4)
...@@ -585,7 +612,11 @@ func updateGlobalMemTree(node *Node) { ...@@ -585,7 +612,11 @@ func updateGlobalMemTree(node *Node) {
memN.data[0] = node.leftHash memN.data[0] = node.leftHash
memN.data[1] = node.rightHash memN.data[1] = node.rightHash
memN.data[2] = node.key memN.data[2] = node.key
memTree.Add(uintkey(farm.Hash64(node.hash)), memN) if(isTkCloseNode) {
tkCloseCache.Add(uintkey(farm.Hash64(node.hash)), memN)
} else {
memTree.Add(uintkey(farm.Hash64(node.hash)), memN)
}
} }
// Save node hashInt64 to localmem // Save node hashInt64 to localmem
...@@ -596,17 +627,18 @@ func updateLocalMemTree(t *Tree, node *Node) { ...@@ -596,17 +627,18 @@ func updateLocalMemTree(t *Tree, node *Node) {
if !enableMemVal && node.height == 0 { if !enableMemVal && node.height == 0 {
return return
} }
if t.updateNode != nil { if t.updateNode != nil && t.tkCloseNode != nil {
memN := &memNode{ memN := &memNode{
Height: node.height, Height: node.height,
Size: node.size, Size: node.size,
} }
var isTkCloseNode bool
if node.height == 0 { if node.height == 0 {
if bytes.HasPrefix(node.key, ticket.TicketPrefix) { if bytes.HasPrefix(node.key, ticket.TicketPrefix) {
tk := &ticket.Ticket{} tk := &ticket.Ticket{}
err := proto.Unmarshal(node.value, tk) err := proto.Unmarshal(node.value, tk)
if err == nil && tk.Status == ticket.StatusCloseTicket { //ticket为close状态下不做存储 if err == nil && tk.Status == ticket.StatusCloseTicket { //ticket为close状态下不做存储
return isTkCloseNode = true
} }
} }
memN.data = make([][]byte, 4) memN.data = make([][]byte, 4)
...@@ -617,7 +649,11 @@ func updateLocalMemTree(t *Tree, node *Node) { ...@@ -617,7 +649,11 @@ func updateLocalMemTree(t *Tree, node *Node) {
memN.data[0] = node.leftHash memN.data[0] = node.leftHash
memN.data[1] = node.rightHash memN.data[1] = node.rightHash
memN.data[2] = node.key memN.data[2] = node.key
t.updateNode[uintkey(farm.Hash64(node.hash))] = memN if(isTkCloseNode) {
t.tkCloseNode[uintkey(farm.Hash64(node.hash))] = memN
} else {
t.updateNode[uintkey(farm.Hash64(node.hash))] = memN
}
//treelog.Debug("Tree.SaveNode", "store struct size", unsafe.Sizeof(store), "byte size", len(storenode), "height", node.height) //treelog.Debug("Tree.SaveNode", "store struct size", unsafe.Sizeof(store), "byte size", len(storenode), "height", node.height)
} }
} }
......
...@@ -2004,12 +2004,12 @@ func TestSize1(t *testing.T) { ...@@ -2004,12 +2004,12 @@ func TestSize1(t *testing.T) {
var c []byte var c []byte
d := storeNode1{} d := storeNode1{}
//arcmp := NewTreeMap(350 * 10000) //arcmp := NewTreeARC(10 * 10000)
//if arcmp == nil { //if arcmp == nil {
// return // return
//} //}
//
//for i := 0; i < 300*10000; i++ { //for i := 0; i < 10*10000; i++ {
// data := &storeNode{ // data := &storeNode{
// Key: []byte("12345678901234567890123456789012"), // Key: []byte("12345678901234567890123456789012"),
// Value: []byte("12345678901234567890123456789012"), // Value: []byte("12345678901234567890123456789012"),
...@@ -2019,7 +2019,7 @@ func TestSize1(t *testing.T) { ...@@ -2019,7 +2019,7 @@ func TestSize1(t *testing.T) {
// //Value: copyBytes([]byte("12345678901234567890123456789012")), // //Value: copyBytes([]byte("12345678901234567890123456789012")),
// //LeftHash: copyBytes([]byte("12345678901234567890123456789012")), // //LeftHash: copyBytes([]byte("12345678901234567890123456789012")),
// //RightHash: copyBytes([]byte("12345678901234567890123456789012")), // //RightHash: copyBytes([]byte("12345678901234567890123456789012")),
// Height: 123, // Height: 1,
// Size: 123, // Size: 123,
// } // }
// arcmp.Add(int64(i), data) // arcmp.Add(int64(i), data)
......
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