@@ -20,8 +20,13 @@ import io.iohk.ethereum.network.p2p.messages.WireProtocol.Disconnect
20
20
* In order to do so it receives events for peer creation, disconnection and new messages being sent and
21
21
* received by each peer.
22
22
*/
23
- class EtcPeerManagerActor (peerManagerActor : ActorRef , peerEventBusActor : ActorRef , appStateStorage : AppStateStorage ,
24
- forkResolverOpt : Option [ForkResolver ]) extends Actor with ActorLogging {
23
+ class EtcPeerManagerActor (
24
+ peerManagerActor : ActorRef ,
25
+ peerEventBusActor : ActorRef ,
26
+ appStateStorage : AppStateStorage ,
27
+ forkResolverOpt : Option [ForkResolver ]
28
+ ) extends Actor
29
+ with ActorLogging {
25
30
26
31
private type PeersWithInfo = Map [PeerId , PeerWithInfo ]
27
32
@@ -42,6 +47,7 @@ class EtcPeerManagerActor(peerManagerActor: ActorRef, peerEventBusActor: ActorRe
42
47
val peerBestBlockIsItsGenesisBlock = peerInfo.bestBlockHash == peerInfo.remoteStatus.genesisHash
43
48
peerBestBlockIsItsGenesisBlock || (! peerBestBlockIsItsGenesisBlock && peerInfo.maxBlockNumber > 0 )
44
49
}
50
+
45
51
/**
46
52
* Processes both messages for sending messages and for requesting peer information
47
53
*
@@ -56,10 +62,11 @@ class EtcPeerManagerActor(peerManagerActor: ActorRef, peerEventBusActor: ActorRe
56
62
})
57
63
58
64
case PeerInfoRequest (peerId) =>
59
- val peerInfoOpt = peersWithInfo.get(peerId).map{ case PeerWithInfo (_, peerInfo) => peerInfo}
65
+ val peerInfoOpt = peersWithInfo.get(peerId).map { case PeerWithInfo (_, peerInfo) => peerInfo }
60
66
sender() ! PeerInfoResponse (peerInfoOpt)
61
67
62
68
case EtcPeerManagerActor .SendMessage (message, peerId) =>
69
+ NetworkMetrics .SentMessagesCounter .increment()
63
70
val newPeersWithInfo = updatePeersWithInfo(peersWithInfo, peerId, message.underlyingMsg, handleSentMessage)
64
71
peerManagerActor ! PeerManagerActor .SendMessage (message, peerId)
65
72
context become handleMessages(newPeersWithInfo)
@@ -74,6 +81,7 @@ class EtcPeerManagerActor(peerManagerActor: ActorRef, peerEventBusActor: ActorRe
74
81
75
82
case MessageFromPeer (message, peerId) if peersWithInfo.contains(peerId) =>
76
83
val newPeersWithInfo = updatePeersWithInfo(peersWithInfo, peerId, message, handleReceivedMessage)
84
+ NetworkMetrics .ReceivedMessagesCounter .increment()
77
85
context become handleMessages(newPeersWithInfo)
78
86
79
87
case PeerHandshakeSuccessful (peer, peerInfo : PeerInfo ) =>
@@ -82,11 +90,13 @@ class EtcPeerManagerActor(peerManagerActor: ActorRef, peerEventBusActor: ActorRe
82
90
83
91
// Ask for the highest block from the peer
84
92
peer.ref ! SendMessage (GetBlockHeaders (Right (peerInfo.remoteStatus.bestHash), 1 , 0 , false ))
93
+ NetworkMetrics .registerAddHandshakedPeer(peer)
85
94
context become handleMessages(peersWithInfo + (peer.id -> PeerWithInfo (peer, peerInfo)))
86
95
87
96
case PeerDisconnected (peerId) if peersWithInfo.contains(peerId) =>
88
97
peerEventBusActor ! Unsubscribe (PeerDisconnectedClassifier (PeerSelector .WithId (peerId)))
89
98
peerEventBusActor ! Unsubscribe (MessageClassifier (msgCodesWithInfo, PeerSelector .WithId (peerId)))
99
+ NetworkMetrics .registerRemoveHandshakedPeer(peersWithInfo(peerId).peer)
90
100
context become handleMessages(peersWithInfo - peerId)
91
101
92
102
}
@@ -100,9 +110,13 @@ class EtcPeerManagerActor(peerManagerActor: ActorRef, peerEventBusActor: ActorRe
100
110
* @param messageHandler for processing the message and obtaining the new peerInfo
101
111
* @return new information for each peer
102
112
*/
103
- private def updatePeersWithInfo (peers : PeersWithInfo , peerId : PeerId , message : Message ,
104
- messageHandler : (Message , PeerWithInfo ) => PeerInfo ): PeersWithInfo = {
105
- if (peers.contains(peerId)){
113
+ private def updatePeersWithInfo (
114
+ peers : PeersWithInfo ,
115
+ peerId : PeerId ,
116
+ message : Message ,
117
+ messageHandler : (Message , PeerWithInfo ) => PeerInfo
118
+ ): PeersWithInfo = {
119
+ if (peers.contains(peerId)) {
106
120
val peerWithInfo = peers(peerId)
107
121
val newPeerInfo = messageHandler(message, peerWithInfo)
108
122
peers + (peerId -> peerWithInfo.copy(peerInfo = newPeerInfo))
@@ -130,11 +144,9 @@ class EtcPeerManagerActor(peerManagerActor: ActorRef, peerEventBusActor: ActorRe
130
144
private def handleReceivedMessage (message : Message , initialPeerWithInfo : PeerWithInfo ): PeerInfo = {
131
145
(updateTotalDifficulty(message) _
132
146
andThen updateForkAccepted(message, initialPeerWithInfo.peer)
133
- andThen updateMaxBlock(message)
134
- )(initialPeerWithInfo.peerInfo)
147
+ andThen updateMaxBlock(message))(initialPeerWithInfo.peerInfo)
135
148
}
136
149
137
-
138
150
/**
139
151
* Processes the message and updates the total difficulty of the peer
140
152
*
@@ -217,11 +229,13 @@ object EtcPeerManagerActor {
217
229
218
230
val msgCodesWithInfo : Set [Int ] = Set (BlockHeaders .code, NewBlock .code, NewBlockHashes .code)
219
231
220
- case class PeerInfo (remoteStatus : Status ,
221
- totalDifficulty : BigInt ,
222
- forkAccepted : Boolean ,
223
- maxBlockNumber : BigInt ,
224
- bestBlockHash : ByteString ) extends HandshakeResult {
232
+ case class PeerInfo (
233
+ remoteStatus : Status ,
234
+ totalDifficulty : BigInt ,
235
+ forkAccepted : Boolean ,
236
+ maxBlockNumber : BigInt ,
237
+ bestBlockHash : ByteString
238
+ ) extends HandshakeResult {
225
239
226
240
def withTotalDifficulty (totalDifficulty : BigInt ): PeerInfo = copy(totalDifficulty = totalDifficulty)
227
241
@@ -253,8 +267,12 @@ object EtcPeerManagerActor {
253
267
254
268
case class SendMessage (message : MessageSerializable , peerId : PeerId )
255
269
256
- def props (peerManagerActor : ActorRef , peerEventBusActor : ActorRef ,
257
- appStateStorage : AppStateStorage , forkResolverOpt : Option [ForkResolver ]): Props =
270
+ def props (
271
+ peerManagerActor : ActorRef ,
272
+ peerEventBusActor : ActorRef ,
273
+ appStateStorage : AppStateStorage ,
274
+ forkResolverOpt : Option [ForkResolver ]
275
+ ): Props =
258
276
Props (new EtcPeerManagerActor (peerManagerActor, peerEventBusActor, appStateStorage, forkResolverOpt))
259
277
260
278
}
0 commit comments