From cff467e42462d578c4219f695202794d13ca4360 Mon Sep 17 00:00:00 2001 From: Zsolt Felfoldi Date: Mon, 27 Jan 2025 16:21:55 +0100 Subject: [PATCH] core: add blockProcCount to avoid nested blockProcFeed events --- core/blockchain.go | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/core/blockchain.go b/core/blockchain.go index 3a540ab99c..54afcf5fd0 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -222,14 +222,15 @@ type BlockChain struct { statedb *state.CachingDB // State database to reuse between imports (contains state cache) txIndexer *txIndexer // Transaction indexer, might be nil if not enabled - hc *HeaderChain - rmLogsFeed event.Feed - chainFeed event.Feed - chainHeadFeed event.Feed - logsFeed event.Feed - blockProcFeed event.Feed - scope event.SubscriptionScope - genesisBlock *types.Block + hc *HeaderChain + rmLogsFeed event.Feed + chainFeed event.Feed + chainHeadFeed event.Feed + logsFeed event.Feed + blockProcFeed event.Feed + blockProcCounter int32 + scope event.SubscriptionScope + genesisBlock *types.Block // This mutex synchronizes chain write operations. // Readers don't need to take it, they can just read the database. @@ -1616,8 +1617,15 @@ func (bc *BlockChain) insertChain(chain types.Blocks, setHead bool, makeWitness if bc.insertStopped() { return nil, 0, nil } - bc.blockProcFeed.Send(true) - defer bc.blockProcFeed.Send(false) + + if atomic.AddInt32(&bc.blockProcCounter, 1) == 1 { + bc.blockProcFeed.Send(true) + } + defer func() { + if atomic.AddInt32(&bc.blockProcCounter, -1) == 0 { + bc.blockProcFeed.Send(false) + } + }() // Start a parallel signature recovery (signer will fluke on fork transition, minimal perf loss) SenderCacher().RecoverFromBlocks(types.MakeSigner(bc.chainConfig, chain[0].Number(), chain[0].Time()), chain)