trie: only cache one rlp per hash (even from diff owners)

This commit is contained in:
Péter Szilágyi 2019-01-10 18:21:42 +02:00
parent 0ef6607045
commit a32e4c7f69
No known key found for this signature in database
GPG key ID: E9AE538CEDF8293D
2 changed files with 7 additions and 6 deletions

View file

@ -462,7 +462,7 @@ func (db *Database) node(owner common.Hash, hash common.Hash, cachegen uint16) n
// Retrieve the node from the clean cache if available // Retrieve the node from the clean cache if available
if db.cleans != nil { if db.cleans != nil {
if enc, err := db.cleans.Get(key); err == nil && enc != nil { if enc, err := db.cleans.Get(string(hash[:])); err == nil && enc != nil {
memcacheCleanHitMeter.Mark(1) memcacheCleanHitMeter.Mark(1)
memcacheCleanReadMeter.Mark(int64(len(enc))) memcacheCleanReadMeter.Mark(int64(len(enc)))
return mustDecodeNode(hash[:], enc, cachegen) return mustDecodeNode(hash[:], enc, cachegen)
@ -482,7 +482,7 @@ func (db *Database) node(owner common.Hash, hash common.Hash, cachegen uint16) n
return nil return nil
} }
if db.cleans != nil { if db.cleans != nil {
db.cleans.Set(key, enc) db.cleans.Set(string(hash[:]), enc)
memcacheCleanMissMeter.Mark(1) memcacheCleanMissMeter.Mark(1)
memcacheCleanWriteMeter.Mark(int64(len(enc))) memcacheCleanWriteMeter.Mark(int64(len(enc)))
} }
@ -496,7 +496,7 @@ func (db *Database) Node(owner common.Hash, hash common.Hash) ([]byte, error) {
// Retrieve the node from the clean cache if available // Retrieve the node from the clean cache if available
if db.cleans != nil { if db.cleans != nil {
if enc, err := db.cleans.Get(key); err == nil && enc != nil { if enc, err := db.cleans.Get(string(hash[:])); err == nil && enc != nil {
memcacheCleanHitMeter.Mark(1) memcacheCleanHitMeter.Mark(1)
memcacheCleanReadMeter.Mark(int64(len(enc))) memcacheCleanReadMeter.Mark(int64(len(enc)))
return enc, nil return enc, nil
@ -514,7 +514,7 @@ func (db *Database) Node(owner common.Hash, hash common.Hash) ([]byte, error) {
enc, err := db.diskdb.Get([]byte(key)) enc, err := db.diskdb.Get([]byte(key))
if err == nil && enc != nil { if err == nil && enc != nil {
if db.cleans != nil { if db.cleans != nil {
db.cleans.Set(key, enc) db.cleans.Set(string(hash[:]), enc)
memcacheCleanMissMeter.Mark(1) memcacheCleanMissMeter.Mark(1)
memcacheCleanWriteMeter.Mark(int64(len(enc))) memcacheCleanWriteMeter.Mark(int64(len(enc)))
} }

View file

@ -134,7 +134,7 @@ func (p *pruner) prune(owner common.Hash, hash common.Hash, path []byte) {
node := mustDecodeNode(hash[:], blob, 0) node := mustDecodeNode(hash[:], blob, 0)
// Prune the node and its children if it's not a bytecode blob // Prune the node and its children if it's not a bytecode blob
p.db.cleans.Delete(key) p.db.cleans.Delete(string(hash[:]))
p.batch.Delete(dead) p.batch.Delete(dead)
p.db.prunenodes++ p.db.prunenodes++
p.db.prunesize += common.StorageSize(len(blob)) p.db.prunesize += common.StorageSize(len(blob))
@ -205,7 +205,7 @@ func (t *traverser) live(owner common.Hash, hash common.Hash, path []byte, unref
key = makeNodeKey(owner, t.state.hash) key = makeNodeKey(owner, t.state.hash)
} }
// Replace the node in the traverser with the expanded one // Replace the node in the traverser with the expanded one
if enc, err := t.db.cleans.Get(key); err == nil && enc != nil { if enc, err := t.db.cleans.Get(string(t.state.hash[:])); err == nil && enc != nil {
t.state.node = mustDecodeNode(t.state.hash[:], enc, 0) t.state.node = mustDecodeNode(t.state.hash[:], enc, 0)
} else if node := t.db.dirties[key]; node != nil { } else if node := t.db.dirties[key]; node != nil {
t.state.node = node.node t.state.node = node.node
@ -217,6 +217,7 @@ func (t *traverser) live(owner common.Hash, hash common.Hash, path []byte, unref
//panic(fmt.Sprintf("missing referenced node %x (searching for %x:%x at %x%x)", key, owner, t.state.hash, t.state.prefix, path)) //panic(fmt.Sprintf("missing referenced node %x (searching for %x:%x at %x%x)", key, owner, t.state.hash, t.state.prefix, path))
} }
t.state.node = mustDecodeNode(t.state.hash[:], blob, 0) t.state.node = mustDecodeNode(t.state.hash[:], blob, 0)
t.db.cleans.Set(string(t.state.hash[:]), blob)
} }
} }
// If we reached an account node, extract the storage trie root to continue on // If we reached an account node, extract the storage trie root to continue on