From be80588bceac2c5523b4e342783153f7715b6212 Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Fri, 24 Sep 2021 16:40:01 +0200 Subject: [PATCH] trie: check for derefs while committing --- trie/committer.go | 10 ++++++++++ trie/database.go | 7 +++++++ 2 files changed, 17 insertions(+) diff --git a/trie/committer.go b/trie/committer.go index 0721990a21799..ed461ba2e3f40 100644 --- a/trie/committer.go +++ b/trie/committer.go @@ -19,6 +19,8 @@ package trie import ( "errors" "fmt" + "github.com/ethereum/go-ethereum/log" + "runtime/debug" "sync" "github.com/ethereum/go-ethereum/common" @@ -77,7 +79,15 @@ func (c *committer) Commit(n node, db *Database) (hashNode, int, error) { if db == nil { return nil, 0, errors.New("no db provided") } + derefcountA := db.DerefCount() h, committed, err := c.commit(n, db) + derefcountB := db.DerefCount() + if derefcountA != derefcountB { + log.Warn("trie database dereference happened during commit.", + "before", derefcountA, "after", derefcountB) + log.Warn("Commit ended on error", "err", err) + debug.PrintStack() + } if err != nil { return nil, 0, err } diff --git a/trie/database.go b/trie/database.go index f140a56642f55..78117dfceabed 100644 --- a/trie/database.go +++ b/trie/database.go @@ -23,6 +23,7 @@ import ( "reflect" "runtime" "sync" + "sync/atomic" "time" "github.com/VictoriaMetrics/fastcache" @@ -76,6 +77,7 @@ type Database struct { preimages map[common.Hash][]byte // Preimages of nodes from the secure trie + derefs uint64 // counter on Dereference operations (accessed atomically) gctime time.Duration // Time spent on garbage collection since last commit gcnodes uint64 // Nodes garbage collected since last commit gcsize common.StorageSize // Data storage garbage collected since last commit @@ -509,6 +511,10 @@ func (db *Database) reference(child common.Hash, parent common.Hash) { } } +func (db *Database) DerefCount() uint64 { + return atomic.LoadUint64(&db.derefs) +} + // Dereference removes an existing reference from a root node. func (db *Database) Dereference(root common.Hash) { // Sanity check to ensure that the meta-root is not removed @@ -518,6 +524,7 @@ func (db *Database) Dereference(root common.Hash) { } db.lock.Lock() defer db.lock.Unlock() + atomic.AddUint64(&db.derefs, 1) nodes, storage, start := len(db.dirties), db.dirtiesSize, time.Now() db.dereference(root, common.Hash{})