From f3f4a8c583d096f292b29cf097ba9376dc822844 Mon Sep 17 00:00:00 2001 From: ak88 Date: Fri, 24 Jan 2025 09:55:23 +0100 Subject: [PATCH 01/12] check init step for fail after await --- src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs b/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs index 04a1c3fd309..959c00696eb 100644 --- a/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs +++ b/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs @@ -96,6 +96,7 @@ public async Task InitializeAll(CancellationToken cancellationToken) } await Task.WhenAll(_allPending); + ReviewFailedAndThrow(); } private readonly ConcurrentQueue _allPending = new(); From e21241fd62a092aa3e08eabf4a62b6e593c994d9 Mon Sep 17 00:00:00 2001 From: ak88 Date: Thu, 30 Jan 2025 22:51:01 +0100 Subject: [PATCH 02/12] refactor init steps to tasks --- .../InitDatabaseSnapshot.cs | 4 +- .../Nethermind.Init/InitializeStateDb.cs | 4 +- .../Nethermind.Init/Steps/ApplyMemoryHint.cs | 4 +- .../Steps/DatabaseMigrations.cs | 4 +- .../Nethermind.Init/Steps/EraStep.cs | 4 +- .../Steps/EthereumStepsManager.cs | 78 ++++++++----------- .../Nethermind.Init/Steps/FilterBootnodes.cs | 4 +- .../Steps/IEthereumRunnerStep.cs | 6 +- .../Nethermind.Init/Steps/InitCrypto.cs | 4 +- .../Nethermind.Init/Steps/InitDatabase.cs | 4 +- .../Nethermind.Init/Steps/InitStep.cs | 38 +++++++++ .../Steps/InitTxTypesAndRlp.cs | 4 +- .../Steps/InitializeBlockProducer.cs | 4 +- .../Steps/InitializeBlockTree.cs | 4 +- .../Steps/InitializeBlockchain.cs | 4 +- .../Steps/InitializeNetwork.cs | 4 +- .../Steps/InitializeNodeStats.cs | 4 +- .../Steps/InitializePlugins.cs | 4 +- .../Steps/InitializePrecompiles.cs | 4 +- .../Nethermind.Init/Steps/LoadGenesisBlock.cs | 4 +- .../Nethermind.Init/Steps/LogHardwareInfo.cs | 4 +- .../Nethermind.Init/Steps/MigrateConfigs.cs | 4 +- .../Steps/RegisterPluginRpcModules.cs | 4 +- .../Steps/RegisterRpcModules.cs | 4 +- .../Nethermind.Init/Steps/ResolveIps.cs | 4 +- .../Nethermind.Init/Steps/ReviewBlockTree.cs | 4 +- .../Nethermind.Init/Steps/SetupKeyStore.cs | 4 +- .../Steps/StartBlockProcessor.cs | 4 +- .../Steps/StartBlockProducer.cs | 4 +- .../Nethermind.Init/Steps/StartLogProducer.cs | 4 +- .../Nethermind.Init/Steps/StartMonitoring.cs | 4 +- .../Nethermind.Init/Steps/StepInfo.cs | 2 + .../Steps/UpdateDiscoveryConfig.cs | 4 +- .../Steps/EthereumStepsManagerTests.cs | 22 ++++-- .../Ethereum/Steps/RegisterRpcModulesTests.cs | 4 +- .../Ethereum/Steps/StartGrpc.cs | 4 +- .../Ethereum/Steps/StartRpc.cs | 4 +- 37 files changed, 155 insertions(+), 119 deletions(-) create mode 100644 src/Nethermind/Nethermind.Init/Steps/InitStep.cs diff --git a/src/Nethermind/Nethermind.Init.Snapshot/InitDatabaseSnapshot.cs b/src/Nethermind/Nethermind.Init.Snapshot/InitDatabaseSnapshot.cs index f15a56c24c6..011a5491448 100644 --- a/src/Nethermind/Nethermind.Init.Snapshot/InitDatabaseSnapshot.cs +++ b/src/Nethermind/Nethermind.Init.Snapshot/InitDatabaseSnapshot.cs @@ -25,7 +25,7 @@ public InitDatabaseSnapshot(INethermindApi api) : base(api) _logger = _api.LogManager.GetClassLogger(); } - public override async Task Execute(CancellationToken cancellationToken) + protected override async Task Setup(CancellationToken cancellationToken) { switch (_api.Config().DiagnosticMode) { @@ -38,7 +38,7 @@ public override async Task Execute(CancellationToken cancellationToken) break; } - await base.Execute(cancellationToken); + await base.Setup(cancellationToken); } private async Task InitDbFromSnapshot(CancellationToken cancellationToken) diff --git a/src/Nethermind/Nethermind.Init/InitializeStateDb.cs b/src/Nethermind/Nethermind.Init/InitializeStateDb.cs index 565dc25a38b..f5141591274 100644 --- a/src/Nethermind/Nethermind.Init/InitializeStateDb.cs +++ b/src/Nethermind/Nethermind.Init/InitializeStateDb.cs @@ -31,7 +31,7 @@ namespace Nethermind.Init; [RunnerStepDependencies(typeof(InitializePlugins), typeof(InitializeBlockTree), typeof(SetupKeyStore))] -public class InitializeStateDb : IStep +public class InitializeStateDb : InitStep, IStep { private readonly INethermindApi _api; private ILogger _logger; @@ -41,7 +41,7 @@ public InitializeStateDb(INethermindApi api) _api = api; } - public Task Execute(CancellationToken cancellationToken) + protected override Task Setup(CancellationToken _) { InitBlockTraceDumper(); diff --git a/src/Nethermind/Nethermind.Init/Steps/ApplyMemoryHint.cs b/src/Nethermind/Nethermind.Init/Steps/ApplyMemoryHint.cs index d9a279eb78f..3f413644b7a 100644 --- a/src/Nethermind/Nethermind.Init/Steps/ApplyMemoryHint.cs +++ b/src/Nethermind/Nethermind.Init/Steps/ApplyMemoryHint.cs @@ -13,7 +13,7 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies(typeof(MigrateConfigs))] - public sealed class ApplyMemoryHint : IStep + public sealed class ApplyMemoryHint : InitStep, IStep { private readonly INethermindApi _api; private readonly IInitConfig _initConfig; @@ -32,7 +32,7 @@ public ApplyMemoryHint(INethermindApi api) _txPoolConfig = api.Config(); } - public Task Execute(CancellationToken _) + protected override Task Setup(CancellationToken _) { MemoryHintMan memoryHintMan = new(_api.LogManager); uint cpuCount = (uint)Environment.ProcessorCount; diff --git a/src/Nethermind/Nethermind.Init/Steps/DatabaseMigrations.cs b/src/Nethermind/Nethermind.Init/Steps/DatabaseMigrations.cs index fb05dfaf61a..1365f45804e 100644 --- a/src/Nethermind/Nethermind.Init/Steps/DatabaseMigrations.cs +++ b/src/Nethermind/Nethermind.Init/Steps/DatabaseMigrations.cs @@ -11,7 +11,7 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies(typeof(InitTxTypesAndRlp), typeof(InitDatabase), typeof(InitializeBlockchain), typeof(InitializeNetwork))] - public sealed class DatabaseMigrations : IStep + public sealed class DatabaseMigrations : InitStep, IStep { private readonly IApiWithNetwork _api; @@ -20,7 +20,7 @@ public DatabaseMigrations(INethermindApi api) _api = api; } - public async Task Execute(CancellationToken cancellationToken) + protected override async Task Setup(CancellationToken cancellationToken) { foreach (IDatabaseMigration migration in CreateMigrations()) { diff --git a/src/Nethermind/Nethermind.Init/Steps/EraStep.cs b/src/Nethermind/Nethermind.Init/Steps/EraStep.cs index 5f8241bee39..a7b63a5e86e 100644 --- a/src/Nethermind/Nethermind.Init/Steps/EraStep.cs +++ b/src/Nethermind/Nethermind.Init/Steps/EraStep.cs @@ -12,7 +12,7 @@ namespace Nethermind.Init.Steps; [RunnerStepDependencies(typeof(InitializeBlockchain), typeof(LoadGenesisBlock))] -public class EraStep : IStep +public class EraStep : InitStep, IStep { protected readonly INethermindApi _api; @@ -21,7 +21,7 @@ public EraStep(INethermindApi api) _api = api; } - public async Task Execute(CancellationToken cancellationToken) + protected override async Task Setup(CancellationToken cancellationToken) { IContainer container = _api.ConfigureContainerBuilderFromApiWithBlockchain(new ContainerBuilder()) .AddModule(new EraModule()) diff --git a/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs b/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs index 959c00696eb..f4779191589 100644 --- a/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs +++ b/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs @@ -37,6 +37,8 @@ public EthereumStepsManager( _allSteps = loader.LoadSteps(_api.GetType()).ToList(); _allStepsByBaseType = _allSteps.ToDictionary(static s => s.StepBaseType, static s => s); + + _logger.Info("" + string.Join(Environment.NewLine, _allSteps.Select((s) => s.ToString()))); } private async Task ReviewDependencies(CancellationToken cancellationToken) @@ -86,72 +88,61 @@ private async Task ReviewDependencies(CancellationToken cancellationToken) public async Task InitializeAll(CancellationToken cancellationToken) { - while (_allSteps.Any(static s => s.Stage != StepInitializationStage.Complete)) - { - cancellationToken.ThrowIfCancellationRequested(); + RunOneRoundOfInitialization(cancellationToken); - RunOneRoundOfInitialization(cancellationToken); - await ReviewDependencies(cancellationToken); - ReviewFailedAndThrow(); - } - - await Task.WhenAll(_allPending); - ReviewFailedAndThrow(); + Task current; + do + { + current = await Task.WhenAny(_allRequiredSteps); + ReviewFailedAndThrow(current); + _allRequiredSteps.Remove(current); + } while (_allRequiredSteps.Any(s => !s.IsCompleted)); } - private readonly ConcurrentQueue _allPending = new(); + private readonly List _allRequiredSteps = new(); private void RunOneRoundOfInitialization(CancellationToken cancellationToken) { - int startedThisRound = 0; + Dictionary createdSteps = []; + foreach (StepInfo stepInfo in _allSteps) { cancellationToken.ThrowIfCancellationRequested(); - if (stepInfo.Stage != StepInitializationStage.WaitingForExecution) - { - continue; - } - IStep? step = CreateStepInstance(stepInfo); if (step is null) { if (_logger.IsError) _logger.Error($"Unable to create instance of Ethereum runner step {stepInfo}"); continue; } + createdSteps.Add(step.GetType(), step); + } - if (_logger.IsDebug) _logger.Debug($"Executing step: {stepInfo}"); - - stepInfo.Stage = StepInitializationStage.Executing; - startedThisRound++; - Task task = ExecuteStep(step, stepInfo, cancellationToken); - - if (step.MustInitialize) - { - _allPending.Enqueue(task); - } - else + foreach (StepInfo stepInfo in _allSteps) + { + if (!createdSteps.ContainsKey(stepInfo.StepType)) { - stepInfo.Stage = StepInitializationStage.Complete; + throw new StepDependencyException($"Initialization failed because {stepInfo} could not be created."); } - } + IStep step = createdSteps[stepInfo.StepType]; + + Task task = ExecuteStep(step, stepInfo, createdSteps, cancellationToken); + if (_logger.IsDebug) _logger.Debug($"Executing step: {stepInfo}"); - if (startedThisRound == 0 && _allPending.All(static t => t.IsCompleted)) - { - Interlocked.Increment(ref _foreverLoop); - if (_foreverLoop > 100) + if (step.MustInitialize) { - if (_logger.IsWarn) _logger.Warn($"Didn't start any initialization steps during initialization round and all previous steps are already completed."); + _allRequiredSteps.Add(task); } } } - private async Task ExecuteStep(IStep step, StepInfo stepInfo, CancellationToken cancellationToken) + private async Task ExecuteStep(IStep step, StepInfo stepInfo, Dictionary steps, CancellationToken cancellationToken) { long startTime = Stopwatch.GetTimestamp(); try { - await step.Execute(cancellationToken); + IEnumerable dependencies = stepInfo.Dependencies.Select(t => steps[t].StepCompleted); + await step.Execute(dependencies, cancellationToken); if (_logger.IsDebug) _logger.Debug( @@ -159,7 +150,7 @@ private async Task ExecuteStep(IStep step, StepInfo stepInfo, CancellationToken stepInfo.Stage = StepInitializationStage.Complete; } - catch (Exception exception) + catch (Exception exception) when (exception is not TaskCanceledException) { if (step.MustInitialize) { @@ -181,8 +172,6 @@ private async Task ExecuteStep(IStep step, StepInfo stepInfo, CancellationToken } finally { - _autoResetEvent.Set(); - if (_logger.IsDebug) _logger.Debug($"{step.GetType().Name,-24} complete"); } } @@ -202,13 +191,10 @@ private async Task ExecuteStep(IStep step, StepInfo stepInfo, CancellationToken return step; } - private int _foreverLoop; - - private void ReviewFailedAndThrow() + private void ReviewFailedAndThrow(Task task) { - Task? anyFaulted = _allPending.FirstOrDefault(static t => t.IsFaulted); - if (anyFaulted?.IsFaulted == true && anyFaulted?.Exception is not null) - ExceptionDispatchInfo.Capture(anyFaulted.Exception.GetBaseException()).Throw(); + if (task?.IsFaulted == true && task?.Exception is not null) + ExceptionDispatchInfo.Capture(task.Exception.GetBaseException()).Throw(); } } } diff --git a/src/Nethermind/Nethermind.Init/Steps/FilterBootnodes.cs b/src/Nethermind/Nethermind.Init/Steps/FilterBootnodes.cs index c75d83fdb28..dac537ac8fc 100644 --- a/src/Nethermind/Nethermind.Init/Steps/FilterBootnodes.cs +++ b/src/Nethermind/Nethermind.Init/Steps/FilterBootnodes.cs @@ -9,7 +9,7 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies(typeof(SetupKeyStore))] - public class FilterBootnodes : IStep + public class FilterBootnodes : InitStep, IStep { private readonly IApiWithStores _api; @@ -18,7 +18,7 @@ public FilterBootnodes(INethermindApi api) _api = api; } - public Task Execute(CancellationToken _) + protected override Task Setup(CancellationToken _) { if (_api.ChainSpec is null) { diff --git a/src/Nethermind/Nethermind.Init/Steps/IEthereumRunnerStep.cs b/src/Nethermind/Nethermind.Init/Steps/IEthereumRunnerStep.cs index df856ac2e03..1e7d3c79913 100644 --- a/src/Nethermind/Nethermind.Init/Steps/IEthereumRunnerStep.cs +++ b/src/Nethermind/Nethermind.Init/Steps/IEthereumRunnerStep.cs @@ -1,6 +1,7 @@ // SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited // SPDX-License-Identifier: LGPL-3.0-only +using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; @@ -8,8 +9,9 @@ namespace Nethermind.Init.Steps { public interface IStep { - Task Execute(CancellationToken cancellationToken); - + Task StepCompleted { get; } + Task Execute(CancellationToken cancellationToken) => Execute([], cancellationToken); + Task Execute(IEnumerable dependentSteps, CancellationToken cancellationToken); public bool MustInitialize => true; } } diff --git a/src/Nethermind/Nethermind.Init/Steps/InitCrypto.cs b/src/Nethermind/Nethermind.Init/Steps/InitCrypto.cs index 51d51c4e18a..99341d3a922 100644 --- a/src/Nethermind/Nethermind.Init/Steps/InitCrypto.cs +++ b/src/Nethermind/Nethermind.Init/Steps/InitCrypto.cs @@ -10,7 +10,7 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies(typeof(InitTxTypesAndRlp))] - public class InitCrypto : IStep + public class InitCrypto : InitStep, IStep { private readonly IBasicApi _api; @@ -20,7 +20,7 @@ public InitCrypto(INethermindApi api) } [Todo(Improve.Refactor, "Automatically scan all the references solutions?")] - public virtual Task Execute(CancellationToken _) + protected override Task Setup(CancellationToken _) { _api.EthereumEcdsa = new EthereumEcdsa(_api.SpecProvider!.ChainId); return Task.CompletedTask; diff --git a/src/Nethermind/Nethermind.Init/Steps/InitDatabase.cs b/src/Nethermind/Nethermind.Init/Steps/InitDatabase.cs index e14ffa68232..d61c85b5aa2 100644 --- a/src/Nethermind/Nethermind.Init/Steps/InitDatabase.cs +++ b/src/Nethermind/Nethermind.Init/Steps/InitDatabase.cs @@ -21,7 +21,7 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies(typeof(ApplyMemoryHint))] - public class InitDatabase : IStep + public class InitDatabase : InitStep, IStep { private readonly INethermindApi _api; @@ -30,7 +30,7 @@ public InitDatabase(INethermindApi api) _api = api; } - public virtual async Task Execute(CancellationToken _) + protected override async Task Setup(CancellationToken cancellationToken) { ILogger logger = _api.LogManager.GetClassLogger(); diff --git a/src/Nethermind/Nethermind.Init/Steps/InitStep.cs b/src/Nethermind/Nethermind.Init/Steps/InitStep.cs new file mode 100644 index 00000000000..4810a8c78ce --- /dev/null +++ b/src/Nethermind/Nethermind.Init/Steps/InitStep.cs @@ -0,0 +1,38 @@ +// SPDX-FileCopyrightText: 2025 Demerzel Solutions Limited +// SPDX-License-Identifier: LGPL-3.0-only + +using MathNet.Numerics.Differentiation; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Nethermind.Init.Steps; +public abstract class InitStep +{ + public Task StepCompleted { private set; get; } + + private TaskCompletionSource _taskCompletedSource = new TaskCompletionSource(); + public InitStep() + { + StepCompleted = _taskCompletedSource.Task; + } + + public async Task Execute(IEnumerable dependentSteps, CancellationToken cancellationToken) + { + cancellationToken.Register(()=> _taskCompletedSource.TrySetCanceled()); + + await Task.WhenAll(dependentSteps); + await Setup(cancellationToken); + SignalStepCompleted(); + } + + protected void SignalStepCompleted() + { + _taskCompletedSource.SetResult(); + } + + protected abstract Task Setup(CancellationToken cancellationToken); +} diff --git a/src/Nethermind/Nethermind.Init/Steps/InitTxTypesAndRlp.cs b/src/Nethermind/Nethermind.Init/Steps/InitTxTypesAndRlp.cs index f96f35c1fbb..a3cdd9d6b9c 100644 --- a/src/Nethermind/Nethermind.Init/Steps/InitTxTypesAndRlp.cs +++ b/src/Nethermind/Nethermind.Init/Steps/InitTxTypesAndRlp.cs @@ -15,12 +15,12 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies(typeof(ApplyMemoryHint))] - public class InitTxTypesAndRlp(INethermindApi api) : IStep + public class InitTxTypesAndRlp(INethermindApi api) : InitStep, IStep { private readonly INethermindApi _api = api ?? throw new ArgumentNullException(nameof(api)); [Todo(Improve.Refactor, "Automatically scan all the references solutions?")] - public virtual Task Execute(CancellationToken _) + protected override Task Setup(CancellationToken cancellationToken) { if (_api.SpecProvider is null) throw new StepDependencyException(nameof(_api.SpecProvider)); diff --git a/src/Nethermind/Nethermind.Init/Steps/InitializeBlockProducer.cs b/src/Nethermind/Nethermind.Init/Steps/InitializeBlockProducer.cs index e6abb1deef9..8691be00b0e 100644 --- a/src/Nethermind/Nethermind.Init/Steps/InitializeBlockProducer.cs +++ b/src/Nethermind/Nethermind.Init/Steps/InitializeBlockProducer.cs @@ -15,7 +15,7 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies(typeof(StartBlockProcessor), typeof(SetupKeyStore), typeof(InitializeNetwork), typeof(ReviewBlockTree))] - public class InitializeBlockProducer : IStep + public class InitializeBlockProducer : InitStep, IStep { private readonly IApiWithBlockchain _api; @@ -24,7 +24,7 @@ public InitializeBlockProducer(INethermindApi api) _api = api; } - public Task Execute(CancellationToken _) + protected override Task Setup(CancellationToken _) { if (_api.BlockProductionPolicy!.ShouldStartBlockProduction()) { diff --git a/src/Nethermind/Nethermind.Init/Steps/InitializeBlockTree.cs b/src/Nethermind/Nethermind.Init/Steps/InitializeBlockTree.cs index 57953c0a226..3c096d43b53 100644 --- a/src/Nethermind/Nethermind.Init/Steps/InitializeBlockTree.cs +++ b/src/Nethermind/Nethermind.Init/Steps/InitializeBlockTree.cs @@ -21,7 +21,7 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies(typeof(InitTxTypesAndRlp), typeof(InitDatabase), typeof(MigrateConfigs), typeof(SetupKeyStore))] - public class InitializeBlockTree : IStep + public class InitializeBlockTree : InitStep, IStep { private readonly IBasicApi _get; private readonly IApiWithStores _set; @@ -31,7 +31,7 @@ public InitializeBlockTree(INethermindApi api) (_get, _set) = api.ForInit; } - public Task Execute(CancellationToken cancellationToken) + protected override Task Setup(CancellationToken cancellationToken) { IInitConfig initConfig = _get.Config(); IBloomConfig bloomConfig = _get.Config(); diff --git a/src/Nethermind/Nethermind.Init/Steps/InitializeBlockchain.cs b/src/Nethermind/Nethermind.Init/Steps/InitializeBlockchain.cs index 111481a5a22..59ed3fc88e3 100644 --- a/src/Nethermind/Nethermind.Init/Steps/InitializeBlockchain.cs +++ b/src/Nethermind/Nethermind.Init/Steps/InitializeBlockchain.cs @@ -37,7 +37,7 @@ namespace Nethermind.Init.Steps typeof(SetupKeyStore), typeof(InitializePrecompiles) )] - public class InitializeBlockchain : IStep + public class InitializeBlockchain : InitStep, IStep { private readonly INethermindApi _api; @@ -47,7 +47,7 @@ public InitializeBlockchain(INethermindApi api) _api = api; } - public async Task Execute(CancellationToken _) + protected override async Task Setup(CancellationToken _) { await InitBlockchain(); } diff --git a/src/Nethermind/Nethermind.Init/Steps/InitializeNetwork.cs b/src/Nethermind/Nethermind.Init/Steps/InitializeNetwork.cs index 9e55e90f3c9..018e56b306c 100644 --- a/src/Nethermind/Nethermind.Init/Steps/InitializeNetwork.cs +++ b/src/Nethermind/Nethermind.Init/Steps/InitializeNetwork.cs @@ -58,7 +58,7 @@ public static long Estimate(uint arenaCount, int arenaOrder) typeof(InitializePlugins), typeof(EraStep), typeof(InitializeBlockchain))] -public class InitializeNetwork : IStep +public class InitializeNetwork : InitStep, IStep { public const string PeersDbPath = "peers"; @@ -75,7 +75,7 @@ public InitializeNetwork(INethermindApi api) _syncConfig = _api.Config(); } - public async Task Execute(CancellationToken cancellationToken) + protected override async Task Setup(CancellationToken cancellationToken) { await Initialize(cancellationToken); } diff --git a/src/Nethermind/Nethermind.Init/Steps/InitializeNodeStats.cs b/src/Nethermind/Nethermind.Init/Steps/InitializeNodeStats.cs index ddf6d80d99f..1c704a35360 100644 --- a/src/Nethermind/Nethermind.Init/Steps/InitializeNodeStats.cs +++ b/src/Nethermind/Nethermind.Init/Steps/InitializeNodeStats.cs @@ -10,7 +10,7 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies] - public class InitializeNodeStats : IStep + public class InitializeNodeStats : InitStep, IStep { private readonly IApiWithNetwork _api; @@ -19,7 +19,7 @@ public InitializeNodeStats(INethermindApi api) _api = api; } - public Task Execute(CancellationToken _) + protected override Task Setup(CancellationToken cancellationToken) { INetworkConfig config = _api.Config(); diff --git a/src/Nethermind/Nethermind.Init/Steps/InitializePlugins.cs b/src/Nethermind/Nethermind.Init/Steps/InitializePlugins.cs index 122ba122348..2772cdcd1ed 100644 --- a/src/Nethermind/Nethermind.Init/Steps/InitializePlugins.cs +++ b/src/Nethermind/Nethermind.Init/Steps/InitializePlugins.cs @@ -12,7 +12,7 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies(typeof(InitializeBlockTree))] - public class InitializePlugins : IStep + public class InitializePlugins : InitStep, IStep { private readonly INethermindApi _api; @@ -21,7 +21,7 @@ public InitializePlugins(INethermindApi api) _api = api; } - public async Task Execute(CancellationToken cancellationToken) + protected override async Task Setup(CancellationToken cancellationToken) { ILogger logger = _api.LogManager.GetClassLogger(); if (logger.IsInfo) logger.Info($"Initializing {_api.Plugins.Count} plugins"); diff --git a/src/Nethermind/Nethermind.Init/Steps/InitializePrecompiles.cs b/src/Nethermind/Nethermind.Init/Steps/InitializePrecompiles.cs index 37b1706f28e..9ea4924f9a5 100644 --- a/src/Nethermind/Nethermind.Init/Steps/InitializePrecompiles.cs +++ b/src/Nethermind/Nethermind.Init/Steps/InitializePrecompiles.cs @@ -11,7 +11,7 @@ namespace Nethermind.Init.Steps; -public class InitializePrecompiles : IStep +public class InitializePrecompiles : InitStep, IStep { private readonly INethermindApi _api; @@ -20,7 +20,7 @@ public InitializePrecompiles(INethermindApi api) _api = api; } - public async Task Execute(CancellationToken cancellationToken) + protected override async Task Setup(CancellationToken cancellationToken) { if (_api.SpecProvider!.GetFinalSpec().IsEip4844Enabled) { diff --git a/src/Nethermind/Nethermind.Init/Steps/LoadGenesisBlock.cs b/src/Nethermind/Nethermind.Init/Steps/LoadGenesisBlock.cs index cfb92fbcc97..4d60c976044 100644 --- a/src/Nethermind/Nethermind.Init/Steps/LoadGenesisBlock.cs +++ b/src/Nethermind/Nethermind.Init/Steps/LoadGenesisBlock.cs @@ -15,7 +15,7 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies(typeof(StartBlockProcessor), typeof(InitializeBlockchain), typeof(InitializePlugins))] - public class LoadGenesisBlock : IStep + public class LoadGenesisBlock : InitStep, IStep { private readonly IApiWithBlockchain _api; private readonly ILogger _logger; @@ -29,7 +29,7 @@ public LoadGenesisBlock(INethermindApi api) _genesisProcessedTimeout = TimeSpan.FromMilliseconds(_api.Config().GenesisTimeoutMs); } - public async Task Execute(CancellationToken _) + protected override async Task Setup(CancellationToken _) { _initConfig = _api.Config(); Hash256? expectedGenesisHash = string.IsNullOrWhiteSpace(_initConfig.GenesisHash) ? null : new Hash256(_initConfig.GenesisHash); diff --git a/src/Nethermind/Nethermind.Init/Steps/LogHardwareInfo.cs b/src/Nethermind/Nethermind.Init/Steps/LogHardwareInfo.cs index 3132f1b30ba..4405aece7dd 100644 --- a/src/Nethermind/Nethermind.Init/Steps/LogHardwareInfo.cs +++ b/src/Nethermind/Nethermind.Init/Steps/LogHardwareInfo.cs @@ -9,7 +9,7 @@ namespace Nethermind.Init.Steps; -public class LogHardwareInfo : IStep +public class LogHardwareInfo : InitStep, IStep { private readonly ILogger _logger; @@ -20,7 +20,7 @@ public LogHardwareInfo(INethermindApi api) _logger = api.LogManager.GetClassLogger(); } - public Task Execute(CancellationToken cancellationToken) + protected override Task Setup(CancellationToken _) { if (!_logger.IsInfo) return Task.CompletedTask; diff --git a/src/Nethermind/Nethermind.Init/Steps/MigrateConfigs.cs b/src/Nethermind/Nethermind.Init/Steps/MigrateConfigs.cs index 7b38dc42ae9..41f0bdcc8b0 100644 --- a/src/Nethermind/Nethermind.Init/Steps/MigrateConfigs.cs +++ b/src/Nethermind/Nethermind.Init/Steps/MigrateConfigs.cs @@ -12,7 +12,7 @@ namespace Nethermind.Init.Steps { - public class MigrateConfigs : IStep + public class MigrateConfigs : InitStep, IStep { private readonly INethermindApi _api; @@ -21,7 +21,7 @@ public MigrateConfigs(INethermindApi api) _api = api; } - public Task Execute(CancellationToken cancellationToken) + protected override Task Setup(CancellationToken _) { IMiningConfig miningConfig = _api.Config(); IReceiptConfig receiptConfig = _api.Config(); diff --git a/src/Nethermind/Nethermind.Init/Steps/RegisterPluginRpcModules.cs b/src/Nethermind/Nethermind.Init/Steps/RegisterPluginRpcModules.cs index 84dccd3ea34..a191ae9e515 100644 --- a/src/Nethermind/Nethermind.Init/Steps/RegisterPluginRpcModules.cs +++ b/src/Nethermind/Nethermind.Init/Steps/RegisterPluginRpcModules.cs @@ -11,7 +11,7 @@ namespace Nethermind.Init.Steps; [RunnerStepDependencies(typeof(InitializeNetwork), typeof(SetupKeyStore), typeof(InitializeBlockchain), typeof(InitializePlugins), typeof(InitializeBlockProducer), typeof(RegisterRpcModules))] -public class RegisterPluginRpcModules : IStep +public class RegisterPluginRpcModules : InitStep, IStep { private readonly INethermindApi _api; @@ -20,7 +20,7 @@ public RegisterPluginRpcModules(INethermindApi api) _api = api; } - public virtual async Task Execute(CancellationToken cancellationToken) + protected override async Task Setup(CancellationToken cancellationToken) { IRpcModuleProvider rpcModuleProvider = _api.RpcModuleProvider!; diff --git a/src/Nethermind/Nethermind.Init/Steps/RegisterRpcModules.cs b/src/Nethermind/Nethermind.Init/Steps/RegisterRpcModules.cs index 926181193dd..7a62af6ce62 100644 --- a/src/Nethermind/Nethermind.Init/Steps/RegisterRpcModules.cs +++ b/src/Nethermind/Nethermind.Init/Steps/RegisterRpcModules.cs @@ -33,7 +33,7 @@ namespace Nethermind.Init.Steps; [RunnerStepDependencies(typeof(InitializeNetwork), typeof(SetupKeyStore), typeof(InitializeBlockchain), typeof(InitializePlugins))] -public class RegisterRpcModules : IStep +public class RegisterRpcModules : InitStep, IStep { private readonly INethermindApi _api; protected readonly IJsonRpcConfig _jsonRpcConfig; @@ -44,7 +44,7 @@ public RegisterRpcModules(INethermindApi api) _jsonRpcConfig = _api.Config(); } - public virtual async Task Execute(CancellationToken cancellationToken) + protected override async Task Setup(CancellationToken cancellationToken) { StepDependencyException.ThrowIfNull(_api.BlockTree); StepDependencyException.ThrowIfNull(_api.ReceiptFinder); diff --git a/src/Nethermind/Nethermind.Init/Steps/ResolveIps.cs b/src/Nethermind/Nethermind.Init/Steps/ResolveIps.cs index 20eb9c09685..0eaf5b13003 100644 --- a/src/Nethermind/Nethermind.Init/Steps/ResolveIps.cs +++ b/src/Nethermind/Nethermind.Init/Steps/ResolveIps.cs @@ -11,7 +11,7 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies] - public class ResolveIps : IStep + public class ResolveIps : InitStep, IStep { private readonly IApiWithNetwork _api; @@ -21,7 +21,7 @@ public ResolveIps(INethermindApi api) } [Todo(Improve.Refactor, "Automatically scan all the references solutions?")] - public virtual async Task Execute(CancellationToken _) + protected override async Task Setup(CancellationToken cancellationToken) { // this should be outside of Ethereum Runner I guess INetworkConfig networkConfig = _api.Config(); diff --git a/src/Nethermind/Nethermind.Init/Steps/ReviewBlockTree.cs b/src/Nethermind/Nethermind.Init/Steps/ReviewBlockTree.cs index b75a4fc9cb9..c98cf297b87 100644 --- a/src/Nethermind/Nethermind.Init/Steps/ReviewBlockTree.cs +++ b/src/Nethermind/Nethermind.Init/Steps/ReviewBlockTree.cs @@ -11,7 +11,7 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies(typeof(StartBlockProcessor), (typeof(InitializeNetwork)))] - public class ReviewBlockTree : IStep + public class ReviewBlockTree : InitStep, IStep { private readonly IApiWithBlockchain _api; private readonly ILogger _logger; @@ -22,7 +22,7 @@ public ReviewBlockTree(INethermindApi api) _logger = _api.LogManager.GetClassLogger(); } - public Task Execute(CancellationToken cancellationToken) + protected override Task Setup(CancellationToken cancellationToken) { if (_api.BlockTree is null) throw new StepDependencyException(nameof(_api.DbProvider)); diff --git a/src/Nethermind/Nethermind.Init/Steps/SetupKeyStore.cs b/src/Nethermind/Nethermind.Init/Steps/SetupKeyStore.cs index 9db80d00fa3..ee22f367212 100644 --- a/src/Nethermind/Nethermind.Init/Steps/SetupKeyStore.cs +++ b/src/Nethermind/Nethermind.Init/Steps/SetupKeyStore.cs @@ -16,7 +16,7 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies(typeof(ResolveIps))] - public class SetupKeyStore : IStep + public class SetupKeyStore : InitStep, IStep { private readonly IApiWithBlockchain _api; @@ -25,7 +25,7 @@ public SetupKeyStore(INethermindApi api) _api = api; } - public async Task Execute(CancellationToken cancellationToken) + protected override async Task Setup(CancellationToken cancellationToken) { (IApiWithStores get, IApiWithBlockchain set) = _api.ForInit; // why is the await Task.Run here? diff --git a/src/Nethermind/Nethermind.Init/Steps/StartBlockProcessor.cs b/src/Nethermind/Nethermind.Init/Steps/StartBlockProcessor.cs index 129888475d6..bf76563a70f 100644 --- a/src/Nethermind/Nethermind.Init/Steps/StartBlockProcessor.cs +++ b/src/Nethermind/Nethermind.Init/Steps/StartBlockProcessor.cs @@ -8,7 +8,7 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies(typeof(InitializeBlockchain))] - public class StartBlockProcessor : IStep + public class StartBlockProcessor : InitStep, IStep { private readonly IApiWithBlockchain _api; @@ -17,7 +17,7 @@ public StartBlockProcessor(INethermindApi api) _api = api; } - public Task Execute(CancellationToken _) + protected override Task Setup(CancellationToken cancellationToken) { if (_api.BlockchainProcessor is null) { diff --git a/src/Nethermind/Nethermind.Init/Steps/StartBlockProducer.cs b/src/Nethermind/Nethermind.Init/Steps/StartBlockProducer.cs index 652b3ec29ea..8c3bb524253 100644 --- a/src/Nethermind/Nethermind.Init/Steps/StartBlockProducer.cs +++ b/src/Nethermind/Nethermind.Init/Steps/StartBlockProducer.cs @@ -11,7 +11,7 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies(typeof(InitializeBlockProducer), typeof(ReviewBlockTree), typeof(InitializePrecompiles))] // Unfortunately EngineRPC API need review blockTree - public class StartBlockProducer : IStep + public class StartBlockProducer : InitStep, IStep { private readonly IApiWithBlockchain _api; @@ -20,7 +20,7 @@ public StartBlockProducer(INethermindApi api) _api = api; } - public Task Execute(CancellationToken _) + protected override Task Setup(CancellationToken cancellationToken) { if (_api.BlockProductionPolicy!.ShouldStartBlockProduction() && _api.BlockProducer is not null) { diff --git a/src/Nethermind/Nethermind.Init/Steps/StartLogProducer.cs b/src/Nethermind/Nethermind.Init/Steps/StartLogProducer.cs index 94648de3bc1..ad791308c8f 100644 --- a/src/Nethermind/Nethermind.Init/Steps/StartLogProducer.cs +++ b/src/Nethermind/Nethermind.Init/Steps/StartLogProducer.cs @@ -9,7 +9,7 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies(typeof(StartBlockProcessor))] - public class StartLogProducer : IStep + public class StartLogProducer : InitStep, IStep { private readonly INethermindApi _api; @@ -18,7 +18,7 @@ public StartLogProducer(INethermindApi api) _api = api; } - public Task Execute(CancellationToken cancellationToken) + protected override Task Setup(CancellationToken cancellationToken) { // TODO: this should be configure in init maybe? LogPublisher logPublisher = new LogPublisher(_api.EthereumJsonSerializer!, _api.LogManager); diff --git a/src/Nethermind/Nethermind.Init/Steps/StartMonitoring.cs b/src/Nethermind/Nethermind.Init/Steps/StartMonitoring.cs index a8d83d277b3..8e955716150 100644 --- a/src/Nethermind/Nethermind.Init/Steps/StartMonitoring.cs +++ b/src/Nethermind/Nethermind.Init/Steps/StartMonitoring.cs @@ -17,7 +17,7 @@ namespace Nethermind.Init.Steps; [RunnerStepDependencies(typeof(InitializeNetwork))] -public class StartMonitoring : IStep +public class StartMonitoring : InitStep, IStep { private readonly IApiWithNetwork _api; private readonly ILogger _logger; @@ -30,7 +30,7 @@ public StartMonitoring(INethermindApi api) _metricsConfig = _api.Config(); } - public async Task Execute(CancellationToken cancellationToken) + protected override async Task Setup(CancellationToken cancellationToken) { // hacky if (!string.IsNullOrEmpty(_metricsConfig.NodeName)) diff --git a/src/Nethermind/Nethermind.Init/Steps/StepInfo.cs b/src/Nethermind/Nethermind.Init/Steps/StepInfo.cs index 14ba018fd8a..82cc0c38268 100644 --- a/src/Nethermind/Nethermind.Init/Steps/StepInfo.cs +++ b/src/Nethermind/Nethermind.Init/Steps/StepInfo.cs @@ -2,7 +2,9 @@ // SPDX-License-Identifier: LGPL-3.0-only using System; +using System.Collections; using System.Reflection; +using System.Threading.Tasks; namespace Nethermind.Init.Steps { diff --git a/src/Nethermind/Nethermind.Init/Steps/UpdateDiscoveryConfig.cs b/src/Nethermind/Nethermind.Init/Steps/UpdateDiscoveryConfig.cs index 3321d29899b..17b3238d579 100644 --- a/src/Nethermind/Nethermind.Init/Steps/UpdateDiscoveryConfig.cs +++ b/src/Nethermind/Nethermind.Init/Steps/UpdateDiscoveryConfig.cs @@ -10,7 +10,7 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies(typeof(FilterBootnodes))] - public class UpdateDiscoveryConfig : IStep + public class UpdateDiscoveryConfig : InitStep, IStep { private readonly INethermindApi _api; @@ -19,7 +19,7 @@ public UpdateDiscoveryConfig(INethermindApi api) _api = api; } - public Task Execute(CancellationToken _) + protected override Task Setup(CancellationToken _) { Update(); return Task.CompletedTask; diff --git a/src/Nethermind/Nethermind.Runner.Test/Ethereum/Steps/EthereumStepsManagerTests.cs b/src/Nethermind/Nethermind.Runner.Test/Ethereum/Steps/EthereumStepsManagerTests.cs index b496114ec63..d6de2944626 100644 --- a/src/Nethermind/Nethermind.Runner.Test/Ethereum/Steps/EthereumStepsManagerTests.cs +++ b/src/Nethermind/Nethermind.Runner.Test/Ethereum/Steps/EthereumStepsManagerTests.cs @@ -2,6 +2,7 @@ // SPDX-License-Identifier: LGPL-3.0-only using System; +using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using FluentAssertions; @@ -119,7 +120,9 @@ private static AuRaNethermindApi CreateAuraApi() => public class StepLong : IStep { - public async Task Execute(CancellationToken cancellationToken) + public Task StepCompleted => Task.CompletedTask; + + public async Task Execute(IEnumerable dependentSteps, CancellationToken cancellationToken) { await Task.Delay(100000, cancellationToken); } @@ -131,7 +134,8 @@ public StepLong(NethermindApi runnerContext) public class StepForever : IStep { - public async Task Execute(CancellationToken cancellationToken) + public Task StepCompleted => Task.CompletedTask; + public async Task Execute(IEnumerable dependentSteps, CancellationToken cancellationToken) { await Task.Delay(100000); } @@ -143,7 +147,8 @@ public StepForever(NethermindApi runnerContext) public class StepA : IStep { - public Task Execute(CancellationToken cancellationToken) + public Task StepCompleted => Task.CompletedTask; + public Task Execute(IEnumerable dependentSteps, CancellationToken cancellationToken) { return Task.CompletedTask; } @@ -156,7 +161,8 @@ public StepA(NethermindApi runnerContext) [RunnerStepDependencies(typeof(StepC))] public class StepB : IStep { - public Task Execute(CancellationToken cancellationToken) + public Task StepCompleted => Task.CompletedTask; + public Task Execute(IEnumerable dependentSteps, CancellationToken cancellationToken) { return Task.CompletedTask; } @@ -168,7 +174,8 @@ public StepB(NethermindApi runnerContext) public abstract class StepC : IStep { - public virtual Task Execute(CancellationToken cancellationToken) + public Task StepCompleted => Task.CompletedTask; + public virtual Task Execute(IEnumerable dependentSteps, CancellationToken cancellationToken) { return Task.CompletedTask; } @@ -176,7 +183,8 @@ public virtual Task Execute(CancellationToken cancellationToken) public abstract class StepD : IStep { - public virtual Task Execute(CancellationToken cancellationToken) + public Task StepCompleted => Task.CompletedTask; + public Task Execute(IEnumerable dependentSteps, CancellationToken cancellationToken) { return Task.CompletedTask; } @@ -191,7 +199,7 @@ public StepCAuRa(AuRaNethermindApi runnerContext) { } - public override async Task Execute(CancellationToken cancellationToken) + public override async Task Execute(IEnumerable dependentSteps, CancellationToken cancellationToken) { await Task.Run(static () => throw new TestException()); } diff --git a/src/Nethermind/Nethermind.Runner.Test/Ethereum/Steps/RegisterRpcModulesTests.cs b/src/Nethermind/Nethermind.Runner.Test/Ethereum/Steps/RegisterRpcModulesTests.cs index 7a9c32ba605..7ff77d86b60 100644 --- a/src/Nethermind/Nethermind.Runner.Test/Ethereum/Steps/RegisterRpcModulesTests.cs +++ b/src/Nethermind/Nethermind.Runner.Test/Ethereum/Steps/RegisterRpcModulesTests.cs @@ -28,7 +28,7 @@ public async Task Proof_module_is_registered_if_configured() context.ConfigProvider.GetConfig().Returns(jsonRpcConfig); RegisterRpcModules registerRpcModules = new(context); - await registerRpcModules.Execute(CancellationToken.None); + await registerRpcModules.Execute([], CancellationToken.None); context.RpcModuleProvider.Check("proof_call", new JsonRpcContext(RpcEndpoint.Http)).Should().Be(ModuleResolution.Enabled); } @@ -43,7 +43,7 @@ public async Task Proof_module_is_not_registered_when_json_rpc_not_enabled() context.RpcModuleProvider.Enabled.Returns(Array.Empty()); RegisterRpcModules registerRpcModules = new(context); - await registerRpcModules.Execute(CancellationToken.None); + await registerRpcModules.Execute([], CancellationToken.None); context.RpcModuleProvider.DidNotReceiveWithAnyArgs().Register(null); } diff --git a/src/Nethermind/Nethermind.Runner/Ethereum/Steps/StartGrpc.cs b/src/Nethermind/Nethermind.Runner/Ethereum/Steps/StartGrpc.cs index 2fcf82ea9c9..7f34ec5e190 100644 --- a/src/Nethermind/Nethermind.Runner/Ethereum/Steps/StartGrpc.cs +++ b/src/Nethermind/Nethermind.Runner/Ethereum/Steps/StartGrpc.cs @@ -14,7 +14,7 @@ namespace Nethermind.Runner.Ethereum.Steps { [RunnerStepDependencies(typeof(InitializeNetwork))] - public class StartGrpc : IStep + public class StartGrpc : InitStep, IStep { private readonly IApiWithNetwork _api; @@ -23,7 +23,7 @@ public StartGrpc(INethermindApi api) _api = api; } - public async Task Execute(CancellationToken cancellationToken) + protected override async Task Setup(CancellationToken cancellationToken) { IGrpcConfig grpcConfig = _api.Config(); if (grpcConfig.Enabled) diff --git a/src/Nethermind/Nethermind.Runner/Ethereum/Steps/StartRpc.cs b/src/Nethermind/Nethermind.Runner/Ethereum/Steps/StartRpc.cs index e3edd8e9528..e5590d3d950 100644 --- a/src/Nethermind/Nethermind.Runner/Ethereum/Steps/StartRpc.cs +++ b/src/Nethermind/Nethermind.Runner/Ethereum/Steps/StartRpc.cs @@ -21,11 +21,11 @@ namespace Nethermind.Runner.Ethereum.Steps; [RunnerStepDependencies(typeof(InitializeNetwork), typeof(RegisterRpcModules), typeof(RegisterPluginRpcModules))] -public class StartRpc(INethermindApi api) : IStep +public class StartRpc(INethermindApi api) : InitStep, IStep { private readonly INethermindApi _api = api; - public async Task Execute(CancellationToken cancellationToken) + protected override async Task Setup(CancellationToken cancellationToken) { IJsonRpcConfig jsonRpcConfig = _api.Config(); IKeyStoreConfig keyStoreConfig = _api.Config(); From b68937d213634bdc03bba2eef8bdbf0f2faee297 Mon Sep 17 00:00:00 2001 From: ak88 Date: Thu, 30 Jan 2025 23:03:30 +0100 Subject: [PATCH 03/12] cleanup --- .../Nethermind.Init/Steps/EraStep.cs | 2 +- .../Steps/EthereumStepsManager.cs | 62 ++----------------- .../Nethermind.Init/Steps/FilterBootnodes.cs | 2 +- .../Nethermind.Init/Steps/InitStep.cs | 4 +- .../Steps/InitializeBlockProducer.cs | 2 +- .../Steps/InitializeBlockTree.cs | 2 +- .../Steps/InitializeBlockchain.cs | 2 +- .../Steps/InitializeNetwork.cs | 2 +- .../Steps/InitializePlugins.cs | 2 +- .../Nethermind.Init/Steps/LogHardwareInfo.cs | 2 +- .../Steps/RegisterPluginRpcModules.cs | 2 +- .../Nethermind.Init/Steps/StepInfo.cs | 4 +- 12 files changed, 17 insertions(+), 71 deletions(-) diff --git a/src/Nethermind/Nethermind.Init/Steps/EraStep.cs b/src/Nethermind/Nethermind.Init/Steps/EraStep.cs index a7b63a5e86e..ff243ade52d 100644 --- a/src/Nethermind/Nethermind.Init/Steps/EraStep.cs +++ b/src/Nethermind/Nethermind.Init/Steps/EraStep.cs @@ -21,7 +21,7 @@ public EraStep(INethermindApi api) _api = api; } - protected override async Task Setup(CancellationToken cancellationToken) + protected override async Task Setup(CancellationToken cancellationToken) { IContainer container = _api.ConfigureContainerBuilderFromApiWithBlockchain(new ContainerBuilder()) .AddModule(new EraModule()) diff --git a/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs b/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs index f4779191589..cfa2bc8a5b1 100644 --- a/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs +++ b/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs @@ -37,58 +37,11 @@ public EthereumStepsManager( _allSteps = loader.LoadSteps(_api.GetType()).ToList(); _allStepsByBaseType = _allSteps.ToDictionary(static s => s.StepBaseType, static s => s); - - _logger.Info("" + string.Join(Environment.NewLine, _allSteps.Select((s) => s.ToString()))); - } - - private async Task ReviewDependencies(CancellationToken cancellationToken) - { - bool changedAnything; - do - { - foreach (StepInfo stepInfo in _allSteps) - { - _logger.Debug($"{stepInfo} is {stepInfo.Stage}"); - } - - await _autoResetEvent.WaitOneAsync(cancellationToken); - - if (_logger.IsDebug) _logger.Debug("Reviewing steps manager dependencies"); - - changedAnything = false; - foreach (StepInfo stepInfo in _allSteps) - { - cancellationToken.ThrowIfCancellationRequested(); - - if (stepInfo.Stage == StepInitializationStage.WaitingForDependencies) - { - bool allDependenciesFinished = true; - foreach (Type dependency in stepInfo.Dependencies) - { - StepInfo dependencyInfo = _allStepsByBaseType[dependency]; - if (dependencyInfo.Stage != StepInitializationStage.Complete) - { - if (_logger.IsDebug) _logger.Debug($"{stepInfo} is waiting for {dependencyInfo}"); - allDependenciesFinished = false; - break; - } - } - - if (allDependenciesFinished) - { - stepInfo.Stage = StepInitializationStage.WaitingForExecution; - changedAnything = true; - if (_logger.IsDebug) _logger.Debug($"{stepInfo} stage changed to {stepInfo.Stage}"); - _autoResetEvent.Set(); - } - } - } - } while (changedAnything); } public async Task InitializeAll(CancellationToken cancellationToken) { - RunOneRoundOfInitialization(cancellationToken); + CreateAndExecuteSteps(cancellationToken); Task current; do @@ -101,7 +54,7 @@ public async Task InitializeAll(CancellationToken cancellationToken) private readonly List _allRequiredSteps = new(); - private void RunOneRoundOfInitialization(CancellationToken cancellationToken) + private void CreateAndExecuteSteps(CancellationToken cancellationToken) { Dictionary createdSteps = []; @@ -122,10 +75,10 @@ private void RunOneRoundOfInitialization(CancellationToken cancellationToken) { if (!createdSteps.ContainsKey(stepInfo.StepType)) { - throw new StepDependencyException($"Initialization failed because {stepInfo} could not be created."); + throw new StepDependencyException($"Could not initialize because {stepInfo} could not be created."); } IStep step = createdSteps[stepInfo.StepType]; - + Task task = ExecuteStep(step, stepInfo, createdSteps, cancellationToken); if (_logger.IsDebug) _logger.Debug($"Executing step: {stepInfo}"); @@ -147,10 +100,8 @@ private async Task ExecuteStep(IStep step, StepInfo stepInfo, Dictionary dependentSteps, CancellationToken cancellationToken) { - cancellationToken.Register(()=> _taskCompletedSource.TrySetCanceled()); + cancellationToken.Register(() => _taskCompletedSource.TrySetCanceled()); await Task.WhenAll(dependentSteps); await Setup(cancellationToken); diff --git a/src/Nethermind/Nethermind.Init/Steps/InitializeBlockProducer.cs b/src/Nethermind/Nethermind.Init/Steps/InitializeBlockProducer.cs index 8691be00b0e..0f24adf8570 100644 --- a/src/Nethermind/Nethermind.Init/Steps/InitializeBlockProducer.cs +++ b/src/Nethermind/Nethermind.Init/Steps/InitializeBlockProducer.cs @@ -24,7 +24,7 @@ public InitializeBlockProducer(INethermindApi api) _api = api; } - protected override Task Setup(CancellationToken _) + protected override Task Setup(CancellationToken _) { if (_api.BlockProductionPolicy!.ShouldStartBlockProduction()) { diff --git a/src/Nethermind/Nethermind.Init/Steps/InitializeBlockTree.cs b/src/Nethermind/Nethermind.Init/Steps/InitializeBlockTree.cs index 3c096d43b53..e0919ee5d31 100644 --- a/src/Nethermind/Nethermind.Init/Steps/InitializeBlockTree.cs +++ b/src/Nethermind/Nethermind.Init/Steps/InitializeBlockTree.cs @@ -31,7 +31,7 @@ public InitializeBlockTree(INethermindApi api) (_get, _set) = api.ForInit; } - protected override Task Setup(CancellationToken cancellationToken) + protected override Task Setup(CancellationToken cancellationToken) { IInitConfig initConfig = _get.Config(); IBloomConfig bloomConfig = _get.Config(); diff --git a/src/Nethermind/Nethermind.Init/Steps/InitializeBlockchain.cs b/src/Nethermind/Nethermind.Init/Steps/InitializeBlockchain.cs index 59ed3fc88e3..66cebdeb7cc 100644 --- a/src/Nethermind/Nethermind.Init/Steps/InitializeBlockchain.cs +++ b/src/Nethermind/Nethermind.Init/Steps/InitializeBlockchain.cs @@ -47,7 +47,7 @@ public InitializeBlockchain(INethermindApi api) _api = api; } - protected override async Task Setup(CancellationToken _) + protected override async Task Setup(CancellationToken _) { await InitBlockchain(); } diff --git a/src/Nethermind/Nethermind.Init/Steps/InitializeNetwork.cs b/src/Nethermind/Nethermind.Init/Steps/InitializeNetwork.cs index 018e56b306c..df7bd0eebe6 100644 --- a/src/Nethermind/Nethermind.Init/Steps/InitializeNetwork.cs +++ b/src/Nethermind/Nethermind.Init/Steps/InitializeNetwork.cs @@ -75,7 +75,7 @@ public InitializeNetwork(INethermindApi api) _syncConfig = _api.Config(); } - protected override async Task Setup(CancellationToken cancellationToken) + protected override async Task Setup(CancellationToken cancellationToken) { await Initialize(cancellationToken); } diff --git a/src/Nethermind/Nethermind.Init/Steps/InitializePlugins.cs b/src/Nethermind/Nethermind.Init/Steps/InitializePlugins.cs index 2772cdcd1ed..ffbbacae8f4 100644 --- a/src/Nethermind/Nethermind.Init/Steps/InitializePlugins.cs +++ b/src/Nethermind/Nethermind.Init/Steps/InitializePlugins.cs @@ -21,7 +21,7 @@ public InitializePlugins(INethermindApi api) _api = api; } - protected override async Task Setup(CancellationToken cancellationToken) + protected override async Task Setup(CancellationToken cancellationToken) { ILogger logger = _api.LogManager.GetClassLogger(); if (logger.IsInfo) logger.Info($"Initializing {_api.Plugins.Count} plugins"); diff --git a/src/Nethermind/Nethermind.Init/Steps/LogHardwareInfo.cs b/src/Nethermind/Nethermind.Init/Steps/LogHardwareInfo.cs index 4405aece7dd..211981ce002 100644 --- a/src/Nethermind/Nethermind.Init/Steps/LogHardwareInfo.cs +++ b/src/Nethermind/Nethermind.Init/Steps/LogHardwareInfo.cs @@ -20,7 +20,7 @@ public LogHardwareInfo(INethermindApi api) _logger = api.LogManager.GetClassLogger(); } - protected override Task Setup(CancellationToken _) + protected override Task Setup(CancellationToken _) { if (!_logger.IsInfo) return Task.CompletedTask; diff --git a/src/Nethermind/Nethermind.Init/Steps/RegisterPluginRpcModules.cs b/src/Nethermind/Nethermind.Init/Steps/RegisterPluginRpcModules.cs index a191ae9e515..3f0b439d309 100644 --- a/src/Nethermind/Nethermind.Init/Steps/RegisterPluginRpcModules.cs +++ b/src/Nethermind/Nethermind.Init/Steps/RegisterPluginRpcModules.cs @@ -20,7 +20,7 @@ public RegisterPluginRpcModules(INethermindApi api) _api = api; } - protected override async Task Setup(CancellationToken cancellationToken) + protected override async Task Setup(CancellationToken cancellationToken) { IRpcModuleProvider rpcModuleProvider = _api.RpcModuleProvider!; diff --git a/src/Nethermind/Nethermind.Init/Steps/StepInfo.cs b/src/Nethermind/Nethermind.Init/Steps/StepInfo.cs index 82cc0c38268..e4d5caa01af 100644 --- a/src/Nethermind/Nethermind.Init/Steps/StepInfo.cs +++ b/src/Nethermind/Nethermind.Init/Steps/StepInfo.cs @@ -31,11 +31,9 @@ public StepInfo(Type type, Type baseType) public Type[] Dependencies { get; } - public StepInitializationStage Stage { get; set; } - public override string ToString() { - return $"{StepType.Name} : {StepBaseType.Name} ({Stage})"; + return $"{StepType.Name} : {StepBaseType.Name}"; } } } From 5c4f73419890ecee075a17b9779e3326ce7e6d0c Mon Sep 17 00:00:00 2001 From: ak88 Date: Fri, 31 Jan 2025 11:19:49 +0100 Subject: [PATCH 04/12] small refactor better error message --- .../Steps/EthereumStepsManager.cs | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs b/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs index cfa2bc8a5b1..c90aa557442 100644 --- a/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs +++ b/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs @@ -19,10 +19,8 @@ public class EthereumStepsManager { private readonly ILogger _logger; - private readonly AutoResetEvent _autoResetEvent = new AutoResetEvent(true); private readonly INethermindApi _api; private readonly List _allSteps; - private readonly Dictionary _allStepsByBaseType; public EthereumStepsManager( IEthereumStepsLoader loader, @@ -36,25 +34,22 @@ public EthereumStepsManager( ?? throw new ArgumentNullException(nameof(logManager)); _allSteps = loader.LoadSteps(_api.GetType()).ToList(); - _allStepsByBaseType = _allSteps.ToDictionary(static s => s.StepBaseType, static s => s); } public async Task InitializeAll(CancellationToken cancellationToken) { - CreateAndExecuteSteps(cancellationToken); - + List allRequiredSteps = CreateAndExecuteSteps(cancellationToken); Task current; do { - current = await Task.WhenAny(_allRequiredSteps); + current = await Task.WhenAny(allRequiredSteps); ReviewFailedAndThrow(current); - _allRequiredSteps.Remove(current); - } while (_allRequiredSteps.Any(s => !s.IsCompleted)); + allRequiredSteps.Remove(current); + } while (allRequiredSteps.Any(s => !s.IsCompleted)); } - private readonly List _allRequiredSteps = new(); - private void CreateAndExecuteSteps(CancellationToken cancellationToken) + private List CreateAndExecuteSteps(CancellationToken cancellationToken) { Dictionary createdSteps = []; @@ -70,12 +65,12 @@ private void CreateAndExecuteSteps(CancellationToken cancellationToken) } createdSteps.Add(step.GetType(), step); } - + List allRequiredSteps = new(); foreach (StepInfo stepInfo in _allSteps) { if (!createdSteps.ContainsKey(stepInfo.StepType)) { - throw new StepDependencyException($"Could not initialize because {stepInfo} could not be created."); + throw new StepDependencyException($"A step {stepInfo} could not be created and initialization cannot proceed."); } IStep step = createdSteps[stepInfo.StepType]; @@ -84,9 +79,10 @@ private void CreateAndExecuteSteps(CancellationToken cancellationToken) if (step.MustInitialize) { - _allRequiredSteps.Add(task); + allRequiredSteps.Add(task); } } + return allRequiredSteps; } private async Task ExecuteStep(IStep step, StepInfo stepInfo, Dictionary steps, CancellationToken cancellationToken) From 59605154b82ff878b82090b7beb71cff8171d8c6 Mon Sep 17 00:00:00 2001 From: ak88 Date: Fri, 31 Jan 2025 12:35:57 +0100 Subject: [PATCH 05/12] test fiix --- src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs b/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs index c90aa557442..40c5d793cf2 100644 --- a/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs +++ b/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs @@ -39,6 +39,8 @@ public EthereumStepsManager( public async Task InitializeAll(CancellationToken cancellationToken) { List allRequiredSteps = CreateAndExecuteSteps(cancellationToken); + if (allRequiredSteps.Count == 0) + return; Task current; do { From 6961235c392637ff1ebd101931b1f67f3c1851d1 Mon Sep 17 00:00:00 2001 From: ak88 Date: Fri, 31 Jan 2025 15:07:52 +0100 Subject: [PATCH 06/12] Ensure step cancelled --- .../Nethermind.Init/Steps/InitStep.cs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/Nethermind/Nethermind.Init/Steps/InitStep.cs b/src/Nethermind/Nethermind.Init/Steps/InitStep.cs index b8d03e7fbb6..517151c4cf3 100644 --- a/src/Nethermind/Nethermind.Init/Steps/InitStep.cs +++ b/src/Nethermind/Nethermind.Init/Steps/InitStep.cs @@ -25,13 +25,16 @@ public async Task Execute(IEnumerable dependentSteps, CancellationToken ca cancellationToken.Register(() => _taskCompletedSource.TrySetCanceled()); await Task.WhenAll(dependentSteps); - await Setup(cancellationToken); - SignalStepCompleted(); - } - - protected void SignalStepCompleted() - { - _taskCompletedSource.SetResult(); + try + { + await Setup(cancellationToken); + _taskCompletedSource.SetResult(); + } + catch (Exception) + { + _taskCompletedSource.SetCanceled(); + throw; + } } protected abstract Task Setup(CancellationToken cancellationToken); From 43510299a523d27e6062a625ee2cce7b36edd941 Mon Sep 17 00:00:00 2001 From: ak88 Date: Fri, 31 Jan 2025 17:10:42 +0100 Subject: [PATCH 07/12] small cleanup --- src/Nethermind/Nethermind.Init/Steps/IEthereumRunnerStep.cs | 1 - src/Nethermind/Nethermind.Init/Steps/InitStep.cs | 6 +----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/Nethermind/Nethermind.Init/Steps/IEthereumRunnerStep.cs b/src/Nethermind/Nethermind.Init/Steps/IEthereumRunnerStep.cs index 1e7d3c79913..027e07053cc 100644 --- a/src/Nethermind/Nethermind.Init/Steps/IEthereumRunnerStep.cs +++ b/src/Nethermind/Nethermind.Init/Steps/IEthereumRunnerStep.cs @@ -10,7 +10,6 @@ namespace Nethermind.Init.Steps public interface IStep { Task StepCompleted { get; } - Task Execute(CancellationToken cancellationToken) => Execute([], cancellationToken); Task Execute(IEnumerable dependentSteps, CancellationToken cancellationToken); public bool MustInitialize => true; } diff --git a/src/Nethermind/Nethermind.Init/Steps/InitStep.cs b/src/Nethermind/Nethermind.Init/Steps/InitStep.cs index 517151c4cf3..bd95b2b55b0 100644 --- a/src/Nethermind/Nethermind.Init/Steps/InitStep.cs +++ b/src/Nethermind/Nethermind.Init/Steps/InitStep.cs @@ -12,13 +12,9 @@ namespace Nethermind.Init.Steps; public abstract class InitStep { - public Task StepCompleted { private set; get; } + public Task StepCompleted => _taskCompletedSource.Task; private TaskCompletionSource _taskCompletedSource = new TaskCompletionSource(); - public InitStep() - { - StepCompleted = _taskCompletedSource.Task; - } public async Task Execute(IEnumerable dependentSteps, CancellationToken cancellationToken) { From 4483614c91470f4e6a5385f8c14ff1b0b021084b Mon Sep 17 00:00:00 2001 From: ak88 Date: Mon, 3 Feb 2025 22:21:44 +0100 Subject: [PATCH 08/12] wrapper instead of base class --- .../InitDatabaseSnapshot.cs | 4 +- .../Nethermind.Init/InitializeStateDb.cs | 4 +- .../Nethermind.Init/Steps/ApplyMemoryHint.cs | 4 +- .../Steps/DatabaseMigrations.cs | 4 +- .../Nethermind.Init/Steps/EraStep.cs | 4 +- .../Steps/EthereumStepsManager.cs | 52 ++++++++++++++----- .../Nethermind.Init/Steps/FilterBootnodes.cs | 4 +- .../Steps/IEthereumRunnerStep.cs | 5 +- .../Nethermind.Init/Steps/InitCrypto.cs | 4 +- .../Nethermind.Init/Steps/InitDatabase.cs | 4 +- .../Nethermind.Init/Steps/InitStep.cs | 37 ------------- .../Steps/InitTxTypesAndRlp.cs | 4 +- .../Steps/InitializeBlockProducer.cs | 4 +- .../Steps/InitializeBlockTree.cs | 4 +- .../Steps/InitializeBlockchain.cs | 4 +- .../Steps/InitializeNetwork.cs | 4 +- .../Steps/InitializeNodeStats.cs | 4 +- .../Steps/InitializePlugins.cs | 4 +- .../Steps/InitializePrecompiles.cs | 4 +- .../Nethermind.Init/Steps/LoadGenesisBlock.cs | 4 +- .../Nethermind.Init/Steps/LogHardwareInfo.cs | 4 +- .../Nethermind.Init/Steps/MigrateConfigs.cs | 4 +- .../Steps/RegisterPluginRpcModules.cs | 4 +- .../Steps/RegisterRpcModules.cs | 4 +- .../Nethermind.Init/Steps/ResolveIps.cs | 4 +- .../Nethermind.Init/Steps/ReviewBlockTree.cs | 4 +- .../Nethermind.Init/Steps/SetupKeyStore.cs | 4 +- .../Steps/StartBlockProcessor.cs | 4 +- .../Steps/StartBlockProducer.cs | 4 +- .../Nethermind.Init/Steps/StartLogProducer.cs | 4 +- .../Nethermind.Init/Steps/StartMonitoring.cs | 4 +- .../Nethermind.Init/Steps/StepInfo.cs | 2 - .../Steps/UpdateDiscoveryConfig.cs | 4 +- .../Steps/EthereumStepsManagerTests.cs | 22 +++----- .../Ethereum/Steps/RegisterRpcModulesTests.cs | 4 +- .../Ethereum/Steps/StartGrpc.cs | 4 +- .../Ethereum/Steps/StartRpc.cs | 4 +- 37 files changed, 112 insertions(+), 134 deletions(-) delete mode 100644 src/Nethermind/Nethermind.Init/Steps/InitStep.cs diff --git a/src/Nethermind/Nethermind.Init.Snapshot/InitDatabaseSnapshot.cs b/src/Nethermind/Nethermind.Init.Snapshot/InitDatabaseSnapshot.cs index 011a5491448..f15a56c24c6 100644 --- a/src/Nethermind/Nethermind.Init.Snapshot/InitDatabaseSnapshot.cs +++ b/src/Nethermind/Nethermind.Init.Snapshot/InitDatabaseSnapshot.cs @@ -25,7 +25,7 @@ public InitDatabaseSnapshot(INethermindApi api) : base(api) _logger = _api.LogManager.GetClassLogger(); } - protected override async Task Setup(CancellationToken cancellationToken) + public override async Task Execute(CancellationToken cancellationToken) { switch (_api.Config().DiagnosticMode) { @@ -38,7 +38,7 @@ protected override async Task Setup(CancellationToken cancellationToken) break; } - await base.Setup(cancellationToken); + await base.Execute(cancellationToken); } private async Task InitDbFromSnapshot(CancellationToken cancellationToken) diff --git a/src/Nethermind/Nethermind.Init/InitializeStateDb.cs b/src/Nethermind/Nethermind.Init/InitializeStateDb.cs index f5141591274..565dc25a38b 100644 --- a/src/Nethermind/Nethermind.Init/InitializeStateDb.cs +++ b/src/Nethermind/Nethermind.Init/InitializeStateDb.cs @@ -31,7 +31,7 @@ namespace Nethermind.Init; [RunnerStepDependencies(typeof(InitializePlugins), typeof(InitializeBlockTree), typeof(SetupKeyStore))] -public class InitializeStateDb : InitStep, IStep +public class InitializeStateDb : IStep { private readonly INethermindApi _api; private ILogger _logger; @@ -41,7 +41,7 @@ public InitializeStateDb(INethermindApi api) _api = api; } - protected override Task Setup(CancellationToken _) + public Task Execute(CancellationToken cancellationToken) { InitBlockTraceDumper(); diff --git a/src/Nethermind/Nethermind.Init/Steps/ApplyMemoryHint.cs b/src/Nethermind/Nethermind.Init/Steps/ApplyMemoryHint.cs index 3f413644b7a..d9a279eb78f 100644 --- a/src/Nethermind/Nethermind.Init/Steps/ApplyMemoryHint.cs +++ b/src/Nethermind/Nethermind.Init/Steps/ApplyMemoryHint.cs @@ -13,7 +13,7 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies(typeof(MigrateConfigs))] - public sealed class ApplyMemoryHint : InitStep, IStep + public sealed class ApplyMemoryHint : IStep { private readonly INethermindApi _api; private readonly IInitConfig _initConfig; @@ -32,7 +32,7 @@ public ApplyMemoryHint(INethermindApi api) _txPoolConfig = api.Config(); } - protected override Task Setup(CancellationToken _) + public Task Execute(CancellationToken _) { MemoryHintMan memoryHintMan = new(_api.LogManager); uint cpuCount = (uint)Environment.ProcessorCount; diff --git a/src/Nethermind/Nethermind.Init/Steps/DatabaseMigrations.cs b/src/Nethermind/Nethermind.Init/Steps/DatabaseMigrations.cs index 1365f45804e..fb05dfaf61a 100644 --- a/src/Nethermind/Nethermind.Init/Steps/DatabaseMigrations.cs +++ b/src/Nethermind/Nethermind.Init/Steps/DatabaseMigrations.cs @@ -11,7 +11,7 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies(typeof(InitTxTypesAndRlp), typeof(InitDatabase), typeof(InitializeBlockchain), typeof(InitializeNetwork))] - public sealed class DatabaseMigrations : InitStep, IStep + public sealed class DatabaseMigrations : IStep { private readonly IApiWithNetwork _api; @@ -20,7 +20,7 @@ public DatabaseMigrations(INethermindApi api) _api = api; } - protected override async Task Setup(CancellationToken cancellationToken) + public async Task Execute(CancellationToken cancellationToken) { foreach (IDatabaseMigration migration in CreateMigrations()) { diff --git a/src/Nethermind/Nethermind.Init/Steps/EraStep.cs b/src/Nethermind/Nethermind.Init/Steps/EraStep.cs index ff243ade52d..5f8241bee39 100644 --- a/src/Nethermind/Nethermind.Init/Steps/EraStep.cs +++ b/src/Nethermind/Nethermind.Init/Steps/EraStep.cs @@ -12,7 +12,7 @@ namespace Nethermind.Init.Steps; [RunnerStepDependencies(typeof(InitializeBlockchain), typeof(LoadGenesisBlock))] -public class EraStep : InitStep, IStep +public class EraStep : IStep { protected readonly INethermindApi _api; @@ -21,7 +21,7 @@ public EraStep(INethermindApi api) _api = api; } - protected override async Task Setup(CancellationToken cancellationToken) + public async Task Execute(CancellationToken cancellationToken) { IContainer container = _api.ConfigureContainerBuilderFromApiWithBlockchain(new ContainerBuilder()) .AddModule(new EraModule()) diff --git a/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs b/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs index 40c5d793cf2..6bf9534b73f 100644 --- a/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs +++ b/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs @@ -53,7 +53,7 @@ public async Task InitializeAll(CancellationToken cancellationToken) private List CreateAndExecuteSteps(CancellationToken cancellationToken) { - Dictionary createdSteps = []; + Dictionary createdSteps = []; foreach (StepInfo stepInfo in _allSteps) { @@ -65,7 +65,7 @@ private List CreateAndExecuteSteps(CancellationToken cancellationToken) if (_logger.IsError) _logger.Error($"Unable to create instance of Ethereum runner step {stepInfo}"); continue; } - createdSteps.Add(step.GetType(), step); + createdSteps.Add(step.GetType(), new StepWrapper(step)); } List allRequiredSteps = new(); foreach (StepInfo stepInfo in _allSteps) @@ -74,12 +74,12 @@ private List CreateAndExecuteSteps(CancellationToken cancellationToken) { throw new StepDependencyException($"A step {stepInfo} could not be created and initialization cannot proceed."); } - IStep step = createdSteps[stepInfo.StepType]; + StepWrapper stepWrapper = createdSteps[stepInfo.StepType]; - Task task = ExecuteStep(step, stepInfo, createdSteps, cancellationToken); + Task task = ExecuteStep(stepWrapper, stepInfo, createdSteps, cancellationToken); if (_logger.IsDebug) _logger.Debug($"Executing step: {stepInfo}"); - if (step.MustInitialize) + if (stepWrapper.Step.MustInitialize) { allRequiredSteps.Add(task); } @@ -87,25 +87,25 @@ private List CreateAndExecuteSteps(CancellationToken cancellationToken) return allRequiredSteps; } - private async Task ExecuteStep(IStep step, StepInfo stepInfo, Dictionary steps, CancellationToken cancellationToken) + private async Task ExecuteStep(StepWrapper stepWrapper, StepInfo stepInfo, Dictionary steps, CancellationToken cancellationToken) { long startTime = Stopwatch.GetTimestamp(); try { - IEnumerable dependencies = stepInfo.Dependencies.Select(t => steps[t].StepCompleted); - await step.Execute(dependencies, cancellationToken); + IEnumerable dependencies = stepInfo.Dependencies.Select(t => steps[t]); + await stepWrapper.StartExecute(dependencies, cancellationToken); if (_logger.IsDebug) _logger.Debug( - $"Step {step.GetType().Name,-24} executed in {Stopwatch.GetElapsedTime(startTime).TotalMilliseconds:N0}ms"); + $"Step {stepWrapper.GetType().Name,-24} executed in {Stopwatch.GetElapsedTime(startTime).TotalMilliseconds:N0}ms"); } catch (Exception exception) when (exception is not TaskCanceledException) { - if (step.MustInitialize) + if (stepWrapper.Step.MustInitialize) { if (_logger.IsError) _logger.Error( - $"Step {step.GetType().Name,-24} failed after {Stopwatch.GetElapsedTime(startTime).TotalMilliseconds:N0}ms", + $"Step {stepWrapper.GetType().Name,-24} failed after {Stopwatch.GetElapsedTime(startTime).TotalMilliseconds:N0}ms", exception); throw; } @@ -113,12 +113,12 @@ private async Task ExecuteStep(IStep step, StepInfo stepInfo, Dictionary step; + public Task StepTask => _taskCompletedSource.Task; + + private TaskCompletionSource _taskCompletedSource = new TaskCompletionSource(); + + public async Task StartExecute(IEnumerable dependentSteps, CancellationToken cancellationToken) + { + cancellationToken.Register(() => _taskCompletedSource.TrySetCanceled()); + + await Task.WhenAll(dependentSteps.Select(s => s.StepTask)); + try + { + await step.Execute(cancellationToken); + _taskCompletedSource.SetResult(); + } + catch + { + _taskCompletedSource.SetCanceled(); + throw; + } + } + } } + } diff --git a/src/Nethermind/Nethermind.Init/Steps/FilterBootnodes.cs b/src/Nethermind/Nethermind.Init/Steps/FilterBootnodes.cs index 55c447842fa..c75d83fdb28 100644 --- a/src/Nethermind/Nethermind.Init/Steps/FilterBootnodes.cs +++ b/src/Nethermind/Nethermind.Init/Steps/FilterBootnodes.cs @@ -9,7 +9,7 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies(typeof(SetupKeyStore))] - public class FilterBootnodes : InitStep, IStep + public class FilterBootnodes : IStep { private readonly IApiWithStores _api; @@ -18,7 +18,7 @@ public FilterBootnodes(INethermindApi api) _api = api; } - protected override Task Setup(CancellationToken _) + public Task Execute(CancellationToken _) { if (_api.ChainSpec is null) { diff --git a/src/Nethermind/Nethermind.Init/Steps/IEthereumRunnerStep.cs b/src/Nethermind/Nethermind.Init/Steps/IEthereumRunnerStep.cs index 027e07053cc..df856ac2e03 100644 --- a/src/Nethermind/Nethermind.Init/Steps/IEthereumRunnerStep.cs +++ b/src/Nethermind/Nethermind.Init/Steps/IEthereumRunnerStep.cs @@ -1,7 +1,6 @@ // SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited // SPDX-License-Identifier: LGPL-3.0-only -using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; @@ -9,8 +8,8 @@ namespace Nethermind.Init.Steps { public interface IStep { - Task StepCompleted { get; } - Task Execute(IEnumerable dependentSteps, CancellationToken cancellationToken); + Task Execute(CancellationToken cancellationToken); + public bool MustInitialize => true; } } diff --git a/src/Nethermind/Nethermind.Init/Steps/InitCrypto.cs b/src/Nethermind/Nethermind.Init/Steps/InitCrypto.cs index 99341d3a922..51d51c4e18a 100644 --- a/src/Nethermind/Nethermind.Init/Steps/InitCrypto.cs +++ b/src/Nethermind/Nethermind.Init/Steps/InitCrypto.cs @@ -10,7 +10,7 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies(typeof(InitTxTypesAndRlp))] - public class InitCrypto : InitStep, IStep + public class InitCrypto : IStep { private readonly IBasicApi _api; @@ -20,7 +20,7 @@ public InitCrypto(INethermindApi api) } [Todo(Improve.Refactor, "Automatically scan all the references solutions?")] - protected override Task Setup(CancellationToken _) + public virtual Task Execute(CancellationToken _) { _api.EthereumEcdsa = new EthereumEcdsa(_api.SpecProvider!.ChainId); return Task.CompletedTask; diff --git a/src/Nethermind/Nethermind.Init/Steps/InitDatabase.cs b/src/Nethermind/Nethermind.Init/Steps/InitDatabase.cs index d61c85b5aa2..e14ffa68232 100644 --- a/src/Nethermind/Nethermind.Init/Steps/InitDatabase.cs +++ b/src/Nethermind/Nethermind.Init/Steps/InitDatabase.cs @@ -21,7 +21,7 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies(typeof(ApplyMemoryHint))] - public class InitDatabase : InitStep, IStep + public class InitDatabase : IStep { private readonly INethermindApi _api; @@ -30,7 +30,7 @@ public InitDatabase(INethermindApi api) _api = api; } - protected override async Task Setup(CancellationToken cancellationToken) + public virtual async Task Execute(CancellationToken _) { ILogger logger = _api.LogManager.GetClassLogger(); diff --git a/src/Nethermind/Nethermind.Init/Steps/InitStep.cs b/src/Nethermind/Nethermind.Init/Steps/InitStep.cs deleted file mode 100644 index bd95b2b55b0..00000000000 --- a/src/Nethermind/Nethermind.Init/Steps/InitStep.cs +++ /dev/null @@ -1,37 +0,0 @@ -// SPDX-FileCopyrightText: 2025 Demerzel Solutions Limited -// SPDX-License-Identifier: LGPL-3.0-only - -using MathNet.Numerics.Differentiation; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading; -using System.Threading.Tasks; - -namespace Nethermind.Init.Steps; -public abstract class InitStep -{ - public Task StepCompleted => _taskCompletedSource.Task; - - private TaskCompletionSource _taskCompletedSource = new TaskCompletionSource(); - - public async Task Execute(IEnumerable dependentSteps, CancellationToken cancellationToken) - { - cancellationToken.Register(() => _taskCompletedSource.TrySetCanceled()); - - await Task.WhenAll(dependentSteps); - try - { - await Setup(cancellationToken); - _taskCompletedSource.SetResult(); - } - catch (Exception) - { - _taskCompletedSource.SetCanceled(); - throw; - } - } - - protected abstract Task Setup(CancellationToken cancellationToken); -} diff --git a/src/Nethermind/Nethermind.Init/Steps/InitTxTypesAndRlp.cs b/src/Nethermind/Nethermind.Init/Steps/InitTxTypesAndRlp.cs index a3cdd9d6b9c..f96f35c1fbb 100644 --- a/src/Nethermind/Nethermind.Init/Steps/InitTxTypesAndRlp.cs +++ b/src/Nethermind/Nethermind.Init/Steps/InitTxTypesAndRlp.cs @@ -15,12 +15,12 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies(typeof(ApplyMemoryHint))] - public class InitTxTypesAndRlp(INethermindApi api) : InitStep, IStep + public class InitTxTypesAndRlp(INethermindApi api) : IStep { private readonly INethermindApi _api = api ?? throw new ArgumentNullException(nameof(api)); [Todo(Improve.Refactor, "Automatically scan all the references solutions?")] - protected override Task Setup(CancellationToken cancellationToken) + public virtual Task Execute(CancellationToken _) { if (_api.SpecProvider is null) throw new StepDependencyException(nameof(_api.SpecProvider)); diff --git a/src/Nethermind/Nethermind.Init/Steps/InitializeBlockProducer.cs b/src/Nethermind/Nethermind.Init/Steps/InitializeBlockProducer.cs index 0f24adf8570..e6abb1deef9 100644 --- a/src/Nethermind/Nethermind.Init/Steps/InitializeBlockProducer.cs +++ b/src/Nethermind/Nethermind.Init/Steps/InitializeBlockProducer.cs @@ -15,7 +15,7 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies(typeof(StartBlockProcessor), typeof(SetupKeyStore), typeof(InitializeNetwork), typeof(ReviewBlockTree))] - public class InitializeBlockProducer : InitStep, IStep + public class InitializeBlockProducer : IStep { private readonly IApiWithBlockchain _api; @@ -24,7 +24,7 @@ public InitializeBlockProducer(INethermindApi api) _api = api; } - protected override Task Setup(CancellationToken _) + public Task Execute(CancellationToken _) { if (_api.BlockProductionPolicy!.ShouldStartBlockProduction()) { diff --git a/src/Nethermind/Nethermind.Init/Steps/InitializeBlockTree.cs b/src/Nethermind/Nethermind.Init/Steps/InitializeBlockTree.cs index e0919ee5d31..57953c0a226 100644 --- a/src/Nethermind/Nethermind.Init/Steps/InitializeBlockTree.cs +++ b/src/Nethermind/Nethermind.Init/Steps/InitializeBlockTree.cs @@ -21,7 +21,7 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies(typeof(InitTxTypesAndRlp), typeof(InitDatabase), typeof(MigrateConfigs), typeof(SetupKeyStore))] - public class InitializeBlockTree : InitStep, IStep + public class InitializeBlockTree : IStep { private readonly IBasicApi _get; private readonly IApiWithStores _set; @@ -31,7 +31,7 @@ public InitializeBlockTree(INethermindApi api) (_get, _set) = api.ForInit; } - protected override Task Setup(CancellationToken cancellationToken) + public Task Execute(CancellationToken cancellationToken) { IInitConfig initConfig = _get.Config(); IBloomConfig bloomConfig = _get.Config(); diff --git a/src/Nethermind/Nethermind.Init/Steps/InitializeBlockchain.cs b/src/Nethermind/Nethermind.Init/Steps/InitializeBlockchain.cs index 41b279bbb62..73fac1682ef 100644 --- a/src/Nethermind/Nethermind.Init/Steps/InitializeBlockchain.cs +++ b/src/Nethermind/Nethermind.Init/Steps/InitializeBlockchain.cs @@ -37,7 +37,7 @@ namespace Nethermind.Init.Steps typeof(SetupKeyStore), typeof(InitializePrecompiles) )] - public class InitializeBlockchain : InitStep, IStep + public class InitializeBlockchain : IStep { private readonly INethermindApi _api; @@ -47,7 +47,7 @@ public InitializeBlockchain(INethermindApi api) _api = api; } - protected override async Task Setup(CancellationToken _) + public async Task Execute(CancellationToken _) { await InitBlockchain(); } diff --git a/src/Nethermind/Nethermind.Init/Steps/InitializeNetwork.cs b/src/Nethermind/Nethermind.Init/Steps/InitializeNetwork.cs index 7678dbd4151..83b50601abe 100644 --- a/src/Nethermind/Nethermind.Init/Steps/InitializeNetwork.cs +++ b/src/Nethermind/Nethermind.Init/Steps/InitializeNetwork.cs @@ -58,7 +58,7 @@ public static long Estimate(uint arenaCount, int arenaOrder) typeof(InitializePlugins), typeof(EraStep), typeof(InitializeBlockchain))] -public class InitializeNetwork : InitStep, IStep +public class InitializeNetwork : IStep { public const string PeersDbPath = "peers"; @@ -75,7 +75,7 @@ public InitializeNetwork(INethermindApi api) _syncConfig = _api.Config(); } - protected override async Task Setup(CancellationToken cancellationToken) + public async Task Execute(CancellationToken cancellationToken) { await Initialize(cancellationToken); } diff --git a/src/Nethermind/Nethermind.Init/Steps/InitializeNodeStats.cs b/src/Nethermind/Nethermind.Init/Steps/InitializeNodeStats.cs index 1c704a35360..ddf6d80d99f 100644 --- a/src/Nethermind/Nethermind.Init/Steps/InitializeNodeStats.cs +++ b/src/Nethermind/Nethermind.Init/Steps/InitializeNodeStats.cs @@ -10,7 +10,7 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies] - public class InitializeNodeStats : InitStep, IStep + public class InitializeNodeStats : IStep { private readonly IApiWithNetwork _api; @@ -19,7 +19,7 @@ public InitializeNodeStats(INethermindApi api) _api = api; } - protected override Task Setup(CancellationToken cancellationToken) + public Task Execute(CancellationToken _) { INetworkConfig config = _api.Config(); diff --git a/src/Nethermind/Nethermind.Init/Steps/InitializePlugins.cs b/src/Nethermind/Nethermind.Init/Steps/InitializePlugins.cs index ffbbacae8f4..122ba122348 100644 --- a/src/Nethermind/Nethermind.Init/Steps/InitializePlugins.cs +++ b/src/Nethermind/Nethermind.Init/Steps/InitializePlugins.cs @@ -12,7 +12,7 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies(typeof(InitializeBlockTree))] - public class InitializePlugins : InitStep, IStep + public class InitializePlugins : IStep { private readonly INethermindApi _api; @@ -21,7 +21,7 @@ public InitializePlugins(INethermindApi api) _api = api; } - protected override async Task Setup(CancellationToken cancellationToken) + public async Task Execute(CancellationToken cancellationToken) { ILogger logger = _api.LogManager.GetClassLogger(); if (logger.IsInfo) logger.Info($"Initializing {_api.Plugins.Count} plugins"); diff --git a/src/Nethermind/Nethermind.Init/Steps/InitializePrecompiles.cs b/src/Nethermind/Nethermind.Init/Steps/InitializePrecompiles.cs index 9ea4924f9a5..37b1706f28e 100644 --- a/src/Nethermind/Nethermind.Init/Steps/InitializePrecompiles.cs +++ b/src/Nethermind/Nethermind.Init/Steps/InitializePrecompiles.cs @@ -11,7 +11,7 @@ namespace Nethermind.Init.Steps; -public class InitializePrecompiles : InitStep, IStep +public class InitializePrecompiles : IStep { private readonly INethermindApi _api; @@ -20,7 +20,7 @@ public InitializePrecompiles(INethermindApi api) _api = api; } - protected override async Task Setup(CancellationToken cancellationToken) + public async Task Execute(CancellationToken cancellationToken) { if (_api.SpecProvider!.GetFinalSpec().IsEip4844Enabled) { diff --git a/src/Nethermind/Nethermind.Init/Steps/LoadGenesisBlock.cs b/src/Nethermind/Nethermind.Init/Steps/LoadGenesisBlock.cs index 4d60c976044..cfb92fbcc97 100644 --- a/src/Nethermind/Nethermind.Init/Steps/LoadGenesisBlock.cs +++ b/src/Nethermind/Nethermind.Init/Steps/LoadGenesisBlock.cs @@ -15,7 +15,7 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies(typeof(StartBlockProcessor), typeof(InitializeBlockchain), typeof(InitializePlugins))] - public class LoadGenesisBlock : InitStep, IStep + public class LoadGenesisBlock : IStep { private readonly IApiWithBlockchain _api; private readonly ILogger _logger; @@ -29,7 +29,7 @@ public LoadGenesisBlock(INethermindApi api) _genesisProcessedTimeout = TimeSpan.FromMilliseconds(_api.Config().GenesisTimeoutMs); } - protected override async Task Setup(CancellationToken _) + public async Task Execute(CancellationToken _) { _initConfig = _api.Config(); Hash256? expectedGenesisHash = string.IsNullOrWhiteSpace(_initConfig.GenesisHash) ? null : new Hash256(_initConfig.GenesisHash); diff --git a/src/Nethermind/Nethermind.Init/Steps/LogHardwareInfo.cs b/src/Nethermind/Nethermind.Init/Steps/LogHardwareInfo.cs index 211981ce002..3132f1b30ba 100644 --- a/src/Nethermind/Nethermind.Init/Steps/LogHardwareInfo.cs +++ b/src/Nethermind/Nethermind.Init/Steps/LogHardwareInfo.cs @@ -9,7 +9,7 @@ namespace Nethermind.Init.Steps; -public class LogHardwareInfo : InitStep, IStep +public class LogHardwareInfo : IStep { private readonly ILogger _logger; @@ -20,7 +20,7 @@ public LogHardwareInfo(INethermindApi api) _logger = api.LogManager.GetClassLogger(); } - protected override Task Setup(CancellationToken _) + public Task Execute(CancellationToken cancellationToken) { if (!_logger.IsInfo) return Task.CompletedTask; diff --git a/src/Nethermind/Nethermind.Init/Steps/MigrateConfigs.cs b/src/Nethermind/Nethermind.Init/Steps/MigrateConfigs.cs index 41f0bdcc8b0..7b38dc42ae9 100644 --- a/src/Nethermind/Nethermind.Init/Steps/MigrateConfigs.cs +++ b/src/Nethermind/Nethermind.Init/Steps/MigrateConfigs.cs @@ -12,7 +12,7 @@ namespace Nethermind.Init.Steps { - public class MigrateConfigs : InitStep, IStep + public class MigrateConfigs : IStep { private readonly INethermindApi _api; @@ -21,7 +21,7 @@ public MigrateConfigs(INethermindApi api) _api = api; } - protected override Task Setup(CancellationToken _) + public Task Execute(CancellationToken cancellationToken) { IMiningConfig miningConfig = _api.Config(); IReceiptConfig receiptConfig = _api.Config(); diff --git a/src/Nethermind/Nethermind.Init/Steps/RegisterPluginRpcModules.cs b/src/Nethermind/Nethermind.Init/Steps/RegisterPluginRpcModules.cs index 3f0b439d309..84dccd3ea34 100644 --- a/src/Nethermind/Nethermind.Init/Steps/RegisterPluginRpcModules.cs +++ b/src/Nethermind/Nethermind.Init/Steps/RegisterPluginRpcModules.cs @@ -11,7 +11,7 @@ namespace Nethermind.Init.Steps; [RunnerStepDependencies(typeof(InitializeNetwork), typeof(SetupKeyStore), typeof(InitializeBlockchain), typeof(InitializePlugins), typeof(InitializeBlockProducer), typeof(RegisterRpcModules))] -public class RegisterPluginRpcModules : InitStep, IStep +public class RegisterPluginRpcModules : IStep { private readonly INethermindApi _api; @@ -20,7 +20,7 @@ public RegisterPluginRpcModules(INethermindApi api) _api = api; } - protected override async Task Setup(CancellationToken cancellationToken) + public virtual async Task Execute(CancellationToken cancellationToken) { IRpcModuleProvider rpcModuleProvider = _api.RpcModuleProvider!; diff --git a/src/Nethermind/Nethermind.Init/Steps/RegisterRpcModules.cs b/src/Nethermind/Nethermind.Init/Steps/RegisterRpcModules.cs index 7a62af6ce62..926181193dd 100644 --- a/src/Nethermind/Nethermind.Init/Steps/RegisterRpcModules.cs +++ b/src/Nethermind/Nethermind.Init/Steps/RegisterRpcModules.cs @@ -33,7 +33,7 @@ namespace Nethermind.Init.Steps; [RunnerStepDependencies(typeof(InitializeNetwork), typeof(SetupKeyStore), typeof(InitializeBlockchain), typeof(InitializePlugins))] -public class RegisterRpcModules : InitStep, IStep +public class RegisterRpcModules : IStep { private readonly INethermindApi _api; protected readonly IJsonRpcConfig _jsonRpcConfig; @@ -44,7 +44,7 @@ public RegisterRpcModules(INethermindApi api) _jsonRpcConfig = _api.Config(); } - protected override async Task Setup(CancellationToken cancellationToken) + public virtual async Task Execute(CancellationToken cancellationToken) { StepDependencyException.ThrowIfNull(_api.BlockTree); StepDependencyException.ThrowIfNull(_api.ReceiptFinder); diff --git a/src/Nethermind/Nethermind.Init/Steps/ResolveIps.cs b/src/Nethermind/Nethermind.Init/Steps/ResolveIps.cs index 0eaf5b13003..20eb9c09685 100644 --- a/src/Nethermind/Nethermind.Init/Steps/ResolveIps.cs +++ b/src/Nethermind/Nethermind.Init/Steps/ResolveIps.cs @@ -11,7 +11,7 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies] - public class ResolveIps : InitStep, IStep + public class ResolveIps : IStep { private readonly IApiWithNetwork _api; @@ -21,7 +21,7 @@ public ResolveIps(INethermindApi api) } [Todo(Improve.Refactor, "Automatically scan all the references solutions?")] - protected override async Task Setup(CancellationToken cancellationToken) + public virtual async Task Execute(CancellationToken _) { // this should be outside of Ethereum Runner I guess INetworkConfig networkConfig = _api.Config(); diff --git a/src/Nethermind/Nethermind.Init/Steps/ReviewBlockTree.cs b/src/Nethermind/Nethermind.Init/Steps/ReviewBlockTree.cs index c98cf297b87..b75a4fc9cb9 100644 --- a/src/Nethermind/Nethermind.Init/Steps/ReviewBlockTree.cs +++ b/src/Nethermind/Nethermind.Init/Steps/ReviewBlockTree.cs @@ -11,7 +11,7 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies(typeof(StartBlockProcessor), (typeof(InitializeNetwork)))] - public class ReviewBlockTree : InitStep, IStep + public class ReviewBlockTree : IStep { private readonly IApiWithBlockchain _api; private readonly ILogger _logger; @@ -22,7 +22,7 @@ public ReviewBlockTree(INethermindApi api) _logger = _api.LogManager.GetClassLogger(); } - protected override Task Setup(CancellationToken cancellationToken) + public Task Execute(CancellationToken cancellationToken) { if (_api.BlockTree is null) throw new StepDependencyException(nameof(_api.DbProvider)); diff --git a/src/Nethermind/Nethermind.Init/Steps/SetupKeyStore.cs b/src/Nethermind/Nethermind.Init/Steps/SetupKeyStore.cs index ee22f367212..9db80d00fa3 100644 --- a/src/Nethermind/Nethermind.Init/Steps/SetupKeyStore.cs +++ b/src/Nethermind/Nethermind.Init/Steps/SetupKeyStore.cs @@ -16,7 +16,7 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies(typeof(ResolveIps))] - public class SetupKeyStore : InitStep, IStep + public class SetupKeyStore : IStep { private readonly IApiWithBlockchain _api; @@ -25,7 +25,7 @@ public SetupKeyStore(INethermindApi api) _api = api; } - protected override async Task Setup(CancellationToken cancellationToken) + public async Task Execute(CancellationToken cancellationToken) { (IApiWithStores get, IApiWithBlockchain set) = _api.ForInit; // why is the await Task.Run here? diff --git a/src/Nethermind/Nethermind.Init/Steps/StartBlockProcessor.cs b/src/Nethermind/Nethermind.Init/Steps/StartBlockProcessor.cs index bf76563a70f..129888475d6 100644 --- a/src/Nethermind/Nethermind.Init/Steps/StartBlockProcessor.cs +++ b/src/Nethermind/Nethermind.Init/Steps/StartBlockProcessor.cs @@ -8,7 +8,7 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies(typeof(InitializeBlockchain))] - public class StartBlockProcessor : InitStep, IStep + public class StartBlockProcessor : IStep { private readonly IApiWithBlockchain _api; @@ -17,7 +17,7 @@ public StartBlockProcessor(INethermindApi api) _api = api; } - protected override Task Setup(CancellationToken cancellationToken) + public Task Execute(CancellationToken _) { if (_api.BlockchainProcessor is null) { diff --git a/src/Nethermind/Nethermind.Init/Steps/StartBlockProducer.cs b/src/Nethermind/Nethermind.Init/Steps/StartBlockProducer.cs index 8c3bb524253..652b3ec29ea 100644 --- a/src/Nethermind/Nethermind.Init/Steps/StartBlockProducer.cs +++ b/src/Nethermind/Nethermind.Init/Steps/StartBlockProducer.cs @@ -11,7 +11,7 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies(typeof(InitializeBlockProducer), typeof(ReviewBlockTree), typeof(InitializePrecompiles))] // Unfortunately EngineRPC API need review blockTree - public class StartBlockProducer : InitStep, IStep + public class StartBlockProducer : IStep { private readonly IApiWithBlockchain _api; @@ -20,7 +20,7 @@ public StartBlockProducer(INethermindApi api) _api = api; } - protected override Task Setup(CancellationToken cancellationToken) + public Task Execute(CancellationToken _) { if (_api.BlockProductionPolicy!.ShouldStartBlockProduction() && _api.BlockProducer is not null) { diff --git a/src/Nethermind/Nethermind.Init/Steps/StartLogProducer.cs b/src/Nethermind/Nethermind.Init/Steps/StartLogProducer.cs index ad791308c8f..94648de3bc1 100644 --- a/src/Nethermind/Nethermind.Init/Steps/StartLogProducer.cs +++ b/src/Nethermind/Nethermind.Init/Steps/StartLogProducer.cs @@ -9,7 +9,7 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies(typeof(StartBlockProcessor))] - public class StartLogProducer : InitStep, IStep + public class StartLogProducer : IStep { private readonly INethermindApi _api; @@ -18,7 +18,7 @@ public StartLogProducer(INethermindApi api) _api = api; } - protected override Task Setup(CancellationToken cancellationToken) + public Task Execute(CancellationToken cancellationToken) { // TODO: this should be configure in init maybe? LogPublisher logPublisher = new LogPublisher(_api.EthereumJsonSerializer!, _api.LogManager); diff --git a/src/Nethermind/Nethermind.Init/Steps/StartMonitoring.cs b/src/Nethermind/Nethermind.Init/Steps/StartMonitoring.cs index 8e955716150..a8d83d277b3 100644 --- a/src/Nethermind/Nethermind.Init/Steps/StartMonitoring.cs +++ b/src/Nethermind/Nethermind.Init/Steps/StartMonitoring.cs @@ -17,7 +17,7 @@ namespace Nethermind.Init.Steps; [RunnerStepDependencies(typeof(InitializeNetwork))] -public class StartMonitoring : InitStep, IStep +public class StartMonitoring : IStep { private readonly IApiWithNetwork _api; private readonly ILogger _logger; @@ -30,7 +30,7 @@ public StartMonitoring(INethermindApi api) _metricsConfig = _api.Config(); } - protected override async Task Setup(CancellationToken cancellationToken) + public async Task Execute(CancellationToken cancellationToken) { // hacky if (!string.IsNullOrEmpty(_metricsConfig.NodeName)) diff --git a/src/Nethermind/Nethermind.Init/Steps/StepInfo.cs b/src/Nethermind/Nethermind.Init/Steps/StepInfo.cs index e4d5caa01af..4873e2b2099 100644 --- a/src/Nethermind/Nethermind.Init/Steps/StepInfo.cs +++ b/src/Nethermind/Nethermind.Init/Steps/StepInfo.cs @@ -2,9 +2,7 @@ // SPDX-License-Identifier: LGPL-3.0-only using System; -using System.Collections; using System.Reflection; -using System.Threading.Tasks; namespace Nethermind.Init.Steps { diff --git a/src/Nethermind/Nethermind.Init/Steps/UpdateDiscoveryConfig.cs b/src/Nethermind/Nethermind.Init/Steps/UpdateDiscoveryConfig.cs index 17b3238d579..3321d29899b 100644 --- a/src/Nethermind/Nethermind.Init/Steps/UpdateDiscoveryConfig.cs +++ b/src/Nethermind/Nethermind.Init/Steps/UpdateDiscoveryConfig.cs @@ -10,7 +10,7 @@ namespace Nethermind.Init.Steps { [RunnerStepDependencies(typeof(FilterBootnodes))] - public class UpdateDiscoveryConfig : InitStep, IStep + public class UpdateDiscoveryConfig : IStep { private readonly INethermindApi _api; @@ -19,7 +19,7 @@ public UpdateDiscoveryConfig(INethermindApi api) _api = api; } - protected override Task Setup(CancellationToken _) + public Task Execute(CancellationToken _) { Update(); return Task.CompletedTask; diff --git a/src/Nethermind/Nethermind.Runner.Test/Ethereum/Steps/EthereumStepsManagerTests.cs b/src/Nethermind/Nethermind.Runner.Test/Ethereum/Steps/EthereumStepsManagerTests.cs index d6de2944626..b496114ec63 100644 --- a/src/Nethermind/Nethermind.Runner.Test/Ethereum/Steps/EthereumStepsManagerTests.cs +++ b/src/Nethermind/Nethermind.Runner.Test/Ethereum/Steps/EthereumStepsManagerTests.cs @@ -2,7 +2,6 @@ // SPDX-License-Identifier: LGPL-3.0-only using System; -using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using FluentAssertions; @@ -120,9 +119,7 @@ private static AuRaNethermindApi CreateAuraApi() => public class StepLong : IStep { - public Task StepCompleted => Task.CompletedTask; - - public async Task Execute(IEnumerable dependentSteps, CancellationToken cancellationToken) + public async Task Execute(CancellationToken cancellationToken) { await Task.Delay(100000, cancellationToken); } @@ -134,8 +131,7 @@ public StepLong(NethermindApi runnerContext) public class StepForever : IStep { - public Task StepCompleted => Task.CompletedTask; - public async Task Execute(IEnumerable dependentSteps, CancellationToken cancellationToken) + public async Task Execute(CancellationToken cancellationToken) { await Task.Delay(100000); } @@ -147,8 +143,7 @@ public StepForever(NethermindApi runnerContext) public class StepA : IStep { - public Task StepCompleted => Task.CompletedTask; - public Task Execute(IEnumerable dependentSteps, CancellationToken cancellationToken) + public Task Execute(CancellationToken cancellationToken) { return Task.CompletedTask; } @@ -161,8 +156,7 @@ public StepA(NethermindApi runnerContext) [RunnerStepDependencies(typeof(StepC))] public class StepB : IStep { - public Task StepCompleted => Task.CompletedTask; - public Task Execute(IEnumerable dependentSteps, CancellationToken cancellationToken) + public Task Execute(CancellationToken cancellationToken) { return Task.CompletedTask; } @@ -174,8 +168,7 @@ public StepB(NethermindApi runnerContext) public abstract class StepC : IStep { - public Task StepCompleted => Task.CompletedTask; - public virtual Task Execute(IEnumerable dependentSteps, CancellationToken cancellationToken) + public virtual Task Execute(CancellationToken cancellationToken) { return Task.CompletedTask; } @@ -183,8 +176,7 @@ public virtual Task Execute(IEnumerable dependentSteps, CancellationToken public abstract class StepD : IStep { - public Task StepCompleted => Task.CompletedTask; - public Task Execute(IEnumerable dependentSteps, CancellationToken cancellationToken) + public virtual Task Execute(CancellationToken cancellationToken) { return Task.CompletedTask; } @@ -199,7 +191,7 @@ public StepCAuRa(AuRaNethermindApi runnerContext) { } - public override async Task Execute(IEnumerable dependentSteps, CancellationToken cancellationToken) + public override async Task Execute(CancellationToken cancellationToken) { await Task.Run(static () => throw new TestException()); } diff --git a/src/Nethermind/Nethermind.Runner.Test/Ethereum/Steps/RegisterRpcModulesTests.cs b/src/Nethermind/Nethermind.Runner.Test/Ethereum/Steps/RegisterRpcModulesTests.cs index 7ff77d86b60..7a9c32ba605 100644 --- a/src/Nethermind/Nethermind.Runner.Test/Ethereum/Steps/RegisterRpcModulesTests.cs +++ b/src/Nethermind/Nethermind.Runner.Test/Ethereum/Steps/RegisterRpcModulesTests.cs @@ -28,7 +28,7 @@ public async Task Proof_module_is_registered_if_configured() context.ConfigProvider.GetConfig().Returns(jsonRpcConfig); RegisterRpcModules registerRpcModules = new(context); - await registerRpcModules.Execute([], CancellationToken.None); + await registerRpcModules.Execute(CancellationToken.None); context.RpcModuleProvider.Check("proof_call", new JsonRpcContext(RpcEndpoint.Http)).Should().Be(ModuleResolution.Enabled); } @@ -43,7 +43,7 @@ public async Task Proof_module_is_not_registered_when_json_rpc_not_enabled() context.RpcModuleProvider.Enabled.Returns(Array.Empty()); RegisterRpcModules registerRpcModules = new(context); - await registerRpcModules.Execute([], CancellationToken.None); + await registerRpcModules.Execute(CancellationToken.None); context.RpcModuleProvider.DidNotReceiveWithAnyArgs().Register(null); } diff --git a/src/Nethermind/Nethermind.Runner/Ethereum/Steps/StartGrpc.cs b/src/Nethermind/Nethermind.Runner/Ethereum/Steps/StartGrpc.cs index 7f34ec5e190..2fcf82ea9c9 100644 --- a/src/Nethermind/Nethermind.Runner/Ethereum/Steps/StartGrpc.cs +++ b/src/Nethermind/Nethermind.Runner/Ethereum/Steps/StartGrpc.cs @@ -14,7 +14,7 @@ namespace Nethermind.Runner.Ethereum.Steps { [RunnerStepDependencies(typeof(InitializeNetwork))] - public class StartGrpc : InitStep, IStep + public class StartGrpc : IStep { private readonly IApiWithNetwork _api; @@ -23,7 +23,7 @@ public StartGrpc(INethermindApi api) _api = api; } - protected override async Task Setup(CancellationToken cancellationToken) + public async Task Execute(CancellationToken cancellationToken) { IGrpcConfig grpcConfig = _api.Config(); if (grpcConfig.Enabled) diff --git a/src/Nethermind/Nethermind.Runner/Ethereum/Steps/StartRpc.cs b/src/Nethermind/Nethermind.Runner/Ethereum/Steps/StartRpc.cs index e5590d3d950..e3edd8e9528 100644 --- a/src/Nethermind/Nethermind.Runner/Ethereum/Steps/StartRpc.cs +++ b/src/Nethermind/Nethermind.Runner/Ethereum/Steps/StartRpc.cs @@ -21,11 +21,11 @@ namespace Nethermind.Runner.Ethereum.Steps; [RunnerStepDependencies(typeof(InitializeNetwork), typeof(RegisterRpcModules), typeof(RegisterPluginRpcModules))] -public class StartRpc(INethermindApi api) : InitStep, IStep +public class StartRpc(INethermindApi api) : IStep { private readonly INethermindApi _api = api; - protected override async Task Setup(CancellationToken cancellationToken) + public async Task Execute(CancellationToken cancellationToken) { IJsonRpcConfig jsonRpcConfig = _api.Config(); IKeyStoreConfig keyStoreConfig = _api.Config(); From e8801281ca776a76ad53bc4aba246e08f0d02c13 Mon Sep 17 00:00:00 2001 From: ak88 Date: Mon, 3 Feb 2025 22:57:45 +0100 Subject: [PATCH 09/12] throw better message if dependency not found --- .../Nethermind.Init/Steps/EthereumStepsManager.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs b/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs index 6bf9534b73f..0fe1b583087 100644 --- a/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs +++ b/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs @@ -92,7 +92,13 @@ private async Task ExecuteStep(StepWrapper stepWrapper, StepInfo stepInfo, Dicti long startTime = Stopwatch.GetTimestamp(); try { - IEnumerable dependencies = stepInfo.Dependencies.Select(t => steps[t]); + IEnumerable dependencies = []; + foreach (Type type in stepInfo.Dependencies) + { + if (!steps.ContainsKey(type)) + throw new StepDependencyException($"The dependent step {type.Name} for {stepInfo.StepType.Name} was not created."); + dependencies = stepInfo.Dependencies.Select(t => steps[t]); + } await stepWrapper.StartExecute(dependencies, cancellationToken); if (_logger.IsDebug) From 9590c1be35f5f15c5e25b4b1a95587b74254f906 Mon Sep 17 00:00:00 2001 From: ak88 Date: Mon, 3 Feb 2025 23:02:49 +0100 Subject: [PATCH 10/12] test fix --- .../Ethereum/Steps/EthereumStepsManagerTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Nethermind/Nethermind.Runner.Test/Ethereum/Steps/EthereumStepsManagerTests.cs b/src/Nethermind/Nethermind.Runner.Test/Ethereum/Steps/EthereumStepsManagerTests.cs index b496114ec63..716a9754b81 100644 --- a/src/Nethermind/Nethermind.Runner.Test/Ethereum/Steps/EthereumStepsManagerTests.cs +++ b/src/Nethermind/Nethermind.Runner.Test/Ethereum/Steps/EthereumStepsManagerTests.cs @@ -97,7 +97,7 @@ public async Task With_failing_steps() LimboLogs.Instance); using CancellationTokenSource source = new CancellationTokenSource(TimeSpan.FromSeconds(2)); - + source.Cancel(); try { await stepsManager.InitializeAll(source.Token); From 1962c5b127356dea457b91943cc1d6ca09717b2c Mon Sep 17 00:00:00 2001 From: ak88 Date: Tue, 4 Feb 2025 11:00:27 +0100 Subject: [PATCH 11/12] small cleanup --- src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs b/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs index 0fe1b583087..589146dfaf3 100644 --- a/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs +++ b/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs @@ -41,10 +41,9 @@ public async Task InitializeAll(CancellationToken cancellationToken) List allRequiredSteps = CreateAndExecuteSteps(cancellationToken); if (allRequiredSteps.Count == 0) return; - Task current; do { - current = await Task.WhenAny(allRequiredSteps); + Task current = await Task.WhenAny(allRequiredSteps); ReviewFailedAndThrow(current); allRequiredSteps.Remove(current); } while (allRequiredSteps.Any(s => !s.IsCompleted)); From 2c040c8592408e8aa292b02d2275e7502ea9305e Mon Sep 17 00:00:00 2001 From: ak88 Date: Tue, 4 Feb 2025 12:09:19 +0100 Subject: [PATCH 12/12] test fix --- src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs | 4 ++-- .../Ethereum/Steps/EthereumStepsManagerTests.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs b/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs index 589146dfaf3..9616912a6e1 100644 --- a/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs +++ b/src/Nethermind/Nethermind.Init/Steps/EthereumStepsManager.cs @@ -163,11 +163,11 @@ public async Task StartExecute(IEnumerable dependentSteps, Cancella try { await step.Execute(cancellationToken); - _taskCompletedSource.SetResult(); + _taskCompletedSource.TrySetResult(); } catch { - _taskCompletedSource.SetCanceled(); + _taskCompletedSource.TrySetCanceled(); throw; } } diff --git a/src/Nethermind/Nethermind.Runner.Test/Ethereum/Steps/EthereumStepsManagerTests.cs b/src/Nethermind/Nethermind.Runner.Test/Ethereum/Steps/EthereumStepsManagerTests.cs index 716a9754b81..a38fded1cf1 100644 --- a/src/Nethermind/Nethermind.Runner.Test/Ethereum/Steps/EthereumStepsManagerTests.cs +++ b/src/Nethermind/Nethermind.Runner.Test/Ethereum/Steps/EthereumStepsManagerTests.cs @@ -47,7 +47,7 @@ public async Task With_steps_from_here() LimboLogs.Instance); using CancellationTokenSource source = new CancellationTokenSource(TimeSpan.FromSeconds(1)); - + source.Cancel(); try { await stepsManager.InitializeAll(source.Token); @@ -153,7 +153,7 @@ public StepA(NethermindApi runnerContext) } } - [RunnerStepDependencies(typeof(StepC))] + [RunnerStepDependencies(typeof(StepCStandard))] public class StepB : IStep { public Task Execute(CancellationToken cancellationToken)