diff --git a/zk/stages/stage_sequence_execute.go b/zk/stages/stage_sequence_execute.go index d975075b0e0..14918403187 100644 --- a/zk/stages/stage_sequence_execute.go +++ b/zk/stages/stage_sequence_execute.go @@ -137,6 +137,7 @@ func SpawnSequencingStage( log.Info(fmt.Sprintf("[%s] Starting batch %d...", logPrefix, batchState.batchNumber)) + var allConditionsOK bool for blockNumber := executionAt + 1; runLoopBlocks; blockNumber++ { log.Info(fmt.Sprintf("[%s] Starting block %d (forkid %v)...", logPrefix, blockNumber, batchState.forkId)) logTicker.Reset(10 * time.Second) @@ -223,12 +224,18 @@ func SpawnSequencingStage( return err } } else if !batchState.isL1Recovery() { - batchState.blockState.transactionsForInclusion, err = getNextPoolTransactions(ctx, cfg, executionAt, batchState.forkId, batchState.yieldedTransactions) + batchState.blockState.transactionsForInclusion, allConditionsOK, err = getNextPoolTransactions(ctx, cfg, executionAt, batchState.forkId, batchState.yieldedTransactions) if err != nil { return err } + if len(batchState.blockState.transactionsForInclusion) == 0 { - time.Sleep(batchContext.cfg.zk.SequencerTimeoutOnEmptyTxPool) + if allConditionsOK { + time.Sleep(batchContext.cfg.zk.SequencerTimeoutOnEmptyTxPool) + } else { + time.Sleep(batchContext.cfg.zk.SequencerTimeoutOnEmptyTxPool / 5) // we do not need to sleep too long for txpool not ready + } + } else { log.Trace(fmt.Sprintf("[%s] Yielded transactions from the pool", logPrefix), "txCount", len(batchState.blockState.transactionsForInclusion)) } diff --git a/zk/stages/stage_sequence_execute_transactions.go b/zk/stages/stage_sequence_execute_transactions.go index 5348eace90d..42ff1285b2e 100644 --- a/zk/stages/stage_sequence_execute_transactions.go +++ b/zk/stages/stage_sequence_execute_transactions.go @@ -21,18 +21,19 @@ import ( "github.com/ledgerwatch/log/v3" ) -func getNextPoolTransactions(ctx context.Context, cfg SequenceBlockCfg, executionAt, forkId uint64, alreadyYielded mapset.Set[[32]byte]) ([]types.Transaction, error) { +func getNextPoolTransactions(ctx context.Context, cfg SequenceBlockCfg, executionAt, forkId uint64, alreadyYielded mapset.Set[[32]byte]) ([]types.Transaction, bool, error) { cfg.txPool.LockFlusher() defer cfg.txPool.UnlockFlusher() var transactions []types.Transaction + var allConditionsOk bool var err error gasLimit := utils.GetBlockGasLimitForFork(forkId) if err := cfg.txPoolDb.View(ctx, func(poolTx kv.Tx) error { slots := types2.TxsRlp{} - if _, _, err = cfg.txPool.YieldBest(cfg.yieldSize, &slots, poolTx, executionAt, gasLimit, alreadyYielded); err != nil { + if allConditionsOk, _, err = cfg.txPool.YieldBest(cfg.yieldSize, &slots, poolTx, executionAt, gasLimit, alreadyYielded); err != nil { return err } yieldedTxs, err := extractTransactionsFromSlot(&slots) @@ -42,10 +43,10 @@ func getNextPoolTransactions(ctx context.Context, cfg SequenceBlockCfg, executio transactions = append(transactions, yieldedTxs...) return nil }); err != nil { - return nil, err + return nil, allConditionsOk, err } - return transactions, err + return transactions, allConditionsOk, err } func getLimboTransaction(ctx context.Context, cfg SequenceBlockCfg, txHash *common.Hash) ([]types.Transaction, error) {