Skip to content

Commit 1acfe92

Browse files
karalabeholiman
authored andcommitted
core/state/snapshot, trie: use key/value store for resolver
1 parent 4897e10 commit 1acfe92

File tree

2 files changed

+19
-15
lines changed

2 files changed

+19
-15
lines changed

core/state/snapshot/generate.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -438,15 +438,16 @@ func (dl *diskLayer) generateRange(root common.Hash, prefix []byte, kind string,
438438

439439
// We use the snap data to build up a cache which can be used by the
440440
// main account trie as a primary lookup when resolving hashes
441-
var snapTrieDb *trie.Database
441+
var snapNodeCache ethdb.KeyValueStore
442442
if len(result.keys) > 0 {
443-
snapNodeCache := memorydb.New()
444-
snapTrieDb = trie.NewDatabase(snapNodeCache)
443+
snapNodeCache = memorydb.New()
444+
snapTrieDb := trie.NewDatabase(snapNodeCache)
445445
snapTrie, _ := trie.New(common.Hash{}, snapTrieDb)
446446
for i, key := range result.keys {
447447
snapTrie.Update(key, result.vals[i])
448448
}
449-
snapTrie.Commit(nil)
449+
root, _ := snapTrie.Commit(nil)
450+
snapTrieDb.Commit(root, false, nil)
450451
}
451452
tr := result.tr
452453
if tr == nil {
@@ -474,7 +475,7 @@ func (dl *diskLayer) generateRange(root common.Hash, prefix []byte, kind string,
474475
start = time.Now()
475476
internal time.Duration
476477
)
477-
nodeIt.AddResolver(snapTrieDb)
478+
nodeIt.AddResolver(snapNodeCache)
478479
for iter.Next() {
479480
if last != nil && bytes.Compare(iter.Key, last) > 0 {
480481
trieMore = true

trie/iterator.go

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"errors"
2323

2424
"github.com/ethereum/go-ethereum/common"
25+
"github.com/ethereum/go-ethereum/ethdb"
2526
"github.com/ethereum/go-ethereum/rlp"
2627
)
2728

@@ -114,7 +115,7 @@ type NodeIterator interface {
114115
// Before adding a similar mechanism to any other place in Geth, consider
115116
// making trie.Database an interface and wrapping at that level. It's a huge
116117
// refactor, but it could be worth it if another occurance arises.
117-
AddResolver(*Database)
118+
AddResolver(ethdb.KeyValueStore)
118119
}
119120

120121
// nodeIteratorState represents the iteration state at one particular node of the
@@ -133,11 +134,7 @@ type nodeIterator struct {
133134
path []byte // Path to the current node
134135
err error // Failure set in case of an internal error in the iterator
135136

136-
resolver *Database // Optional intermediate resolver above the disk layer
137-
}
138-
139-
func (it *nodeIterator) AddResolver(resolver *Database) {
140-
it.resolver = resolver
137+
resolver ethdb.KeyValueStore // Optional intermediate resolver above the disk layer
141138
}
142139

143140
// errIteratorEnd is stored in nodeIterator.err when iteration is done.
@@ -162,6 +159,10 @@ func newNodeIterator(trie *Trie, start []byte) NodeIterator {
162159
return it
163160
}
164161

162+
func (it *nodeIterator) AddResolver(resolver ethdb.KeyValueStore) {
163+
it.resolver = resolver
164+
}
165+
165166
func (it *nodeIterator) Hash() common.Hash {
166167
if len(it.stack) == 0 {
167168
return common.Hash{}
@@ -351,8 +352,10 @@ func (it *nodeIterator) peekSeek(seekKey []byte) (*nodeIteratorState, *int, []by
351352

352353
func (it *nodeIterator) resolveHash(hash hashNode, path []byte) (node, error) {
353354
if it.resolver != nil {
354-
if resolved := it.resolver.node(common.BytesToHash(hash)); resolved != nil {
355-
return resolved, nil
355+
if blob, err := it.resolver.Get(hash); err == nil && len(blob) > 0 {
356+
if resolved, err := decodeNode(hash, blob); err == nil {
357+
return resolved, nil
358+
}
356359
}
357360
}
358361
resolved, err := it.trie.resolveHash(hash, path)
@@ -546,7 +549,7 @@ func (it *differenceIterator) Path() []byte {
546549
return it.b.Path()
547550
}
548551

549-
func (it *differenceIterator) AddResolver(db *Database) {
552+
func (it *differenceIterator) AddResolver(resolver ethdb.KeyValueStore) {
550553
panic("not implemented")
551554
}
552555

@@ -657,7 +660,7 @@ func (it *unionIterator) Path() []byte {
657660
return (*it.items)[0].Path()
658661
}
659662

660-
func (it *unionIterator) AddResolver(db *Database) {
663+
func (it *unionIterator) AddResolver(resolver ethdb.KeyValueStore) {
661664
panic("not implemented")
662665
}
663666

0 commit comments

Comments
 (0)