diff --git a/eth/backend.go b/eth/backend.go index 480730d5d3..38519f4185 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -382,6 +382,7 @@ func (s *Ethereum) Stop() error { s.bloomIndexer.Close() close(s.closeBloomHandler) s.txPool.Close() + s.miner.Close() s.blockchain.Stop() s.engine.Close() diff --git a/miner/miner.go b/miner/miner.go index 07711342d7..82b25d0ebd 100644 --- a/miner/miner.go +++ b/miner/miner.go @@ -107,3 +107,15 @@ func (miner *Miner) GenerateBlock(predicateContext *precompileconfig.PredicateCo func (miner *Miner) SubscribePendingLogs(ch chan<- []*types.Log) event.Subscription { return miner.worker.pendingLogsFeed.Subscribe(ch) } + +func (miner *Miner) Stop() { + miner.worker.stop() +} + +func (miner *Miner) Start() { + miner.worker.start() +} + +func (miner *Miner) Close() { + miner.worker.close() +} diff --git a/plugin/evm/syncervm_test.go b/plugin/evm/syncervm_test.go index 3ecfcb517c..b0179f8b9a 100644 --- a/plugin/evm/syncervm_test.go +++ b/plugin/evm/syncervm_test.go @@ -87,9 +87,9 @@ func TestStateSyncToggleEnabledToDisabled(t *testing.T) { rand.Seed(1) // Hack: registering metrics uses global variables, so we need to disable metrics here so that we can initialize the VM twice. metrics.Enabled = false - defer func() { + t.Cleanup(func() { metrics.Enabled = true - }() + }) var lock sync.Mutex reqCount := 0 @@ -154,12 +154,9 @@ func TestStateSyncToggleEnabledToDisabled(t *testing.T) { ); err != nil { t.Fatal(err) } - - defer func() { - if err := syncDisabledVM.Shutdown(context.Background()); err != nil { - t.Fatal(err) - } - }() + t.Cleanup(func() { + require.NoError(t, syncDisabledVM.Shutdown(context.Background())) + }) if height := syncDisabledVM.LastAcceptedBlockInternal().Height(); height != 0 { t.Fatalf("Unexpected last accepted height: %d", height) @@ -217,6 +214,9 @@ func TestStateSyncToggleEnabledToDisabled(t *testing.T) { ); err != nil { t.Fatal(err) } + t.Cleanup(func() { + require.NoError(t, syncReEnabledVM.Shutdown(context.Background())) + }) // override [serverVM]'s SendAppResponse function to trigger AppResponse on [syncerVM] vmSetup.serverAppSender.SendAppResponseF = func(ctx context.Context, nodeID ids.NodeID, requestID uint32, response []byte) error { diff --git a/plugin/evm/vm_warp_test.go b/plugin/evm/vm_warp_test.go index ec333e4132..5be2e70d18 100644 --- a/plugin/evm/vm_warp_test.go +++ b/plugin/evm/vm_warp_test.go @@ -424,6 +424,8 @@ func TestReceiveWarpMessage(t *testing.T) { true, // RequirePrimaryNetworkSigners ) + // Stop the miner to change the upgrade config to avoid a data race + vm.miner.Stop() vm.chainConfig.UpgradeConfig = params.UpgradeConfig{ PrecompileUpgrades: []params.PrecompileUpgrade{ {Config: enableConfig}, @@ -431,6 +433,7 @@ func TestReceiveWarpMessage(t *testing.T) { {Config: reEnableConfig}, }, } + vm.miner.Start() type test struct { name string