github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/iavl/mutable_tree_map.go (about)

     1  package iavl
     2  
     3  import (
     4  	"sync"
     5  )
     6  
     7  var treeMap *TreeMap
     8  
     9  type TreeMap struct {
    10  	mtx sync.RWMutex
    11  	// used for checking whether a tree is saved or not
    12  	mutableTreeSavedMap map[string]*MutableTree
    13  	totalPpncSize       int64
    14  	evmPpncSize         int64
    15  	accPpncSize         int64
    16  	lastUpdatedVersion  int64
    17  }
    18  
    19  func init() {
    20  	treeMap = &TreeMap{
    21  		mutableTreeSavedMap: make(map[string]*MutableTree),
    22  	}
    23  }
    24  
    25  func (tm *TreeMap) addNewTree(tree *MutableTree) {
    26  	tm.mtx.Lock()
    27  	defer tm.mtx.Unlock()
    28  	if _, ok := tm.mutableTreeSavedMap[tree.GetModuleName()]; !ok {
    29  		tm.mutableTreeSavedMap[tree.GetModuleName()] = tree
    30  		go tree.commitSchedule()
    31  		if EnablePruningHistoryState {
    32  			go tree.pruningSchedule()
    33  		}
    34  	}
    35  }
    36  
    37  func (tm *TreeMap) getTree(moduleName string) (tree *MutableTree, ok bool) {
    38  	tm.mtx.RLock()
    39  	defer tm.mtx.RUnlock()
    40  	tree, ok = tm.mutableTreeSavedMap[moduleName]
    41  	return
    42  }
    43  
    44  // updateMutableTreeMap marks into true when operation of save-version is done
    45  func (tm *TreeMap) updatePpnc(version int64) {
    46  	tm.mtx.Lock()
    47  	defer tm.mtx.Unlock()
    48  
    49  	if version == tm.lastUpdatedVersion {
    50  		return
    51  	}
    52  	var size int64 = 0
    53  	for _, tree := range tm.mutableTreeSavedMap {
    54  		ppnc := int64(len(tree.ndb.prePersistNodeCache))
    55  		size += ppnc
    56  		if tree.GetModuleName() == "evm" {
    57  			tm.evmPpncSize = ppnc
    58  		}
    59  		if tree.GetModuleName() == "acc" {
    60  			tm.accPpncSize = ppnc
    61  		}
    62  	}
    63  	tm.totalPpncSize = size
    64  	tm.lastUpdatedVersion = version
    65  }
    66  
    67  // resetMap clear the TreeMap, only for test.
    68  func (tm *TreeMap) resetMap() {
    69  	tm.mtx.Lock()
    70  	defer tm.mtx.Unlock()
    71  	tm.mutableTreeSavedMap = make(map[string]*MutableTree)
    72  }