diff --git a/src/Nethermind/Nethermind.Synchronization.Test/BlockDownloaderTests.cs b/src/Nethermind/Nethermind.Synchronization.Test/BlockDownloaderTests.cs index a6204880f77..19e0cd54efd 100644 --- a/src/Nethermind/Nethermind.Synchronization.Test/BlockDownloaderTests.cs +++ b/src/Nethermind/Nethermind.Synchronization.Test/BlockDownloaderTests.cs @@ -632,6 +632,35 @@ public async Task Can_DownloadBlockOutOfOrder(bool isMerge) } + [Test] + public async Task Second_sync_does_not_redownload_blocks() + { + SyncPeerMock syncPeer = new(10, false, Response.AllCorrect); + + await using IContainer node = CreateNode(); + Context ctx = node.Resolve(); + PeerInfo peerInfo = new(syncPeer); + ctx.ConfigureBestPeer(peerInfo); + + await ctx.FullSyncUntilNoRequest(peerInfo); + long afterFirstSync = ctx.BlockTree.BestSuggestedHeader!.Number; + + syncPeer.ExtendTree(20); + + // Simulate 5 blocks arriving via P2P - advances BestKnownNumber without going through BlockDownloader + for (long i = afterFirstSync + 1; i <= afterFirstSync + 5; i++) + { + BlockHeader? header = syncPeer.BlockTree.FindHeader(i, BlockTreeLookupOptions.None); + if (header is not null) ctx.BlockTree.SuggestHeader(header); + } + long bestKnownAfterPropagation = ctx.BlockTree.BestKnownNumber; + + using BlocksRequest? secondRequest = await ctx.FullSyncFeedComponent.Feed.PrepareRequest(); + secondRequest.Should().NotBeNull(); + secondRequest.BodiesRequests.Count.Should().BeGreaterThan(0); + secondRequest.BodiesRequests[0].Number.Should().BeGreaterThan(bestKnownAfterPropagation); + } + private class SlowSealValidator : ISealValidator { public bool ValidateParams(BlockHeader parent, BlockHeader header, bool isUncle = false) diff --git a/src/Nethermind/Nethermind.Synchronization/Blocks/PowForwardHeaderProvider.cs b/src/Nethermind/Nethermind.Synchronization/Blocks/PowForwardHeaderProvider.cs index 44d2f27d097..f84c3528810 100644 --- a/src/Nethermind/Nethermind.Synchronization/Blocks/PowForwardHeaderProvider.cs +++ b/src/Nethermind/Nethermind.Synchronization/Blocks/PowForwardHeaderProvider.cs @@ -83,6 +83,7 @@ private IOwnedReadOnlyList? LastResponseBatch else { if (_logger.IsTrace) _logger.Trace($"No header received"); + _currentBestPeer = null; } if (headers is not null && headers?.Count > MinCachedHeaderBatchSize) LastResponseBatch = headers.ToPooledList(headers.Count);