Skip to content

Commit 5852359

Browse files
author
Jaap van der Plas
committed
fast sync: extend debugging, fix some issues around branch resolution
1 parent 3cdbf51 commit 5852359

File tree

3 files changed

+55
-16
lines changed

3 files changed

+55
-16
lines changed

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

Lines changed: 49 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,12 @@ class FastSync(
140140
private var requestedBlockBodies: Map[ActorRef, Seq[ByteString]] = Map.empty
141141
private var requestedReceipts: Map[ActorRef, Seq[ByteString]] = Map.empty
142142

143+
private var peerRequestHandlerCount = 0
144+
private def countPeerRequestHandler: Int = {
145+
peerRequestHandlerCount += 1
146+
peerRequestHandlerCount
147+
}
148+
143149
private val syncStateStorageActor = context.actorOf(Props[StateStorageActor](), "state-storage")
144150
syncStateStorageActor ! fastSyncStateStorage
145151

@@ -180,7 +186,7 @@ class FastSync(
180186
syncState = syncState.copy(downloadedNodesCount = saved, totalNodesCount = saved + missing)
181187
}
182188

183-
def receive: Receive = handlePeerListMessages orElse handleStatus orElse {
189+
def receive: Receive = handlePeerListMessages orElse handleStatus orElse handleRequestFailure orElse {
184190
case UpdatePivotBlock(reason) => updatePivotBlock(reason)
185191
case WaitingForNewTargetBlock =>
186192
log.info("State sync stopped until receiving new pivot block")
@@ -192,10 +198,15 @@ class FastSync(
192198
case StateSyncFinished =>
193199
syncState = syncState.copy(stateSyncFinished = true)
194200
processSyncing()
201+
}
202+
203+
def handleRequestFailure: Receive = {
195204
case PeerRequestHandler.RequestFailed(peer, reason) =>
196205
handleRequestFailure(peer, sender(), RequestFailed(reason))
197-
case Terminated(ref) if assignedHandlers.contains(ref) =>
198-
handleRequestFailure(assignedHandlers(ref), ref, PeerActorTerminated)
206+
case Terminated(ref) =>
207+
assignedHandlers.get(ref).foreach {
208+
handleRequestFailure(_, ref, PeerActorTerminated)
209+
}
199210
}
200211

201212
// TODO ETCM-701 will be moved to separate actor and refactored
@@ -342,12 +353,12 @@ class FastSync(
342353
batchFailuresCount += 1
343354
if (batchFailuresCount > fastSyncMaxBatchRetries) {
344355
log.info("Max number of allowed failures reached. Switching branch and master peer.")
356+
currentSkeletonState = None
357+
blockHeadersQueue.dequeueAll(_ => true)
345358
handleRewind(header, masterPeer.get, fastSyncBlockValidationN, blacklistDuration)
346359

347360
// Start branch resolution and wait for response from the FastSyncBranchResolver actor.
348361
context become waitingForBranchResolution
349-
currentSkeletonState = None
350-
blockHeadersQueue.dequeueAll(_ => true)
351362
branchResolver ! FastSyncBranchResolverActor.StartBranchResolver
352363
}
353364
}
@@ -364,8 +375,11 @@ class FastSync(
364375
}
365376
}
366377

367-
private def waitingForBranchResolution: Receive = handleStatus orElse {
378+
private def waitingForBranchResolution: Receive = handleStatus orElse handleRequestFailure orElse {
368379
case FastSyncBranchResolverActor.BranchResolvedSuccessful(firstCommonBlockNumber, newMasterPeer) =>
380+
log.debug(
381+
s"resolved branch with first common block number $firstCommonBlockNumber for new master peer $newMasterPeer"
382+
)
369383
// Reset the batch failures count
370384
batchFailuresCount = 0
371385

@@ -392,7 +406,8 @@ class FastSync(
392406
log.info("Asking for new pivot block")
393407
val pivotBlockSelector = {
394408
context.actorOf(
395-
PivotBlockSelector.props(etcPeerManager, peerEventBus, syncConfig, scheduler, context.self, blacklist)
409+
PivotBlockSelector.props(etcPeerManager, peerEventBus, syncConfig, scheduler, context.self, blacklist),
410+
"pivot-block-selector-update"
396411
)
397412
}
398413
pivotBlockSelector ! PivotBlockSelector.SelectPivotBlock
@@ -410,7 +425,7 @@ class FastSync(
410425
}
411426

412427
def waitingForPivotBlockUpdate(updateReason: PivotBlockUpdateReason): Receive =
413-
handlePeerListMessages orElse handleStatus orElse {
428+
handlePeerListMessages orElse handleStatus orElse handleRequestFailure orElse {
414429
case PivotBlockSelector.Result(pivotBlockHeader)
415430
if newPivotIsGoodEnough(pivotBlockHeader, syncState, updateReason) =>
416431
log.info("New pivot block with number {} received", pivotBlockHeader.number)
@@ -509,7 +524,9 @@ class FastSync(
509524
}
510525

511526
private def removeRequestHandler(handler: ActorRef): Unit = {
527+
log.debug(s"removing request handler ${handler.path}")
512528
context unwatch handler
529+
skeletonHandler = skeletonHandler.filter(_ != handler)
513530
assignedHandlers -= handler
514531
}
515532

@@ -687,6 +704,9 @@ class FastSync(
687704
}
688705

689706
private def handleRequestFailure(peer: Peer, handler: ActorRef, reason: BlacklistReason): Unit = {
707+
if (skeletonHandler == Some(handler))
708+
currentSkeletonState = None
709+
690710
removeRequestHandler(handler)
691711

692712
requestedHeaders.get(peer).foreach(blockHeadersQueue.enqueue)
@@ -818,6 +838,16 @@ class FastSync(
818838

819839
def processSyncing(): Unit = {
820840
FastSyncMetrics.measure(syncState)
841+
log.debug(
842+
"processSyncing: [{}]",
843+
Map(
844+
"fullySynced" -> fullySynced,
845+
"blockchainDataToDownload" -> blockchainDataToDownload,
846+
"noBlockchainWorkRemaining" -> noBlockchainWorkRemaining,
847+
"stateSyncFinished" -> syncState.stateSyncFinished,
848+
"notInTheMiddleOfUpdate" -> notInTheMiddleOfUpdate
849+
)
850+
)
821851
if (fullySynced) {
822852
finish()
823853
} else {
@@ -889,8 +919,9 @@ class FastSync(
889919
requestSkeletonHeaders(peer)
890920
} else {
891921
log.debug(
892-
"Nothing to request. Waiting for responses for [{}] sent requests.",
893-
assignedHandlers.size + skeletonHandler.size
922+
"Nothing to request. Waiting for responses from: {} and/or {}",
923+
assignedHandlers.keys,
924+
skeletonHandler
894925
)
895926
}
896927
}
@@ -913,7 +944,8 @@ class FastSync(
913944
peerEventBus,
914945
requestMsg = GetReceipts(receiptsToGet),
915946
responseMsgCode = Codes.ReceiptsCode
916-
)
947+
),
948+
s"peer-request-handler-receipts-$countPeerRequestHandler"
917949
)
918950

919951
context watch handler
@@ -936,7 +968,8 @@ class FastSync(
936968
peerEventBus,
937969
requestMsg = GetBlockBodies(blockBodiesToGet),
938970
responseMsgCode = Codes.BlockBodiesCode
939-
)
971+
),
972+
s"peer-request-handler-block-bodies-$countPeerRequestHandler"
940973
)
941974

942975
context watch handler
@@ -964,7 +997,8 @@ class FastSync(
964997
peerEventBus,
965998
requestMsg = GetBlockHeaders(Left(toRequest.from), toRequest.limit, skip = 0, reverse = false),
966999
responseMsgCode = Codes.BlockHeadersCode
967-
)
1000+
),
1001+
s"peer-request-handler-block-headers-$countPeerRequestHandler"
9681002
)
9691003

9701004
context watch handler
@@ -1028,7 +1062,8 @@ class FastSync(
10281062
peerEventBus,
10291063
requestMsg = msg,
10301064
responseMsgCode = Codes.BlockHeadersCode
1031-
)
1065+
),
1066+
s"peer-request-handler-block-headers-skeleton-$countPeerRequestHandler"
10321067
)
10331068

10341069
context watch handler

src/main/scala/io/iohk/ethereum/blockchain/sync/fast/FastSyncBranchResolverActor.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,11 @@ class FastSyncBranchResolverActor(
4747

4848
private def waitingForPeerWithHighestBlock: Receive = handlePeerListMessages orElse { case StartBranchResolver =>
4949
getPeerWithHighestBlock match {
50-
case Some(PeerWithInfo(peer, _)) => requestRecentBlockHeaders(peer, blockchain.getBestBlockNumber())
50+
case Some(peerWithInfo @ PeerWithInfo(peer, _)) =>
51+
log.debug(
52+
s"starting branch resolution now with peer = $peerWithInfo and block number ${blockchain.getBestBlockNumber()}"
53+
)
54+
requestRecentBlockHeaders(peer, blockchain.getBestBlockNumber())
5155
case None =>
5256
log.info("Waiting for peers, rescheduling StartBranchResolver")
5357
timers.startSingleTimer(RestartTimerKey, StartBranchResolver, 1.second)

src/main/scala/io/iohk/ethereum/blockchain/sync/fast/PivotBlockSelector.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ class PivotBlockSelector(
7171
} else {
7272
log.info(
7373
"Cannot pick pivot block. Need at least {} peers, but there are only {} which meet the criteria " +
74-
"({} all available at the moment).",
74+
"({} all available at the moment). Best block number = {}",
7575
minPeersToChoosePivotBlock,
7676
correctPeers.size,
7777
peersToDownloadFrom.size,

0 commit comments

Comments
 (0)