Merge pull request #3153 from fjl/trie-unload-fix

trie: improve cache unloading mechanism
This commit is contained in:
Jeffrey Wilcke
2016-10-19 13:35:49 +02:00
committed by GitHub
7 changed files with 130 additions and 70 deletions

View File

@ -105,13 +105,11 @@ func New(root common.Hash, db Database) (*Trie, error) {
if db == nil {
panic("trie.New: cannot use existing root without a database")
}
if v, _ := trie.db.Get(root[:]); len(v) == 0 {
return nil, &MissingNodeError{
RootHash: root,
NodeHash: root,
}
rootnode, err := trie.resolveHash(root[:], nil, nil)
if err != nil {
return nil, err
}
trie.root = hashNode(root.Bytes())
trie.root = rootnode
}
return trie, nil
}
@ -158,14 +156,15 @@ func (t *Trie) tryGet(origNode node, key []byte, pos int) (value []byte, newnode
if err == nil && didResolve {
n = n.copy()
n.Val = newnode
n.flags.gen = t.cachegen
}
return value, n, didResolve, err
case *fullNode:
value, newnode, didResolve, err = t.tryGet(n.Children[key[pos]], key, pos+1)
if err == nil && didResolve {
n = n.copy()
n.flags.gen = t.cachegen
n.Children[key[pos]] = newnode
}
return value, n, didResolve, err
case hashNode:
@ -261,7 +260,8 @@ func (t *Trie) insert(n node, prefix, key []byte, value node) (bool, node, error
return false, n, err
}
n = n.copy()
n.Children[key[0]], n.flags.hash, n.flags.dirty = nn, nil, true
n.flags = t.newFlag()
n.Children[key[0]] = nn
return true, n, nil
case nil:
@ -345,7 +345,8 @@ func (t *Trie) delete(n node, prefix, key []byte) (bool, node, error) {
return false, n, err
}
n = n.copy()
n.Children[key[0]], n.flags.hash, n.flags.dirty = nn, nil, true
n.flags = t.newFlag()
n.Children[key[0]] = nn
// Check how many non-nil entries are left after deleting and
// reduce the full node to a short node if only one entry is
@ -443,7 +444,7 @@ func (t *Trie) resolveHash(n hashNode, prefix, suffix []byte) (node, error) {
SuffixLen: len(suffix),
}
}
dec := mustDecodeNode(n, enc)
dec := mustDecodeNode(n, enc, t.cachegen)
return dec, nil
}