Переглянути джерело

miner: fix regression, add test for starting while download (#21547)

Fixes a regression introduced in #21536
Marius van der Wijden 5 роки тому
батько
коміт
df219e23df
2 змінених файлів з 22 додано та 2 видалено
  1. 9 2
      miner/miner.go
  2. 13 0
      miner/miner_test.go

+ 9 - 2
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()

+ 13 - 0
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)