diff --git a/core/state/database.go b/core/state/database.go index 5e3d9a9d388a..3bb6ffdcd33a 100644 --- a/core/state/database.go +++ b/core/state/database.go @@ -19,6 +19,7 @@ package state import ( "errors" "fmt" + "runtime" "github.com/VictoriaMetrics/fastcache" "github.com/ethereum/go-ethereum/common" @@ -131,12 +132,14 @@ func NewDatabase(db ethdb.Database) Database { // large memory cache. func NewDatabaseWithConfig(db ethdb.Database, config *trie.Config) Database { csc, _ := lru.New(codeSizeCacheSize) - return &cachingDB{ + cdb := &cachingDB{ db: trie.NewDatabaseWithConfig(db, config), disk: db, codeSizeCache: csc, codeCache: fastcache.New(codeCacheSize), } + runtime.SetFinalizer(cdb, (*cachingDB).finalizer) + return cdb } type cachingDB struct { @@ -155,6 +158,11 @@ func (db *cachingDB) OpenTrie(root common.Hash) (Trie, error) { return tr, nil } +// must call Reset() to reclaim memory used by fastcache +func (db *cachingDB) finalizer() { + db.codeCache.Reset() +} + // OpenStorageTrie opens the storage trie of an account. func (db *cachingDB) OpenStorageTrie(stateRoot common.Hash, addrHash, root common.Hash) (Trie, error) { tr, err := trie.NewStateTrie(trie.StorageTrieID(stateRoot, addrHash, root), db.db) diff --git a/trie/database.go b/trie/database.go index 76ca188add9c..e0016b5198d6 100644 --- a/trie/database.go +++ b/trie/database.go @@ -301,9 +301,17 @@ func NewDatabaseWithConfig(diskdb ethdb.KeyValueStore, config *Config) *Database }}, preimages: preimage, } + runtime.SetFinalizer(db, (*Database).finalizer) return db } +// must call Reset() to reclaim memory used by fastcache +func (db *Database) finalizer() { + if db.cleans != nil { + db.cleans.Reset() + } +} + // insert inserts a simplified trie node into the memory database. // All nodes inserted by this function will be reference tracked // and in theory should only used for **trie nodes** insertion.