@@ -34,21 +34,21 @@ class FastSyncPivotBlockSelector(
34
34
def idle : Receive = handleCommonMessages orElse { case ChoosePivotBlock =>
35
35
val peersUsedToChooseTarget = peersToDownloadFrom.filter(_._2.forkAccepted)
36
36
37
- if (peersUsedToChooseTarget.size >= minPeersToChooseTargetBlock ) {
37
+ if (peersUsedToChooseTarget.size >= minPeersToChoosePivotBlock ) {
38
38
peersUsedToChooseTarget.foreach { case (peer, PeerInfo (status, _, _, _, _)) =>
39
39
peerEventBus ! Subscribe (MessageClassifier (Set (BlockHeaders .code), PeerSelector .WithId (peer.id)))
40
40
etcPeerManager ! EtcPeerManagerActor .SendMessage (
41
41
GetBlockHeaders (Right (status.bestHash), 1 , 0 , reverse = false ),
42
42
peer.id
43
43
)
44
44
}
45
- log.debug (" Asking {} peers for block headers" , peersUsedToChooseTarget.size)
45
+ log.info (" Asking {} peers for block headers" , peersUsedToChooseTarget.size)
46
46
val timeout = scheduler.scheduleOnce(peerResponseTimeout, self, BlockHeadersTimeout )
47
47
context become waitingForBlockHeaders(peersUsedToChooseTarget.keySet, Map .empty, timeout)
48
48
} else {
49
49
log.info(
50
50
" Cannot pick pivot block. Need at least {} peers, but there are only {} available at the moment. Retrying in {}" ,
51
- minPeersToChooseTargetBlock ,
51
+ minPeersToChoosePivotBlock ,
52
52
peersUsedToChooseTarget.size,
53
53
startRetryInterval
54
54
)
@@ -61,6 +61,12 @@ class FastSyncPivotBlockSelector(
61
61
handleCommonMessages orElse {
62
62
case MessageFromPeer (BlockHeaders (Seq (blockHeader)), peerId) =>
63
63
peerEventBus ! Unsubscribe (MessageClassifier (Set (BlockHeaders .code), PeerSelector .WithId (peerId)))
64
+ log.info(
65
+ s " Received block header [number: {}, hash: {}] from peer: {} " ,
66
+ blockHeader.number,
67
+ blockHeader.hashAsHexString,
68
+ peerId.value
69
+ )
64
70
65
71
val newWaitingFor = waitingFor.filterNot(_.id == peerId)
66
72
@@ -98,12 +104,10 @@ class FastSyncPivotBlockSelector(
98
104
99
105
def tryChooseTargetBlock (receivedHeaders : Map [Peer , BlockHeader ]): Unit = {
100
106
log.debug(" Trying to choose fast sync pivot block. Received {} block headers" , receivedHeaders.size)
101
- if (receivedHeaders.size >= minPeersToChooseTargetBlock) {
102
-
107
+ if (receivedHeaders.size >= minPeersToChoosePivotBlock) {
103
108
val peersWithBestHeaders = receivedHeaders.toList.sortBy(- _._2.number)
104
-
105
109
val bestPeerBestBlockNumber = peersWithBestHeaders.head._2.number
106
- val targetBlock = bestPeerBestBlockNumber - syncConfig.targetBlockOffset
110
+ val targetBlock = ( bestPeerBestBlockNumber - syncConfig.pivotBlockOffset).max( 0 )
107
111
108
112
val peersToAsk = peersWithBestHeaders.takeWhile(_._2.number >= targetBlock).map(_._1)
109
113
@@ -116,12 +120,12 @@ class FastSyncPivotBlockSelector(
116
120
}
117
121
118
122
val timeout = scheduler.scheduleOnce(peerResponseTimeout, self, PivotBlockTimeout )
119
- context become waitingForTargetBlock (peersToAsk.map(_.id).toSet, targetBlock, timeout, Map .empty)
123
+ context become waitingForPivotBlock (peersToAsk.map(_.id).toSet, targetBlock, timeout, Map .empty)
120
124
121
125
} else {
122
126
log.info(
123
127
" Cannot pick pivot block. Need to receive block headers from at least {} peers, but received only from {}. Retrying in {}" ,
124
- minPeersToChooseTargetBlock ,
128
+ minPeersToChoosePivotBlock ,
125
129
receivedHeaders.size,
126
130
startRetryInterval
127
131
)
@@ -130,7 +134,7 @@ class FastSyncPivotBlockSelector(
130
134
}
131
135
}
132
136
133
- def waitingForTargetBlock (
137
+ def waitingForPivotBlock (
134
138
peersToAsk : Set [PeerId ],
135
139
targetBlockNumber : BigInt ,
136
140
timeout : Cancellable ,
@@ -144,23 +148,25 @@ class FastSyncPivotBlockSelector(
144
148
145
149
targetBlockHeaderOpt match {
146
150
case Some (targetBlockHeader) =>
151
+ log.info(" Received vote for {} from {}" , targetBlockHeader.hashAsHexString, peerId.value)
147
152
val newValue = headers.find(_._1 == targetBlockHeader).map(_._2 + 1 ).getOrElse(1 )
148
153
val updatedHeaders = headers.updated(targetBlockHeader, newValue)
149
154
val (mostPopularBlockHeader, votes) = updatedHeaders.maxBy(_._2)
150
- if (votes >= minPeersToChooseTargetBlock ) {
155
+ if (votes >= minPeersToChoosePivotBlock ) {
151
156
timeout.cancel()
152
157
sendResponseAndCleanup(mostPopularBlockHeader)
153
- } else if (updatedPeersToAsk.isEmpty ) {
158
+ } else if (updatedPeersToAsk.size + votes < minPeersToChoosePivotBlock ) {
154
159
timeout.cancel()
160
+ peerEventBus ! Unsubscribe ()
155
161
log.info(" Not enough votes for pivot block. Retrying in {}" , startRetryInterval)
156
162
scheduleRetry(startRetryInterval)
157
163
context become idle
158
164
} else {
159
- context become waitingForTargetBlock (updatedPeersToAsk, targetBlockNumber, timeout, updatedHeaders)
165
+ context become waitingForPivotBlock (updatedPeersToAsk, targetBlockNumber, timeout, updatedHeaders)
160
166
}
161
167
case None =>
162
168
blacklist(peerId, blacklistDuration, " Did not respond with pivot block header, blacklisting" )
163
- context become waitingForTargetBlock (updatedPeersToAsk, targetBlockNumber, timeout, headers)
169
+ context become waitingForPivotBlock (updatedPeersToAsk, targetBlockNumber, timeout, headers)
164
170
}
165
171
case PivotBlockTimeout =>
166
172
peersToAsk.foreach { peerId =>
0 commit comments