Skip to content

Commit 42fd619

Browse files
committed
download mpt first
1 parent ee51b10 commit 42fd619

File tree

2 files changed

+25
-6
lines changed

2 files changed

+25
-6
lines changed

src/main/scala/io/iohk/ethereum/blockchain/sync/FastSync.scala

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,8 @@ trait FastSync {
167167

168168
syncStateStorageActor ! fastSyncStateStorage
169169

170+
private var blockChainOnlyPeers = Set.empty[Peer]
171+
170172
private val syncStatePersistCancellable =
171173
scheduler.schedule(persistStateSnapshotInterval, persistStateSnapshotInterval) {
172174
syncStateStorageActor ! SyncState(
@@ -181,7 +183,7 @@ trait FastSync {
181183

182184
private val heartBeat = scheduler.schedule(syncRetryInterval, syncRetryInterval * 2, self, ProcessSyncing)
183185

184-
def receive: Receive = handlePeerUpdates orElse {
186+
def receive: Receive = handlePeerUpdates orElse handleFailingMptPeers orElse {
185187
case EnqueueNodes(hashes) =>
186188
hashes.foreach {
187189
case h: EvmCodeHash => nonMptNodesQueue = h +: nonMptNodesQueue
@@ -227,6 +229,11 @@ trait FastSync {
227229
printStatus()
228230
}
229231

232+
private def handleFailingMptPeers: Receive ={
233+
case BlockChainOnlyDownload(peer) =>
234+
blockChainOnlyPeers = blockChainOnlyPeers + peer
235+
}
236+
230237
private def printStatus() = {
231238
val totalNodesCount = downloadedNodesCount + mptNodesQueue.size + nonMptNodesQueue.size
232239
val formatPeer: (Peer) => String = peer => s"${peer.remoteAddress.getAddress.getHostAddress}:${peer.remoteAddress.getPort}"
@@ -316,22 +323,33 @@ trait FastSync {
316323
scheduler.scheduleOnce(syncRetryInterval, self, ProcessSyncing)
317324
}
318325
} else {
319-
unassignedPeers
326+
val peers = unassignedPeers
327+
(peers -- blockChainOnlyPeers)
320328
.take(maxConcurrentRequests - assignedHandlers.size)
321329
.foreach(assignWork)
330+
peers
331+
.intersect(blockChainOnlyPeers)
332+
.take(maxConcurrentRequests - assignedHandlers.size)
333+
.foreach(assignBlockChainWork)
322334
}
323335
}
324336

325337
def assignWork(peer: Peer): Unit = {
338+
if (nonMptNodesQueue.nonEmpty || mptNodesQueue.nonEmpty) {
339+
requestNodes(peer)
340+
} else {
341+
assignBlockChainWork(peer)
342+
}
343+
}
344+
345+
def assignBlockChainWork(peer: Peer): Unit = {
326346
if (receiptsQueue.nonEmpty) {
327347
requestReceipts(peer)
328348
} else if (blockBodiesQueue.nonEmpty) {
329349
requestBlockBodies(peer)
330350
} else if (context.child(blockHeadersHandlerName).isEmpty &&
331351
initialSyncState.targetBlock.number > bestBlockHeaderNumber) {
332352
requestBlockHeaders(peer)
333-
} else if (nonMptNodesQueue.nonEmpty || mptNodesQueue.nonEmpty) {
334-
requestNodes(peer)
335353
}
336354
}
337355

@@ -423,6 +441,7 @@ object FastSync {
423441
private case object TargetBlockTimeout
424442

425443
private case object ProcessSyncing
444+
case class BlockChainOnlyDownload(peer: Peer)
426445

427446
case class SyncState(
428447
targetBlock: BlockHeader,

src/main/scala/io/iohk/ethereum/blockchain/sync/FastSyncNodesRequestHandler.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ class FastSyncNodesRequestHandler(
2424

2525
override def handleResponseMsg(nodeData: NodeData): Unit = {
2626
if (nodeData.values.isEmpty) {
27-
val reason = s"got empty mpt node response for known hashes: ${requestedHashes.map(h => Hex.toHexString(h.v.toArray[Byte]))}"
28-
syncController ! BlacklistSupport.BlacklistPeer(peer.id, reason)
27+
log.debug(s"got empty mpt node response for known hashes switching to blockchain only: ${requestedHashes.map(h => Hex.toHexString(h.v.toArray[Byte]))}")
28+
syncController ! BlockChainOnlyDownload(peer)
2929
}
3030

3131
val receivedHashes = nodeData.values.map(v => ByteString(kec256(v.toArray[Byte])))

0 commit comments

Comments
 (0)