From 02dd66dfc0b1551bb55b95ae0b914a58441ce2ac Mon Sep 17 00:00:00 2001 From: rjl493456442 Date: Tue, 2 Jun 2026 09:46:11 +0800 Subject: [PATCH] core/txpool/locals: fix data race (#35096) Supersedes #35060 ``` go test -race ./core/txpool/locals/ ok github.com/ethereum/go-ethereum/core/txpool/locals 1.782s ``` --- core/txpool/locals/tx_tracker.go | 33 ++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/core/txpool/locals/tx_tracker.go b/core/txpool/locals/tx_tracker.go index 66f3248105..59626a5e66 100644 --- a/core/txpool/locals/tx_tracker.go +++ b/core/txpool/locals/tx_tracker.go @@ -173,6 +173,17 @@ func (tracker *TxTracker) recheck(journalCheck bool) []*types.Transaction { // Start is called after all services have been constructed and the networking // layer was also initialized to spawn any goroutines required by the service. func (tracker *TxTracker) Start() error { + if tracker.journal != nil { + tracker.journal.load(func(transactions []*types.Transaction) []error { + tracker.TrackAll(transactions) + return nil + }) + // Setup the writer for the upcoming transactions + if err := tracker.journal.setupWriter(); err != nil { + log.Error("Failed to setup the journal writer", "err", err) + return err + } + } tracker.wg.Add(1) go tracker.loop() return nil @@ -184,25 +195,19 @@ func (tracker *TxTracker) Start() error { func (tracker *TxTracker) Stop() error { close(tracker.shutdownCh) tracker.wg.Wait() - return nil + + tracker.mu.Lock() + var err error + if tracker.journal != nil { + err = tracker.journal.close() + } + tracker.mu.Unlock() + return err } func (tracker *TxTracker) loop() { defer tracker.wg.Done() - if tracker.journal != nil { - tracker.journal.load(func(transactions []*types.Transaction) []error { - tracker.TrackAll(transactions) - return nil - }) - - // Setup the writer for the upcoming transactions - if err := tracker.journal.setupWriter(); err != nil { - log.Error("Failed to setup the journal writer", "err", err) - return - } - defer tracker.journal.close() - } var ( lastJournal = time.Now() timer = time.NewTimer(10 * time.Second) // Do initial check after 10 seconds, do rechecks more seldom.