Skip to content

Commit 6e68253

Browse files
author
Michal Mrozek
committed
[ETCM-198] Update fastsync to request headers only from peers with best block >= pivot block
1 parent ae398e1 commit 6e68253

File tree

1 file changed

+10
-8
lines changed

1 file changed

+10
-8
lines changed

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

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package io.iohk.ethereum.blockchain.sync
22

33
import java.time.Instant
4-
54
import akka.actor._
65
import akka.util.ByteString
76
import cats.data.NonEmptyList
@@ -25,7 +24,6 @@ import io.iohk.ethereum.network.p2p.messages.PV63._
2524
import io.iohk.ethereum.utils.ByteStringUtils
2625
import io.iohk.ethereum.utils.Config.SyncConfig
2726
import org.bouncycastle.util.encoders.Hex
28-
2927
import scala.annotation.tailrec
3028
import scala.concurrent.ExecutionContext.Implicits.global
3129
import scala.concurrent.duration.{FiniteDuration, _}
@@ -647,24 +645,25 @@ class FastSync(
647645
} else {
648646
val now = Instant.now()
649647
val peers = unassignedPeers
650-
.filter(p => peerRequestsTime.get(p).forall(d => d.plusMillis(fastSyncThrottle.toMillis).isBefore(now)))
648+
.filter(p => peerRequestsTime.get(p.peer).forall(d => d.plusMillis(fastSyncThrottle.toMillis).isBefore(now)))
651649
peers
652650
.take(maxConcurrentRequests - assignedHandlers.size)
653-
.toSeq
654-
.sortBy(_.ref.toString())
651+
.sortBy(_.info.maxBlockNumber)(Ordering[BigInt].reverse)
655652
.foreach(assignBlockchainWork)
656653
}
657654
}
658655

659-
def assignBlockchainWork(peer: Peer): Unit = {
656+
def assignBlockchainWork(peerWithInfo: PeerWithInfo): Unit = {
657+
val PeerWithInfo(peer, peerInfo) = peerWithInfo
660658
if (syncState.receiptsQueue.nonEmpty) {
661659
requestReceipts(peer)
662660
} else if (syncState.blockBodiesQueue.nonEmpty) {
663661
requestBlockBodies(peer)
664662
} else if (
665663
requestedHeaders.isEmpty &&
666664
context.child(BlockHeadersHandlerName).isEmpty &&
667-
syncState.bestBlockHeaderNumber < syncState.safeDownloadTarget
665+
syncState.bestBlockHeaderNumber < syncState.safeDownloadTarget &&
666+
peerInfo.maxBlockNumber >= syncState.pivotBlock.number
668667
) {
669668
requestBlockHeaders(peer)
670669
}
@@ -737,7 +736,8 @@ class FastSync(
737736
peerRequestsTime += (peer -> Instant.now())
738737
}
739738

740-
def unassignedPeers: Set[Peer] = peersToDownloadFrom.keySet diff assignedHandlers.values.toSet
739+
def unassignedPeers: List[PeerWithInfo] =
740+
(peersToDownloadFrom -- assignedHandlers.values).map(PeerWithInfo.tupled).toList
741741

742742
def blockchainDataToDownload: Boolean =
743743
syncState.blockChainWorkQueued || syncState.bestBlockHeaderNumber < syncState.safeDownloadTarget
@@ -768,6 +768,8 @@ class FastSync(
768768

769769
object FastSync {
770770

771+
case class PeerWithInfo(peer: Peer, info: PeerInfo)
772+
771773
// scalastyle:off parameter.number
772774
def props(
773775
fastSyncStateStorage: FastSyncStateStorage,

0 commit comments

Comments
 (0)