3
3
4
4
using System . Collections . Concurrent ;
5
5
using System . Diagnostics . CodeAnalysis ;
6
+ using System . Runtime . CompilerServices ;
6
7
using Nethermind . Config ;
7
8
using Nethermind . Core ;
8
9
using Nethermind . Core . Crypto ;
@@ -25,6 +26,8 @@ public class DiscoveryManager : IDiscoveryManager
25
26
private readonly INetworkStorage _discoveryStorage ;
26
27
27
28
private readonly ConcurrentDictionary < MessageTypeKey , TaskCompletionSource < DiscoveryMsg > > _waitingEvents = new ( ) ;
29
+ private readonly Func < Hash256 , Node , INodeLifecycleManager > _createNodeLifecycleManager ;
30
+ private readonly Func < Hash256 , Node , INodeLifecycleManager > _createNodeLifecycleManagerPersisted ;
28
31
private IMsgSender ? _msgSender ;
29
32
30
33
public DiscoveryManager (
@@ -41,6 +44,24 @@ public DiscoveryManager(
41
44
_discoveryStorage = discoveryStorage ?? throw new ArgumentNullException ( nameof ( discoveryStorage ) ) ;
42
45
_nodeLifecycleManagerFactory . DiscoveryManager = this ;
43
46
_outgoingMessageRateLimiter = new RateLimiter ( discoveryConfig . MaxOutgoingMessagePerSecond ) ;
47
+ _createNodeLifecycleManager = GetLifecycleManagerFunc ( isPersisted : false ) ;
48
+ _createNodeLifecycleManagerPersisted = GetLifecycleManagerFunc ( isPersisted : true ) ;
49
+ }
50
+
51
+ private Func < Hash256 , Node , INodeLifecycleManager > GetLifecycleManagerFunc ( bool isPersisted )
52
+ {
53
+ return ( _ , node ) =>
54
+ {
55
+ Interlocked . Increment ( ref _managersCreated ) ;
56
+ INodeLifecycleManager manager = _nodeLifecycleManagerFactory . CreateNodeLifecycleManager ( node ) ;
57
+ manager . OnStateChanged += ManagerOnOnStateChanged ;
58
+ if ( ! isPersisted )
59
+ {
60
+ _discoveryStorage . UpdateNodes ( new [ ] { new NetworkNode ( manager . ManagedNode . Id , manager . ManagedNode . Host , manager . ManagedNode . Port , manager . NodeStats . NewPersistedNodeReputation ( DateTime . UtcNow ) ) } ) ;
61
+ }
62
+
63
+ return manager ;
64
+ } ;
44
65
}
45
66
46
67
public IMsgSender MsgSender
@@ -120,18 +141,7 @@ public void OnIncomingMsg(DiscoveryMsg msg)
120
141
return null ;
121
142
}
122
143
123
- return _nodeLifecycleManagers . GetOrAdd ( node . IdHash , _ =>
124
- {
125
- Interlocked . Increment ( ref _managersCreated ) ;
126
- INodeLifecycleManager manager = _nodeLifecycleManagerFactory . CreateNodeLifecycleManager ( node ) ;
127
- manager . OnStateChanged += ManagerOnOnStateChanged ;
128
- if ( ! isPersisted )
129
- {
130
- _discoveryStorage . UpdateNodes ( new [ ] { new NetworkNode ( manager . ManagedNode . Id , manager . ManagedNode . Host , manager . ManagedNode . Port , manager . NodeStats . NewPersistedNodeReputation ( DateTime . UtcNow ) ) } ) ;
131
- }
132
-
133
- return manager ;
134
- } ) ;
144
+ return _nodeLifecycleManagers . GetOrAdd ( node . IdHash , isPersisted ? _createNodeLifecycleManagerPersisted : _createNodeLifecycleManager , node ) ;
135
145
}
136
146
137
147
private void ManagerOnOnStateChanged ( object ? sender , NodeLifecycleState e )
@@ -168,7 +178,8 @@ public async Task SendMessageAsync(DiscoveryMsg discoveryMsg)
168
178
}
169
179
}
170
180
171
- public async Task < bool > WasMessageReceived ( Hash256 senderIdHash , MsgType msgType , int timeout )
181
+ [ AsyncMethodBuilder ( typeof ( PoolingAsyncValueTaskMethodBuilder < > ) ) ]
182
+ public async ValueTask < bool > WasMessageReceived ( Hash256 senderIdHash , MsgType msgType , int timeout )
172
183
{
173
184
TaskCompletionSource < DiscoveryMsg > completionSource = GetCompletionSource ( senderIdHash , ( int ) msgType ) ;
174
185
CancellationTokenSource delayCancellation = new ( ) ;
0 commit comments