@@ -39,7 +39,6 @@ import (
3939 "github.com/ethereum/go-ethereum/common/mclock"
4040 "github.com/ethereum/go-ethereum/common/prque"
4141 "github.com/ethereum/go-ethereum/consensus"
42- "github.com/ethereum/go-ethereum/core/blockstm"
4342 "github.com/ethereum/go-ethereum/core/rawdb"
4443 "github.com/ethereum/go-ethereum/core/state"
4544 "github.com/ethereum/go-ethereum/core/state/snapshot"
@@ -86,12 +85,15 @@ var (
8685 blockImportTimer = metrics .NewRegisteredMeter ("chain/imports" , nil )
8786 triedbCommitTimer = metrics .NewRegisteredTimer ("chain/triedb/commits" , nil )
8887
89- blockInsertTimer = metrics .NewRegisteredTimer ("chain/inserts" , nil )
90- blockValidationTimer = metrics .NewRegisteredTimer ("chain/validation" , nil )
91- blockExecutionTimer = metrics .NewRegisteredTimer ("chain/execution" , nil )
92- blockWriteTimer = metrics .NewRegisteredTimer ("chain/write" , nil )
93- blockExecutionParallelCounter = metrics .NewRegisteredCounter ("chain/execution/parallel" , nil )
94- blockExecutionSerialCounter = metrics .NewRegisteredCounter ("chain/execution/serial" , nil )
88+ blockInsertTimer = metrics .NewRegisteredTimer ("chain/inserts" , nil )
89+ blockValidationTimer = metrics .NewRegisteredTimer ("chain/validation" , nil )
90+ blockExecutionTimer = metrics .NewRegisteredTimer ("chain/execution" , nil )
91+ blockWriteTimer = metrics .NewRegisteredTimer ("chain/write" , nil )
92+ blockExecutionParallelCounter = metrics .NewRegisteredCounter ("chain/execution/parallel" , nil )
93+ blockExecutionSerialCounter = metrics .NewRegisteredCounter ("chain/execution/serial" , nil )
94+ blockExecutionParallelErrorCounter = metrics .NewRegisteredCounter ("chain/execution/parallel/error" , nil )
95+ blockExecutionParallelTimer = metrics .NewRegisteredTimer ("chain/execution/parallel/timer" , nil )
96+ blockExecutionSerialTimer = metrics .NewRegisteredTimer ("chain/execution/serial/timer" , nil )
9597
9698 blockReorgMeter = metrics .NewRegisteredMeter ("chain/reorg/executes" , nil )
9799 blockReorgAddMeter = metrics .NewRegisteredMeter ("chain/reorg/add" , nil )
@@ -569,7 +571,7 @@ func NewParallelBlockChain(db ethdb.Database, cacheConfig *CacheConfig, genesis
569571 return bc , nil
570572}
571573
572- func (bc * BlockChain ) ProcessBlock (block * types.Block , parent * types.Header ) (_ types.Receipts , _ []* types.Log , _ uint64 , _ * state.StateDB , blockEndErr error ) {
574+ func (bc * BlockChain ) ProcessBlock (block * types.Block , parent * types.Header ) (_ types.Receipts , _ []* types.Log , _ uint64 , _ * state.StateDB , vtime time. Duration , blockEndErr error ) {
573575 // Process the block using processor and parallelProcessor at the same time, take the one which finishes first, cancel the other, and return the result
574576 ctx , cancel := context .WithCancel (context .Background ())
575577 defer cancel ()
@@ -597,6 +599,7 @@ func (bc *BlockChain) ProcessBlock(block *types.Block, parent *types.Header) (_
597599 err error
598600 statedb * state.StateDB
599601 counter metrics.Counter
602+ parallel bool
600603 }
601604
602605 resultChan := make (chan Result , 2 )
@@ -606,44 +609,58 @@ func (bc *BlockChain) ProcessBlock(block *types.Block, parent *types.Header) (_
606609 if bc .parallelProcessor != nil {
607610 parallelStatedb , err := state .New (parent .Root , bc .stateCache , bc .snaps )
608611 if err != nil {
609- return nil , nil , 0 , nil , err
612+ return nil , nil , 0 , nil , 0 , err
610613 }
611614 parallelStatedb .SetLogger (bc .logger )
612615
613616 processorCount ++
614617
615618 go func () {
616619 parallelStatedb .StartPrefetcher ("chain" , nil )
620+ pstart := time .Now ()
617621 receipts , logs , usedGas , err := bc .parallelProcessor .Process (block , parallelStatedb , bc .vmConfig , ctx )
618- resultChan <- Result {receipts , logs , usedGas , err , parallelStatedb , blockExecutionParallelCounter }
622+ blockExecutionParallelTimer .UpdateSince (pstart )
623+ if err == nil {
624+ vstart := time .Now ()
625+ err = bc .validator .ValidateState (block , parallelStatedb , receipts , usedGas , false )
626+ vtime = time .Since (vstart )
627+ }
628+ resultChan <- Result {receipts , logs , usedGas , err , parallelStatedb , blockExecutionParallelCounter , true }
619629 }()
620630 }
621631
622632 if bc .processor != nil {
623633 statedb , err := state .New (parent .Root , bc .stateCache , bc .snaps )
624634 if err != nil {
625- return nil , nil , 0 , nil , err
635+ return nil , nil , 0 , nil , 0 , err
626636 }
627637 statedb .SetLogger (bc .logger )
628638
629639 processorCount ++
630640
631641 go func () {
632642 statedb .StartPrefetcher ("chain" , nil )
643+ pstart := time .Now ()
633644 receipts , logs , usedGas , err := bc .processor .Process (block , statedb , bc .vmConfig , ctx )
634- resultChan <- Result {receipts , logs , usedGas , err , statedb , blockExecutionSerialCounter }
645+ blockExecutionSerialTimer .UpdateSince (pstart )
646+ if err == nil {
647+ vstart := time .Now ()
648+ err = bc .validator .ValidateState (block , statedb , receipts , usedGas , false )
649+ vtime = time .Since (vstart )
650+ }
651+ resultChan <- Result {receipts , logs , usedGas , err , statedb , blockExecutionSerialCounter , false }
635652 }()
636653 }
637654
638655 result := <- resultChan
639656
640- if _ , ok := result .err .(blockstm. ParallelExecFailedError ); ok {
657+ if result . parallel && result .err != nil {
641658 log .Warn ("Parallel state processor failed" , "err" , result .err )
642-
659+ blockExecutionParallelErrorCounter . Inc ( 1 )
643660 // If the parallel processor failed, we will fallback to the serial processor if enabled
644661 if processorCount == 2 {
645- result .statedb .StopPrefetcher ()
646662 result = <- resultChan
663+ result .statedb .StopPrefetcher ()
647664 processorCount --
648665 }
649666 }
@@ -658,7 +675,7 @@ func (bc *BlockChain) ProcessBlock(block *types.Block, parent *types.Header) (_
658675 }()
659676 }
660677
661- return result .receipts , result .logs , result .usedGas , result .statedb , result .err
678+ return result .receipts , result .logs , result .usedGas , result .statedb , vtime , result .err
662679}
663680
664681// empty returns an indicator whether the blockchain is empty.
@@ -2323,7 +2340,7 @@ func (bc *BlockChain) insertChain(chain types.Blocks, setHead bool) (int, error)
23232340
23242341 // Process block using the parent state as reference point
23252342 pstart := time .Now ()
2326- receipts , logs , usedGas , statedb , err := bc .ProcessBlock (block , parent )
2343+ receipts , logs , usedGas , statedb , vtime , err := bc .ProcessBlock (block , parent )
23272344 activeState = statedb
23282345
23292346 if err != nil {
@@ -2338,18 +2355,8 @@ func (bc *BlockChain) insertChain(chain types.Blocks, setHead bool) (int, error)
23382355 bc .stateSyncFeed .Send (StateSyncEvent {Data : data })
23392356 }
23402357 // BOR
2341- ptime := time .Since (pstart )
2342-
2343- vstart := time .Now ()
2344-
2345- if err := bc .validator .ValidateState (block , statedb , receipts , usedGas , false ); err != nil {
2346- bc .reportBlock (block , receipts , err )
2347- followupInterrupt .Store (true )
2348-
2349- return it .index , err
2350- }
2358+ ptime := time .Since (pstart ) - vtime
23512359
2352- vtime := time .Since (vstart )
23532360 proctime := time .Since (start ) // processing + validation
23542361
23552362 // Update the metrics touched during block processing and validation
0 commit comments