miner, test: fix potential goroutine leak #21989
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Description
The bug in miner/worker.go
In miner/worker.go, there are two goroutine using channel
w.newWorkCh
: newWorkerLoop() sends to this channel, and mainLoop() receives from this channel. Only the receive operation is in a select.However,
w.exitCh
may be closed by another goroutine. This is fine for the receive since receive is in select, but if the send operation is blocking, then it will block forever.This commit puts the send in a select, so it won't block even if
w.exitCh
is closed.The bug in eth/downloader/downloader_test.go
Similarly, there are two goroutines using channel
errc
: the parent that runs the test receives from it, and the child created at line 573 sends to it.If the parent goroutine exits too early by calling
t.Fatalf()
at line 614, then the child goroutine will be blocked at line 574 forever.This commit adds 1 buffer to
errc
. Now send will not block, and receive is not influenced because receive still needs to wait for the send.