@@ -2,7 +2,12 @@ package io.iohk.ethereum.blockchain.sync.fast
2
2
3
3
import akka .actor .{Actor , ActorLogging , ActorRef , Cancellable , Props , Scheduler }
4
4
import akka .util .ByteString
5
- import io .iohk .ethereum .blockchain .sync .{BlacklistSupport , PeerListSupport }
5
+ import io .iohk .ethereum .blockchain .sync .Blacklist .BlacklistReason .{
6
+ InvalidPivotBlockElectionResponse ,
7
+ PivotBlockElectionTimeout
8
+ }
9
+ import io .iohk .ethereum .blockchain .sync .PeerListSupportNg .PeerWithInfo
10
+ import io .iohk .ethereum .blockchain .sync .{Blacklist , PeerListSupportNg }
6
11
import io .iohk .ethereum .domain .BlockHeader
7
12
import io .iohk .ethereum .network .EtcPeerManagerActor .PeerInfo
8
13
import io .iohk .ethereum .network .PeerEventBusActor .PeerEvent .MessageFromPeer
@@ -21,28 +26,26 @@ class PivotBlockSelector(
21
26
val peerEventBus : ActorRef ,
22
27
val syncConfig : SyncConfig ,
23
28
val scheduler : Scheduler ,
24
- fastSync : ActorRef
29
+ fastSync : ActorRef ,
30
+ val blacklist : Blacklist
25
31
) extends Actor
26
32
with ActorLogging
27
- with PeerListSupport
28
- with BlacklistSupport {
33
+ with PeerListSupportNg {
29
34
30
35
import PivotBlockSelector ._
31
36
import syncConfig ._
32
37
33
- def handleCommonMessages : Receive = handlePeerListMessages orElse handleBlacklistMessages
34
-
35
38
override def receive : Receive = idle
36
39
37
- def idle : Receive = handleCommonMessages orElse { case SelectPivotBlock =>
40
+ private def idle : Receive = handlePeerListMessages orElse { case SelectPivotBlock =>
38
41
val election @ ElectionDetails (correctPeers, expectedPivotBlock) = collectVoters
39
42
40
43
if (election.isEnoughVoters(minPeersToChoosePivotBlock)) {
41
44
42
45
val (peersToAsk, waitingPeers) = correctPeers.splitAt(minPeersToChoosePivotBlock + peersToChoosePivotBlockMargin)
43
46
44
47
log.info(
45
- " Trying to choose fast sync pivot block using {} peers ({} correct ones). Ask {} peers for block nr {}" ,
48
+ " Trying to choose fast sync pivot block using {} peers ({} ones with high enough block ). Ask {} peers for block nr {}" ,
46
49
peersToDownloadFrom.size,
47
50
correctPeers.size,
48
51
peersToAsk.size,
@@ -78,7 +81,7 @@ class PivotBlockSelector(
78
81
timeout : Cancellable ,
79
82
headers : Map [ByteString , BlockHeaderWithVotes ]
80
83
): Receive =
81
- handleCommonMessages orElse {
84
+ handlePeerListMessages orElse {
82
85
case MessageFromPeer (blockHeaders : BlockHeaders , peerId) =>
83
86
peerEventBus ! Unsubscribe (MessageClassifier (Set (Codes .BlockHeadersCode ), PeerSelector .WithId (peerId)))
84
87
val updatedPeersToAsk = peersToAsk - peerId
@@ -93,12 +96,12 @@ class PivotBlockSelector(
93
96
val updatedHeaders = headers.updated(targetBlockHeader.hash, newValue)
94
97
votingProcess(updatedPeersToAsk, waitingPeers, pivotBlockNumber, timeout, updatedHeaders)
95
98
case None =>
96
- blacklist(peerId, blacklistDuration, " Did not respond with pivot block header, blacklisting " )
99
+ blacklist.add (peerId, blacklistDuration, InvalidPivotBlockElectionResponse )
97
100
votingProcess(updatedPeersToAsk, waitingPeers, pivotBlockNumber, timeout, headers)
98
101
}
99
102
case ElectionPivotBlockTimeout =>
100
103
peersToAsk.foreach { peerId =>
101
- blacklist(peerId, blacklistDuration, " Did not respond with pivot block header (timeout), blacklisting " )
104
+ blacklist.add (peerId, blacklistDuration, PivotBlockElectionTimeout )
102
105
}
103
106
peerEventBus ! Unsubscribe ()
104
107
log.info(" Pivot block header receive timeout. Retrying in {}" , startRetryInterval)
@@ -155,12 +158,12 @@ class PivotBlockSelector(
155
158
private def isPossibleToReachConsensus (peersLeft : Int , bestHeaderVotes : Int ): Boolean =
156
159
peersLeft + bestHeaderVotes >= minPeersToChoosePivotBlock
157
160
158
- def scheduleRetry (interval : FiniteDuration ): Unit = {
161
+ private def scheduleRetry (interval : FiniteDuration ): Unit = {
159
162
scheduler.scheduleOnce(interval, self, SelectPivotBlock )
160
163
context become idle
161
164
}
162
165
163
- def sendResponseAndCleanup (pivotBlockHeader : BlockHeader ): Unit = {
166
+ private def sendResponseAndCleanup (pivotBlockHeader : BlockHeader ): Unit = {
164
167
log.info(" Found pivot block: {} hash: {}" , pivotBlockHeader.number, pivotBlockHeader.hashAsHexString)
165
168
fastSync ! Result (pivotBlockHeader)
166
169
peerEventBus ! Unsubscribe ()
@@ -176,8 +179,9 @@ class PivotBlockSelector(
176
179
}
177
180
178
181
private def collectVoters : ElectionDetails = {
179
- val peersUsedToChooseTarget = peersToDownloadFrom.collect { case (peer, PeerInfo (_, _, true , maxBlockNumber, _)) =>
180
- (peer, maxBlockNumber)
182
+ val peersUsedToChooseTarget = peersToDownloadFrom.collect {
183
+ case (_, PeerWithInfo (peer, PeerInfo (_, _, true , maxBlockNumber, _))) =>
184
+ (peer, maxBlockNumber)
181
185
}
182
186
183
187
val peersSortedByBestNumber = peersUsedToChooseTarget.toList.sortBy { case (_, number) => - number }
@@ -199,9 +203,10 @@ object PivotBlockSelector {
199
203
peerEventBus : ActorRef ,
200
204
syncConfig : SyncConfig ,
201
205
scheduler : Scheduler ,
202
- fastSync : ActorRef
206
+ fastSync : ActorRef ,
207
+ blacklist : Blacklist
203
208
): Props =
204
- Props (new PivotBlockSelector (etcPeerManager : ActorRef , peerEventBus, syncConfig, scheduler, fastSync))
209
+ Props (new PivotBlockSelector (etcPeerManager : ActorRef , peerEventBus, syncConfig, scheduler, fastSync, blacklist ))
205
210
206
211
case object SelectPivotBlock
207
212
case class Result (targetBlockHeader : BlockHeader )
0 commit comments