/
nodedb_tpp.go
65 lines (56 loc) · 1.31 KB
/
nodedb_tpp.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package iavl
import (
"container/list"
"sync"
)
type tempPrePersistNodes struct {
mtx sync.RWMutex
tppMap map[int64]*tppItem
tppVersionList *list.List
}
func newTempPrePersistNodes() *tempPrePersistNodes {
tpp := &tempPrePersistNodes{
tppMap: make(map[int64]*tppItem),
tppVersionList: list.New(),
}
return tpp
}
func (tpp *tempPrePersistNodes) getNode(hash []byte) (*Node, bool) {
tpp.mtx.RLock()
defer tpp.mtx.RUnlock()
for v := tpp.tppVersionList.Back(); v != nil; v = v.Prev() {
ver := v.Value.(int64)
tppItem := tpp.tppMap[ver]
if elem, ok := tppItem.nodeMap[string(hash)]; ok {
return elem, ok
}
}
return nil, false
}
func (tpp *tempPrePersistNodes) pushToTpp(version int64, tppMap map[string]*Node) {
tpp.mtx.Lock()
lItem := tpp.tppVersionList.PushBack(version)
tpp.tppMap[version] = &tppItem{
nodeMap: tppMap,
listItem: lItem,
}
tpp.mtx.Unlock()
}
func (tpp *tempPrePersistNodes) removeFromTpp(version int64) {
tpp.mtx.Lock()
tItem := tpp.tppMap[version]
if tItem != nil {
tpp.tppVersionList.Remove(tItem.listItem)
}
delete(tpp.tppMap, version)
tpp.mtx.Unlock()
}
func (tpp *tempPrePersistNodes) getTppNodesNum() int {
var size = 0
tpp.mtx.RLock()
for _, mp := range tpp.tppMap {
size += len(mp.nodeMap)
}
tpp.mtx.RUnlock()
return size
}