Skip to content

Commit e1cf171

Browse files
authored
Merge pull request #175 from input-output-hk/feature/fast-sync-bugfix
Fast sync download fix on restart
2 parents 91fc86d + fda1a6c commit e1cf171

File tree

1 file changed

+27
-5
lines changed

1 file changed

+27
-5
lines changed

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

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -149,18 +149,23 @@ trait FastSync {
149149

150150
private var assignedHandlers: Map[ActorRef, ActorRef] = Map.empty
151151

152-
private val syncStateStorageActor= context.actorOf(Props[FastSyncStateActor], "state-storage")
152+
private val syncStateStorageActor = context.actorOf(Props[FastSyncStateActor], "state-storage")
153+
154+
private var requestedMptNodes: Map[ActorRef, Seq[HashType]] = Map.empty
155+
private var requestedNonMptNodes: Map[ActorRef, Seq[HashType]] = Map.empty
156+
private var requestedBlockBodies: Map[ActorRef, Seq[ByteString]] = Map.empty
157+
private var requestedReceipts: Map[ActorRef, Seq[ByteString]] = Map.empty
153158

154159
syncStateStorageActor ! fastSyncStateStorage
155160

156161
private val syncStatePersistCancellable =
157162
scheduler.schedule(persistStateSnapshotInterval, persistStateSnapshotInterval) {
158163
syncStateStorageActor ! SyncState(
159164
initialSyncState.targetBlock,
160-
mptNodesQueue,
161-
nonMptNodesQueue,
162-
blockBodiesQueue,
163-
receiptsQueue,
165+
requestedMptNodes.values.flatten.toSeq.distinct ++ mptNodesQueue,
166+
requestedNonMptNodes.values.flatten.toSeq.distinct ++ nonMptNodesQueue,
167+
requestedBlockBodies.values.flatten.toSeq.distinct ++ blockBodiesQueue,
168+
requestedReceipts.values.flatten.toSeq.distinct ++ receiptsQueue,
164169
downloadedNodesCount,
165170
bestBlockHeaderNumber)
166171
}
@@ -195,11 +200,17 @@ trait FastSync {
195200
case SyncRequestHandler.Done =>
196201
context unwatch sender()
197202
assignedHandlers -= sender()
203+
cleanupRequestedMaps(sender())
198204
processSyncing()
199205

200206
case Terminated(ref) if assignedHandlers.contains(ref) =>
201207
context unwatch ref
202208
assignedHandlers -= ref
209+
mptNodesQueue ++= requestedMptNodes.getOrElse(ref, Nil)
210+
nonMptNodesQueue ++= requestedNonMptNodes.getOrElse(ref, Nil)
211+
blockBodiesQueue ++= requestedBlockBodies.getOrElse(ref, Nil)
212+
receiptsQueue ++= requestedReceipts.getOrElse(ref, Nil)
213+
cleanupRequestedMaps(ref)
203214

204215
case PrintStatus =>
205216
val totalNodesCount = downloadedNodesCount + mptNodesQueue.size + nonMptNodesQueue.size
@@ -209,6 +220,13 @@ trait FastSync {
209220
|State: $downloadedNodesCount/$totalNodesCount known nodes.""".stripMargin.replace("\n", " "))
210221
}
211222

223+
private def cleanupRequestedMaps(handler: ActorRef): Unit = {
224+
requestedMptNodes = requestedMptNodes - handler
225+
requestedNonMptNodes = requestedNonMptNodes - handler
226+
requestedBlockBodies = requestedBlockBodies - handler
227+
requestedReceipts = requestedReceipts - handler
228+
}
229+
212230
private def insertBlocks(requestedHashes: Seq[ByteString], blockBodies: Seq[BlockBody]): Unit = {
213231
//todo this is moved from FastSyncBlockBodiesRequestHandler.scala we should add block validation here
214232
//load header from chain by hash and check consistency with BlockValidator.validateHeaderAndBody
@@ -300,6 +318,7 @@ trait FastSync {
300318
context watch handler
301319
assignedHandlers += (handler -> peer)
302320
receiptsQueue = remainingReceipts
321+
requestedReceipts += handler -> receiptsToGet
303322
}
304323

305324
def requestBlockBodies(peer: ActorRef): Unit = {
@@ -308,6 +327,7 @@ trait FastSync {
308327
context watch handler
309328
assignedHandlers += (handler -> peer)
310329
blockBodiesQueue = remainingBlockBodies
330+
requestedBlockBodies += handler -> blockBodiesToGet
311331
}
312332

313333
def requestBlockHeaders(peer: ActorRef): Unit = {
@@ -331,6 +351,8 @@ trait FastSync {
331351
assignedHandlers += (handler -> peer)
332352
nonMptNodesQueue = remainingNonMptNodes
333353
mptNodesQueue = remainingMptNodes
354+
requestedMptNodes += handler -> mptNodesToGet
355+
requestedNonMptNodes += handler -> nonMptNodesToGet
334356
}
335357

336358
def unassignedPeers: Set[ActorRef] = peersToDownloadFrom.keySet diff assignedHandlers.values.toSet

0 commit comments

Comments
 (0)