From df219e23df94008a168f1c7cc539c41320527c39 Mon Sep 17 00:00:00 2001 From: Marius van der Wijden Date: Fri, 11 Sep 2020 18:17:09 +0200 Subject: [PATCH] miner: fix regression, add test for starting while download (#21547) Fixes a regression introduced in #21536 --- miner/miner.go | 11 +++++++++-- miner/miner_test.go | 13 +++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/miner/miner.go b/miner/miner.go index ec5b4cc085..8cbd70b424 100644 --- a/miner/miner.go +++ b/miner/miner.go @@ -88,6 +88,7 @@ func (miner *Miner) update() { defer events.Unsubscribe() shouldStart := false + canStart := true for { select { case ev := <-events.Chan(): @@ -98,21 +99,27 @@ func (miner *Miner) update() { case downloader.StartEvent: wasMining := miner.Mining() miner.worker.stop() + canStart = false if wasMining { // Resume mining after sync was finished shouldStart = true log.Info("Mining aborted due to sync") } case downloader.DoneEvent, downloader.FailedEvent: + canStart = true if shouldStart { miner.SetEtherbase(miner.coinbase) miner.worker.start() } } case addr := <-miner.startCh: - miner.SetEtherbase(addr) - miner.worker.start() + if canStart { + miner.SetEtherbase(addr) + miner.worker.start() + } + shouldStart = true case <-miner.stopCh: + shouldStart = false miner.worker.stop() case <-miner.exitCh: miner.worker.close() diff --git a/miner/miner_test.go b/miner/miner_test.go index 447892b198..2ed03a2397 100644 --- a/miner/miner_test.go +++ b/miner/miner_test.go @@ -97,6 +97,19 @@ func TestMiner(t *testing.T) { waitForMiningState(t, miner, true) } +func TestStartWhileDownload(t *testing.T) { + miner, mux := createMiner(t) + waitForMiningState(t, miner, false) + miner.Start(common.HexToAddress("0x12345")) + waitForMiningState(t, miner, true) + // Stop the downloader and wait for the update loop to run + mux.Post(downloader.StartEvent{}) + waitForMiningState(t, miner, false) + // Starting the miner after the downloader should not work + miner.Start(common.HexToAddress("0x12345")) + waitForMiningState(t, miner, false) +} + func TestStartStopMiner(t *testing.T) { miner, _ := createMiner(t) waitForMiningState(t, miner, false)