diff --git a/src/Nethermind/Nethermind.Config/BlocksConfig.cs b/src/Nethermind/Nethermind.Config/BlocksConfig.cs index 9a12edfb5d4..7b9ab72f2c7 100644 --- a/src/Nethermind/Nethermind.Config/BlocksConfig.cs +++ b/src/Nethermind/Nethermind.Config/BlocksConfig.cs @@ -26,6 +26,8 @@ public class BlocksConfig : IBlocksConfig public bool PreWarmStateOnBlockProcessing { get; set; } = true; + public int BlockProductionTimeoutMs { get; set; } = 4000; + public string ExtraData { get diff --git a/src/Nethermind/Nethermind.Config/IBlocksConfig.cs b/src/Nethermind/Nethermind.Config/IBlocksConfig.cs index 8f232cf2b02..54a72405b79 100644 --- a/src/Nethermind/Nethermind.Config/IBlocksConfig.cs +++ b/src/Nethermind/Nethermind.Config/IBlocksConfig.cs @@ -37,5 +37,8 @@ public interface IBlocksConfig : IConfig [ConfigItem(Description = "Try to pre-warm the state when processing blocks. Can lead to 2x speedup in main loop block processing.", DefaultValue = "True")] bool PreWarmStateOnBlockProcessing { get; set; } + [ConfigItem(Description = "Block Production timeout, in milliseconds.", DefaultValue = "4000")] + int BlockProductionTimeoutMs { get; set; } + byte[] GetExtraDataBytes(); } diff --git a/src/Nethermind/Nethermind.Consensus/Producers/BlockProducerBase.cs b/src/Nethermind/Nethermind.Consensus/Producers/BlockProducerBase.cs index 94ae0ee38f0..d11d0190576 100644 --- a/src/Nethermind/Nethermind.Consensus/Producers/BlockProducerBase.cs +++ b/src/Nethermind/Nethermind.Consensus/Producers/BlockProducerBase.cs @@ -41,7 +41,7 @@ public abstract class BlockProducerBase : IBlockProducer private readonly IDifficultyCalculator _difficultyCalculator; protected readonly ISpecProvider _specProvider; private readonly ITxSource _txSource; - protected const int BlockProductionTimeout = 2000; + protected readonly int BlockProductionTimeoutMs; protected readonly SemaphoreSlim _producingBlockLock = new(1); protected ILogger Logger { get; } protected readonly IBlocksConfig _blocksConfig; @@ -70,6 +70,8 @@ protected BlockProducerBase( _difficultyCalculator = difficultyCalculator ?? throw new ArgumentNullException(nameof(difficultyCalculator)); Logger = logManager?.GetClassLogger() ?? throw new ArgumentNullException(nameof(logManager)); _blocksConfig = blocksConfig ?? throw new ArgumentNullException(nameof(blocksConfig)); + + BlockProductionTimeoutMs = _blocksConfig.BlockProductionTimeoutMs; } public async Task BuildBlock(BlockHeader? parentHeader = null, IBlockTracer? blockTracer = null, @@ -77,7 +79,7 @@ protected BlockProducerBase( { token ??= default; Block? block = null; - if (await _producingBlockLock.WaitAsync(BlockProductionTimeout, token.Value)) + if (await _producingBlockLock.WaitAsync(BlockProductionTimeoutMs, token.Value)) { try { diff --git a/src/Nethermind/Nethermind.Merge.Plugin/BlockProduction/PostMergeBlockProducer.cs b/src/Nethermind/Nethermind.Merge.Plugin/BlockProduction/PostMergeBlockProducer.cs index 16b69b24a1f..3c3e401de4d 100644 --- a/src/Nethermind/Nethermind.Merge.Plugin/BlockProduction/PostMergeBlockProducer.cs +++ b/src/Nethermind/Nethermind.Merge.Plugin/BlockProduction/PostMergeBlockProducer.cs @@ -54,7 +54,7 @@ public virtual Block PrepareEmptyBlock(BlockHeader parent, PayloadAttributes? pa blockHeader.Bloom = Bloom.Empty; var block = new Block(blockHeader, Array.Empty(), Array.Empty(), payloadAttributes?.Withdrawals); - if (_producingBlockLock.Wait(BlockProductionTimeout)) + if (_producingBlockLock.Wait(BlockProductionTimeoutMs)) { try { diff --git a/src/Nethermind/Nethermind.Optimism/OptimismPostMergeBlockProducer.cs b/src/Nethermind/Nethermind.Optimism/OptimismPostMergeBlockProducer.cs index 93df8a49f9c..3da889a982b 100644 --- a/src/Nethermind/Nethermind.Optimism/OptimismPostMergeBlockProducer.cs +++ b/src/Nethermind/Nethermind.Optimism/OptimismPostMergeBlockProducer.cs @@ -60,7 +60,7 @@ public override Block PrepareEmptyBlock(BlockHeader parent, PayloadAttributes? p Block block = new(blockHeader, txs, Array.Empty(), payloadAttributes?.Withdrawals); - if (_producingBlockLock.Wait(BlockProductionTimeout)) + if (_producingBlockLock.Wait(BlockProductionTimeoutMs)) { try { diff --git a/src/Nethermind/Nethermind.Runner.Test/ConfigFilesTests.cs b/src/Nethermind/Nethermind.Runner.Test/ConfigFilesTests.cs index f29cfabcf44..4034ab660c9 100644 --- a/src/Nethermind/Nethermind.Runner.Test/ConfigFilesTests.cs +++ b/src/Nethermind/Nethermind.Runner.Test/ConfigFilesTests.cs @@ -361,16 +361,18 @@ public void Arena_order_is_default(string configWildcard) Test(configWildcard, c => c.NettyArenaOrder, -1); } - [TestCase("chiado", 17_000_000L, 5UL)] - [TestCase("gnosis", 17_000_000L, 5UL)] + [TestCase("chiado", 17_000_000L, 5UL, 3000)] + [TestCase("gnosis", 17_000_000L, 5UL, 3000)] [TestCase("mainnet", 30_000_000L)] [TestCase("sepolia", 30_000_000L)] [TestCase("holesky", 30_000_000L)] [TestCase("^chiado ^gnosis ^mainnet ^sepolia ^holesky")] - public void Blocks_defaults_are_correct(string configWildcard, long? targetBlockGasLimit = null, ulong secondsPerSlot = 12) + public void Blocks_defaults_are_correct(string configWildcard, long? targetBlockGasLimit = null, ulong secondsPerSlot = 12, int blockProductionTimeout = 4000) { Test(configWildcard, c => c.TargetBlockGasLimit, targetBlockGasLimit); Test(configWildcard, c => c.SecondsPerSlot, secondsPerSlot); + Test(configWildcard, c => c.BlockProductionTimeoutMs, blockProductionTimeout); + } [Test] diff --git a/src/Nethermind/Nethermind.Runner/configs/chiado.cfg b/src/Nethermind/Nethermind.Runner/configs/chiado.cfg index 063329376f5..944d6513cd3 100644 --- a/src/Nethermind/Nethermind.Runner/configs/chiado.cfg +++ b/src/Nethermind/Nethermind.Runner/configs/chiado.cfg @@ -24,6 +24,7 @@ }, "Blocks": { "SecondsPerSlot": 5, + "BlockProductionTimeoutMs": 3000, "TargetBlockGasLimit": 17000000 }, "Aura": { @@ -43,4 +44,4 @@ 16 ] } -} \ No newline at end of file +} diff --git a/src/Nethermind/Nethermind.Runner/configs/chiado_archive.cfg b/src/Nethermind/Nethermind.Runner/configs/chiado_archive.cfg index 888f9d039f8..9d50f585634 100644 --- a/src/Nethermind/Nethermind.Runner/configs/chiado_archive.cfg +++ b/src/Nethermind/Nethermind.Runner/configs/chiado_archive.cfg @@ -22,6 +22,7 @@ }, "Blocks": { "SecondsPerSlot": 5, + "BlockProductionTimeoutMs": 3000, "TargetBlockGasLimit": 17000000 }, "Receipt": { diff --git a/src/Nethermind/Nethermind.Runner/configs/gnosis.cfg b/src/Nethermind/Nethermind.Runner/configs/gnosis.cfg index b828d7affd2..ef098f08e7b 100644 --- a/src/Nethermind/Nethermind.Runner/configs/gnosis.cfg +++ b/src/Nethermind/Nethermind.Runner/configs/gnosis.cfg @@ -21,6 +21,7 @@ }, "Blocks": { "SecondsPerSlot": 5, + "BlockProductionTimeoutMs": 3000, "TargetBlockGasLimit": 17000000 }, "Mining": { diff --git a/src/Nethermind/Nethermind.Runner/configs/gnosis_archive.cfg b/src/Nethermind/Nethermind.Runner/configs/gnosis_archive.cfg index f07093b3804..a963524e08b 100644 --- a/src/Nethermind/Nethermind.Runner/configs/gnosis_archive.cfg +++ b/src/Nethermind/Nethermind.Runner/configs/gnosis_archive.cfg @@ -15,6 +15,7 @@ }, "Blocks": { "SecondsPerSlot": 5, + "BlockProductionTimeoutMs": 3000, "TargetBlockGasLimit": 17000000 }, "Receipt": {