Skip to content

Commit eef7a33

Browse files
charlesxshholiman
andauthored
core, miner, rpc, eth: fix goroutine leaks in tests (ethereum#24211)
* fix blocking and non-blocking issues * core: revert change in blockchain.go Co-authored-by: Martin Holst Swende <[email protected]>
1 parent ae45c97 commit eef7a33

File tree

9 files changed

+50
-26
lines changed

9 files changed

+50
-26
lines changed

Diff for: core/blockchain_repair_test.go

+10-9
Original file line numberDiff line numberDiff line change
@@ -1779,6 +1779,7 @@ func testRepair(t *testing.T, tt *rewindTest, snapshots bool) {
17791779
SnapshotLimit: 0, // Disable snapshot by default
17801780
}
17811781
)
1782+
defer engine.Close()
17821783
if snapshots {
17831784
config.SnapshotLimit = 256
17841785
config.SnapshotWait = true
@@ -1836,25 +1837,25 @@ func testRepair(t *testing.T, tt *rewindTest, snapshots bool) {
18361837
}
18371838
defer db.Close()
18381839

1839-
chain, err = NewBlockChain(db, nil, params.AllEthashProtocolChanges, engine, vm.Config{}, nil, nil)
1840+
newChain, err := NewBlockChain(db, nil, params.AllEthashProtocolChanges, engine, vm.Config{}, nil, nil)
18401841
if err != nil {
18411842
t.Fatalf("Failed to recreate chain: %v", err)
18421843
}
1843-
defer chain.Stop()
1844+
defer newChain.Stop()
18441845

18451846
// Iterate over all the remaining blocks and ensure there are no gaps
1846-
verifyNoGaps(t, chain, true, canonblocks)
1847-
verifyNoGaps(t, chain, false, sideblocks)
1848-
verifyCutoff(t, chain, true, canonblocks, tt.expCanonicalBlocks)
1849-
verifyCutoff(t, chain, false, sideblocks, tt.expSidechainBlocks)
1847+
verifyNoGaps(t, newChain, true, canonblocks)
1848+
verifyNoGaps(t, newChain, false, sideblocks)
1849+
verifyCutoff(t, newChain, true, canonblocks, tt.expCanonicalBlocks)
1850+
verifyCutoff(t, newChain, false, sideblocks, tt.expSidechainBlocks)
18501851

1851-
if head := chain.CurrentHeader(); head.Number.Uint64() != tt.expHeadHeader {
1852+
if head := newChain.CurrentHeader(); head.Number.Uint64() != tt.expHeadHeader {
18521853
t.Errorf("Head header mismatch: have %d, want %d", head.Number, tt.expHeadHeader)
18531854
}
1854-
if head := chain.CurrentFastBlock(); head.NumberU64() != tt.expHeadFastBlock {
1855+
if head := newChain.CurrentFastBlock(); head.NumberU64() != tt.expHeadFastBlock {
18551856
t.Errorf("Head fast block mismatch: have %d, want %d", head.NumberU64(), tt.expHeadFastBlock)
18561857
}
1857-
if head := chain.CurrentBlock(); head.NumberU64() != tt.expHeadBlock {
1858+
if head := newChain.CurrentBlock(); head.NumberU64() != tt.expHeadBlock {
18581859
t.Errorf("Head block mismatch: have %d, want %d", head.NumberU64(), tt.expHeadBlock)
18591860
}
18601861
if frozen, err := db.(freezer).Ancients(); err != nil {

Diff for: eth/fetcher/block_fetcher_test.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,7 @@ func testSequentialAnnouncements(t *testing.T, light bool) {
364364
hashes, blocks := makeChain(targetBlocks, 0, genesis)
365365

366366
tester := newTester(light)
367+
defer tester.fetcher.Stop()
367368
headerFetcher := tester.makeHeaderFetcher("valid", blocks, -gatherSlack)
368369
bodyFetcher := tester.makeBodyFetcher("valid", blocks, 0)
369370

@@ -743,7 +744,7 @@ func testInvalidNumberAnnouncement(t *testing.T, light bool) {
743744
badBodyFetcher := tester.makeBodyFetcher("bad", blocks, 0)
744745

745746
imported := make(chan interface{})
746-
announced := make(chan interface{})
747+
announced := make(chan interface{}, 2)
747748
tester.fetcher.importedHook = func(header *types.Header, block *types.Block) {
748749
if light {
749750
if header == nil {
@@ -806,6 +807,7 @@ func TestEmptyBlockShortCircuit(t *testing.T) {
806807
hashes, blocks := makeChain(32, 0, genesis)
807808

808809
tester := newTester(false)
810+
defer tester.fetcher.Stop()
809811
headerFetcher := tester.makeHeaderFetcher("valid", blocks, -gatherSlack)
810812
bodyFetcher := tester.makeBodyFetcher("valid", blocks, 0)
811813

Diff for: graphql/graphql_test.go

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ func TestBuildSchema(t *testing.T) {
4848
conf := node.DefaultConfig
4949
conf.DataDir = ddir
5050
stack, err := node.New(&conf)
51+
defer stack.Close()
5152
if err != nil {
5253
t.Fatalf("could not create new node: %v", err)
5354
}

Diff for: internal/jsre/jsre_test.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -83,20 +83,20 @@ func TestNatto(t *testing.T) {
8383

8484
err := jsre.Exec("test.js")
8585
if err != nil {
86-
t.Errorf("expected no error, got %v", err)
86+
t.Fatalf("expected no error, got %v", err)
8787
}
8888
time.Sleep(100 * time.Millisecond)
8989
val, err := jsre.Run("msg")
9090
if err != nil {
91-
t.Errorf("expected no error, got %v", err)
91+
t.Fatalf("expected no error, got %v", err)
9292
}
9393
if val.ExportType().Kind() != reflect.String {
94-
t.Errorf("expected string value, got %v", val)
94+
t.Fatalf("expected string value, got %v", val)
9595
}
9696
exp := "testMsg"
9797
got := val.ToString().String()
9898
if exp != got {
99-
t.Errorf("expected '%v', got '%v'", exp, got)
99+
t.Fatalf("expected '%v', got '%v'", exp, got)
100100
}
101101
jsre.Stop(false)
102102
}

Diff for: miner/miner_test.go

+26-10
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@ func (bc *testBlockChain) SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent)
8080
}
8181

8282
func TestMiner(t *testing.T) {
83-
miner, mux := createMiner(t)
83+
miner, mux, cleanup := createMiner(t)
84+
defer cleanup(false)
8485
miner.Start(common.HexToAddress("0x12345"))
8586
waitForMiningState(t, miner, true)
8687
// Start the downloader
@@ -107,7 +108,8 @@ func TestMiner(t *testing.T) {
107108
// An initial FailedEvent should allow mining to stop on a subsequent
108109
// downloader StartEvent.
109110
func TestMinerDownloaderFirstFails(t *testing.T) {
110-
miner, mux := createMiner(t)
111+
miner, mux, cleanup := createMiner(t)
112+
defer cleanup(false)
111113
miner.Start(common.HexToAddress("0x12345"))
112114
waitForMiningState(t, miner, true)
113115
// Start the downloader
@@ -138,8 +140,8 @@ func TestMinerDownloaderFirstFails(t *testing.T) {
138140
}
139141

140142
func TestMinerStartStopAfterDownloaderEvents(t *testing.T) {
141-
miner, mux := createMiner(t)
142-
143+
miner, mux, cleanup := createMiner(t)
144+
defer cleanup(false)
143145
miner.Start(common.HexToAddress("0x12345"))
144146
waitForMiningState(t, miner, true)
145147
// Start the downloader
@@ -161,7 +163,8 @@ func TestMinerStartStopAfterDownloaderEvents(t *testing.T) {
161163
}
162164

163165
func TestStartWhileDownload(t *testing.T) {
164-
miner, mux := createMiner(t)
166+
miner, mux, cleanup := createMiner(t)
167+
defer cleanup(false)
165168
waitForMiningState(t, miner, false)
166169
miner.Start(common.HexToAddress("0x12345"))
167170
waitForMiningState(t, miner, true)
@@ -174,16 +177,19 @@ func TestStartWhileDownload(t *testing.T) {
174177
}
175178

176179
func TestStartStopMiner(t *testing.T) {
177-
miner, _ := createMiner(t)
180+
miner, _, cleanup := createMiner(t)
181+
defer cleanup(false)
178182
waitForMiningState(t, miner, false)
179183
miner.Start(common.HexToAddress("0x12345"))
180184
waitForMiningState(t, miner, true)
181185
miner.Stop()
182186
waitForMiningState(t, miner, false)
187+
183188
}
184189

185190
func TestCloseMiner(t *testing.T) {
186-
miner, _ := createMiner(t)
191+
miner, _, cleanup := createMiner(t)
192+
defer cleanup(true)
187193
waitForMiningState(t, miner, false)
188194
miner.Start(common.HexToAddress("0x12345"))
189195
waitForMiningState(t, miner, true)
@@ -195,7 +201,8 @@ func TestCloseMiner(t *testing.T) {
195201
// TestMinerSetEtherbase checks that etherbase becomes set even if mining isn't
196202
// possible at the moment
197203
func TestMinerSetEtherbase(t *testing.T) {
198-
miner, mux := createMiner(t)
204+
miner, mux, cleanup := createMiner(t)
205+
defer cleanup(false)
199206
// Start with a 'bad' mining address
200207
miner.Start(common.HexToAddress("0xdead"))
201208
waitForMiningState(t, miner, true)
@@ -230,7 +237,7 @@ func waitForMiningState(t *testing.T, m *Miner, mining bool) {
230237
t.Fatalf("Mining() == %t, want %t", state, mining)
231238
}
232239

233-
func createMiner(t *testing.T) (*Miner, *event.TypeMux) {
240+
func createMiner(t *testing.T) (*Miner, *event.TypeMux, func(skipMiner bool)) {
234241
// Create Ethash config
235242
config := Config{
236243
Etherbase: common.HexToAddress("123456789"),
@@ -259,5 +266,14 @@ func createMiner(t *testing.T) (*Miner, *event.TypeMux) {
259266
// Create event Mux
260267
mux := new(event.TypeMux)
261268
// Create Miner
262-
return New(backend, &config, chainConfig, mux, engine, nil, merger), mux
269+
miner := New(backend, &config, chainConfig, mux, engine, nil, merger)
270+
cleanup := func(skipMiner bool) {
271+
bc.Stop()
272+
engine.Close()
273+
pool.Stop()
274+
if !skipMiner {
275+
miner.Close()
276+
}
277+
}
278+
return miner, mux, cleanup
263279
}

Diff for: miner/worker_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -382,7 +382,7 @@ func testRegenerateMiningBlock(t *testing.T, chainConfig *params.ChainConfig, en
382382
w, b := newTestWorker(t, chainConfig, engine, rawdb.NewMemoryDatabase(), 0)
383383
defer w.close()
384384

385-
var taskCh = make(chan struct{})
385+
var taskCh = make(chan struct{}, 3)
386386

387387
taskIndex := 0
388388
w.newTaskHook = func(task *task) {

Diff for: node/node_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,7 @@ func TestLifecycleTerminationGuarantee(t *testing.T) {
393393
// on the given prefix
394394
func TestRegisterHandler_Successful(t *testing.T) {
395395
node := createNode(t, 7878, 7979)
396-
396+
defer node.Close()
397397
// create and mount handler
398398
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
399399
w.Write([]byte("success"))

Diff for: rpc/client_test.go

+1
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,7 @@ func TestClientReconnect(t *testing.T) {
615615
// Start a server and corresponding client.
616616
s1, l1 := startServer("127.0.0.1:0")
617617
client, err := DialContext(ctx, "ws://"+l1.Addr().String())
618+
defer client.Close()
618619
if err != nil {
619620
t.Fatal("can't dial", err)
620621
}

Diff for: signer/core/api_test.go

+3
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,9 @@ func TestSignTx(t *testing.T) {
256256
if err != nil {
257257
t.Fatal(err)
258258
}
259+
if len(list) == 0 {
260+
t.Fatal("Unexpected empty list")
261+
}
259262
a := common.NewMixedcaseAddress(list[0])
260263

261264
methodSig := "test(uint)"

0 commit comments

Comments
 (0)