From 896113e436168abe5868acf74cbfcd80d5a4083d Mon Sep 17 00:00:00 2001 From: jsvisa Date: Thu, 26 Jun 2025 23:50:57 +0800 Subject: [PATCH] eth: reset skeleton after chain rewinded Signed-off-by: jsvisa --- eth/api_backend.go | 1 + eth/downloader/downloader.go | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/eth/api_backend.go b/eth/api_backend.go index 766a99fc1e..0cf10ca000 100644 --- a/eth/api_backend.go +++ b/eth/api_backend.go @@ -63,6 +63,7 @@ func (b *EthAPIBackend) CurrentBlock() *types.Header { func (b *EthAPIBackend) SetHead(number uint64) { b.eth.handler.downloader.Cancel() + b.eth.handler.downloader.ResetSkeleton() b.eth.blockchain.SetHead(number) } diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index 020dd7314b..25989b1a50 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -662,6 +662,13 @@ func (d *Downloader) Cancel() { d.blockchain.InterruptInsert(false) } +// ResetSkeleton terminates the skeleton syncer and reinitializes it. +func (d *Downloader) ResetSkeleton() { + d.skeleton.Terminate() + rawdb.DeleteSkeletonSyncStatus(d.stateDB) + d.skeleton = newSkeleton(d.stateDB, d.peers, d.dropPeer, d.skeleton.filler) +} + // Terminate interrupts the downloader, canceling all pending operations. // The downloader cannot be reused after calling Terminate. func (d *Downloader) Terminate() {