From a32e4c7f695d2aebed255f9dc4f27cd68e45545d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Thu, 10 Jan 2019 18:21:42 +0200 Subject: [PATCH] trie: only cache one rlp per hash (even from diff owners) --- trie/database.go | 8 ++++---- trie/pruning.go | 5 +++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/trie/database.go b/trie/database.go index 50ddfbf8ff..f701464c90 100644 --- a/trie/database.go +++ b/trie/database.go @@ -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 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) memcacheCleanReadMeter.Mark(int64(len(enc))) return mustDecodeNode(hash[:], enc, cachegen) @@ -482,7 +482,7 @@ func (db *Database) node(owner common.Hash, hash common.Hash, cachegen uint16) n return nil } if db.cleans != nil { - db.cleans.Set(key, enc) + db.cleans.Set(string(hash[:]), enc) memcacheCleanMissMeter.Mark(1) 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 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) memcacheCleanReadMeter.Mark(int64(len(enc))) 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)) if err == nil && enc != nil { if db.cleans != nil { - db.cleans.Set(key, enc) + db.cleans.Set(string(hash[:]), enc) memcacheCleanMissMeter.Mark(1) memcacheCleanWriteMeter.Mark(int64(len(enc))) } diff --git a/trie/pruning.go b/trie/pruning.go index 3278b62936..3305b7defe 100644 --- a/trie/pruning.go +++ b/trie/pruning.go @@ -134,7 +134,7 @@ func (p *pruner) prune(owner common.Hash, hash common.Hash, path []byte) { node := mustDecodeNode(hash[:], blob, 0) // 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.db.prunenodes++ 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) } // 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) } else if node := t.db.dirties[key]; node != nil { 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)) } 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