diff --git a/core/blockchain.go b/core/blockchain.go index ce4a0e90c1..aa99d585f2 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -1226,7 +1226,7 @@ func (bc *BlockChain) stopWithoutSaving() { bc.scope.Close() // Signal shutdown to all goroutines. - bc.StopInsert() + bc.InterruptInsert(true) // Now wait for all chain modifications to end and persistent goroutines to exit. // @@ -1300,16 +1300,15 @@ func (bc *BlockChain) Stop() { log.Info("Blockchain stopped") } -// StopInsert interrupts all insertion methods, causing them to return -// errInsertionInterrupted as soon as possible. Insertion is permanently disabled after -// calling this method. -func (bc *BlockChain) StopInsert() { - bc.procInterrupt.Store(true) -} - -// ResumeInsert re-enables the blockchain insertion, which is used to rewinding the chain to -func (bc *BlockChain) ResumeInsert() { - bc.procInterrupt.Store(false) +// InterruptInsert interrupts all insertion methods, causing them to return +// errInsertionInterrupted as soon as possible, or resume the chain insertion +// if required. +func (bc *BlockChain) InterruptInsert(on bool) { + if on { + bc.procInterrupt.Store(true) + } else { + bc.procInterrupt.Store(false) + } } // insertStopped returns true after StopInsert has been called. diff --git a/eth/api_backend.go b/eth/api_backend.go index 86fc2f81c9..8ec19308f9 100644 --- a/eth/api_backend.go +++ b/eth/api_backend.go @@ -62,10 +62,8 @@ func (b *EthAPIBackend) CurrentBlock() *types.Header { } func (b *EthAPIBackend) SetHead(number uint64) { - b.eth.blockchain.StopInsert() b.eth.handler.downloader.Cancel() b.eth.blockchain.SetHead(number) - b.eth.blockchain.ResumeInsert() } func (b *EthAPIBackend) HeaderByNumber(ctx context.Context, number rpc.BlockNumber) (*types.Header, error) { diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index 8f8f219597..539aaef40e 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -199,8 +199,8 @@ type BlockChain interface { // InsertChain inserts a batch of blocks into the local chain. InsertChain(types.Blocks) (int, error) - // StopInsert interrupts the inserting process. - StopInsert() + // InterruptInsert whether disables the chain insertion. + InterruptInsert(on bool) // InsertReceiptChain inserts a batch of blocks along with their receipts // into the local chain. Blocks older than the specified `ancientLimit` @@ -630,16 +630,15 @@ func (d *Downloader) cancel() { // Cancel aborts all of the operations and waits for all download goroutines to // finish before returning. func (d *Downloader) Cancel() { + d.blockchain.InterruptInsert(true) d.cancel() d.cancelWg.Wait() + d.blockchain.InterruptInsert(false) } // Terminate interrupts the downloader, canceling all pending operations. // The downloader cannot be reused after calling Terminate. func (d *Downloader) Terminate() { - // Signal to stop inserting in-flight blocks - d.blockchain.StopInsert() - // Close the termination channel (make sure double close is allowed) d.quitLock.Lock() select {