From e95d98d180608665343ba3ad0f5d1e42c14cdfee Mon Sep 17 00:00:00 2001 From: Austin Larson Date: Wed, 12 Nov 2025 15:06:24 -0500 Subject: [PATCH] perf: Use Firewood's Revision --- core/txpool/legacypool/legacypool.go | 5 +++++ triedb/firewood/database.go | 11 ++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/core/txpool/legacypool/legacypool.go b/core/txpool/legacypool/legacypool.go index 1a8ebd7af4..537b26ef64 100644 --- a/core/txpool/legacypool/legacypool.go +++ b/core/txpool/legacypool/legacypool.go @@ -446,6 +446,11 @@ func (pool *LegacyPool) Close() error { if pool.journal != nil { pool.journal.close() } + + // remove all references to state to allow GC to reclaim memory + pool.pendingNonces = nil + pool.currentState = nil + log.Info("Transaction pool stopped") return nil } diff --git a/triedb/firewood/database.go b/triedb/firewood/database.go index f95104260f..ecbc252041 100644 --- a/triedb/firewood/database.go +++ b/triedb/firewood/database.go @@ -493,16 +493,17 @@ func (db *Database) removeProposalFromMap(pCtx *ProposalContext) { // Reader retrieves a node reader belonging to the given state root. // An error will be returned if the requested state is not available. func (db *Database) Reader(root common.Hash) (database.Reader, error) { - if _, err := db.fwDisk.GetFromRoot(ffi.Hash(root), []byte{}); err != nil { + revision, err := db.fwDisk.Revision(ffi.Hash(root)) + if err != nil { return nil, fmt.Errorf("firewood: unable to retrieve from root %s: %w", root.Hex(), err) } - return &reader{db: db, root: ffi.Hash(root)}, nil + fmt.Printf("Firewood Reader created at %p\n", revision) + return &reader{revision: revision}, nil } // reader is a state reader of Database which implements the Reader interface. type reader struct { - db *Database - root ffi.Hash // The root of the state this reader is reading. + revision *ffi.Revision } // Node retrieves the trie node with the given node hash. No error will be @@ -511,7 +512,7 @@ func (reader *reader) Node(_ common.Hash, path []byte, _ common.Hash) ([]byte, e // This function relies on Firewood's internal locking to ensure concurrent reads are safe. // This is safe even if a proposal is being committed concurrently. start := time.Now() - result, err := reader.db.fwDisk.GetFromRoot(reader.root, path) + result, err := reader.revision.Get(path) if metrics.EnabledExpensive { ffiReadCount.Inc(1) ffiReadTimer.Inc(time.Since(start).Milliseconds())