diff --git a/.editorconfig b/.editorconfig index 3fe398cc..8c092fa0 100644 --- a/.editorconfig +++ b/.editorconfig @@ -9,6 +9,7 @@ dotnet_style_null_propagation = true:warning dotnet_style_prefer_is_null_check_over_reference_equality_method = true:warning dotnet_style_prefer_auto_properties = true:suggestion dotnet_style_object_initializer = true:warning +dotnet_style_collection_initializer = true:suggestion [*.xml] indent_style = space @@ -144,7 +145,7 @@ dotnet_diagnostic.CA1001.severity = suggestion dotnet_diagnostic.CA1028.severity = suggestion # CA1062: Validate arguments of public methods -dotnet_diagnostic.CA1062.severity = suggestion +dotnet_diagnostic.CA1062.severity = silent # CA1308: Normalize strings to uppercase dotnet_diagnostic.CA1308.severity = silent diff --git a/src/MithrilShards.Chain.Bitcoin/Protocol/Processors/AnnouncerProcessor.cs b/src/MithrilShards.Chain.Bitcoin/Protocol/Processors/AnnouncerProcessor.cs index 9fcd75af..959e5965 100644 --- a/src/MithrilShards.Chain.Bitcoin/Protocol/Processors/AnnouncerProcessor.cs +++ b/src/MithrilShards.Chain.Bitcoin/Protocol/Processors/AnnouncerProcessor.cs @@ -62,9 +62,10 @@ protected override ValueTask OnPeerAttachedAsync() /// protected override async ValueTask OnPeerHandshakedAsync() { - HandshakeProcessor.HandshakeProcessorStatus handshakeStatus = PeerContext.Features.Get(); + HandshakeProcessor.HandshakeProcessorStatus handshakeStatus = PeerContext.Features.Get()!; VersionMessage peerVersion = handshakeStatus.PeerVersion!; + logger.LogDebug("Peer {PeerId} handshake completed. Peer version: {PeerVersion}", PeerContext.PeerId, peerVersion); await SendMessageAsync(minVersion: KnownVersion.V70012, new SendHeadersMessage()).ConfigureAwait(false); } diff --git a/src/MithrilShards.Chain.Bitcoin/Protocol/Processors/SynchronizationProcessor.cs b/src/MithrilShards.Chain.Bitcoin/Protocol/Processors/SynchronizationProcessor.cs index 4798de11..ed0ece2a 100644 --- a/src/MithrilShards.Chain.Bitcoin/Protocol/Processors/SynchronizationProcessor.cs +++ b/src/MithrilShards.Chain.Bitcoin/Protocol/Processors/SynchronizationProcessor.cs @@ -85,6 +85,12 @@ public SynchronizationProcessor(ILogger logger, public void OnPeriodicWorkException(IPeriodicWork failedWork, Exception ex, ref IPeriodicWorkExceptionHandler.Feedback feedback) { + ArgumentNullException.ThrowIfNull(failedWork, nameof(failedWork)); + ArgumentNullException.ThrowIfNull(ex, nameof(ex)); + ArgumentNullException.ThrowIfNull(feedback, nameof(feedback)); + + logger.LogError(ex, "Error in {FailedWork}", failedWork); + string? disconnectionReason = failedWork switch { IPeriodicWork work when work == _headerSyncLoop => "Peer header syncing loop had failures.", @@ -116,7 +122,7 @@ protected override ValueTask OnPeerAttachedAsync() /// protected override async ValueTask OnPeerHandshakedAsync() { - HandshakeProcessor.HandshakeProcessorStatus handshakeStatus = PeerContext.Features.Get(); + HandshakeProcessor.HandshakeProcessorStatus handshakeStatus = PeerContext.Features.Get()!; VersionMessage peerVersion = handshakeStatus.PeerVersion!; @@ -195,7 +201,7 @@ got back an empty response. */ HashStop = UInt256.Zero }; - await SendMessageAsync(newGetHeaderRequest).ConfigureAwait(false); + await SendMessageAsync(newGetHeaderRequest, cancellationToken).ConfigureAwait(false); } CheckSyncStallingLocked(bestBlockHeader); diff --git a/src/MithrilShards.Core/Network/PeerContextFactory.cs b/src/MithrilShards.Core/Network/PeerContextFactory.cs index a41150d4..7d702a22 100644 --- a/src/MithrilShards.Core/Network/PeerContextFactory.cs +++ b/src/MithrilShards.Core/Network/PeerContextFactory.cs @@ -28,11 +28,13 @@ public PeerContextFactory(ILogger> logger, public virtual IPeerContext CreateIncomingPeerContext(string peerId, EndPoint localEndPoint, EndPoint remoteEndPoint, INetworkMessageWriter messageWriter) { + _logger.LogTrace("Creating incoming peer context for {PeerId} from {RemoteEndPoint}", peerId, remoteEndPoint); return Create(PeerConnectionDirection.Inbound, peerId, localEndPoint, remoteEndPoint, messageWriter); } public virtual IPeerContext CreateOutgoingPeerContext(string peerId, EndPoint localEndPoint, OutgoingConnectionEndPoint outgoingConnectionEndPoint, INetworkMessageWriter messageWriter) { + _logger.LogTrace("Creating outgoing peer context for {PeerId} to {RemoteEndPoint}", peerId, outgoingConnectionEndPoint.EndPoint); IPeerContext peerContext = Create(PeerConnectionDirection.Outbound, peerId, localEndPoint, outgoingConnectionEndPoint.EndPoint, messageWriter); peerContext.Features.Set(outgoingConnectionEndPoint); diff --git a/src/MithrilShards.Core/Network/Protocol/Processors/NetworkMessageProcessorFactory.cs b/src/MithrilShards.Core/Network/Protocol/Processors/NetworkMessageProcessorFactory.cs index 21dfece1..fdbfc0b3 100644 --- a/src/MithrilShards.Core/Network/Protocol/Processors/NetworkMessageProcessorFactory.cs +++ b/src/MithrilShards.Core/Network/Protocol/Processors/NetworkMessageProcessorFactory.cs @@ -28,10 +28,7 @@ public NetworkMessageProcessorFactory(ILogger l /// The peer context. public async Task StartProcessorsAsync(IPeerContext peerContext) { - if (peerContext is null) - { - ThrowHelper.ThrowArgumentNullException(nameof(peerContext)); - } + ArgumentNullException.ThrowIfNull(peerContext, nameof(peerContext)); IEnumerable processors = _serviceProvider.GetService>()!; foreach (INetworkMessageProcessor processor in processors) @@ -39,6 +36,11 @@ public async Task StartProcessorsAsync(IPeerContext peerContext) // skip processors that aren't enabled if (!processor.Enabled) continue; + if (_logger.IsEnabled(LogLevel.Trace)) + { + _logger.LogTrace("Attaching processor {ProcessorType} to peer {PeerId}", processor.GetType().Name, peerContext.PeerId); + } + peerContext.AttachNetworkMessageProcessor(processor); await processor.AttachAsync(peerContext).ConfigureAwait(false); } @@ -48,6 +50,12 @@ public async Task StartProcessorsAsync(IPeerContext peerContext) public async ValueTask ProcessMessageAsync(INetworkMessage message, IPeerContext peerContext, CancellationToken cancellation) { - await peerContext.Features.Get().ProcessMessageAsync(message, cancellation).ConfigureAwait(false); + ArgumentNullException.ThrowIfNull(message, nameof(message)); + ArgumentNullException.ThrowIfNull(peerContext, nameof(peerContext)); + + var container = peerContext.Features.Get() + ?? throw new InvalidOperationException("PeerNetworkMessageProcessorContainer not found in peer context."); + + await container.ProcessMessageAsync(message, cancellation).ConfigureAwait(false); } } diff --git a/src/MithrilShards.Example/Network/ExamplePeerContextFactory.cs b/src/MithrilShards.Example/Network/ExamplePeerContextFactory.cs index 9d9b4030..9df30586 100644 --- a/src/MithrilShards.Example/Network/ExamplePeerContextFactory.cs +++ b/src/MithrilShards.Example/Network/ExamplePeerContextFactory.cs @@ -30,7 +30,7 @@ public override IPeerContext CreateOutgoingPeerContext(string peerId, EndPoint l /// Since this information may be important to us, we decide to have an explicit property in our so we can /// access that information easily in our code. /// Note that we set that information in our connector. - string myExtraInformation = (string)peerContext.Features.Get().Items[nameof(ExampleEndPoint.MyExtraInformation)]; + string myExtraInformation = (string)peerContext.Features.Get()!.Items[nameof(ExampleEndPoint.MyExtraInformation)]; peerContext.MyExtraInformation = myExtraInformation;