From df219e23df94008a168f1c7cc539c41320527c39 Mon Sep 17 00:00:00 2001
From: Marius van der Wijden <m.vanderwijden@live.de>
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 ec5b4cc08..8cbd70b42 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 447892b19..2ed03a239 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)
-- 
GitLab