aboutsummaryrefslogtreecommitdiffstats
path: root/eth/helper_test.go
diff options
context:
space:
mode:
authorFelix Lange <fjl@twurst.com>2016-03-29 09:08:16 +0800
committerFelix Lange <fjl@twurst.com>2016-05-09 19:03:08 +0800
commit56ed6152a11592d20220daf6322e94a009e6236d (patch)
tree0a0d5985832e32fdd1d9c3dc1deff89a85811099 /eth/helper_test.go
parentf821b0188a27bca08cada87c5b746ef9455a2e96 (diff)
downloaddexon-56ed6152a11592d20220daf6322e94a009e6236d.tar
dexon-56ed6152a11592d20220daf6322e94a009e6236d.tar.gz
dexon-56ed6152a11592d20220daf6322e94a009e6236d.tar.bz2
dexon-56ed6152a11592d20220daf6322e94a009e6236d.tar.lz
dexon-56ed6152a11592d20220daf6322e94a009e6236d.tar.xz
dexon-56ed6152a11592d20220daf6322e94a009e6236d.tar.zst
dexon-56ed6152a11592d20220daf6322e94a009e6236d.zip
core, eth, miner: improve shutdown synchronisation
Shutting down geth prints hundreds of annoying error messages in some cases. The errors appear because the Stop method of eth.ProtocolManager, miner.Miner and core.TxPool is asynchronous. Left over peer sessions generate events which are processed after Stop even though the database has already been closed. The fix is to make Stop synchronous using sync.WaitGroup. For eth.ProtocolManager, in order to make use of WaitGroup safe, we need a way to stop new peer sessions from being added while waiting on the WaitGroup. The eth protocol Run function now selects on a signaling channel and adds to the WaitGroup only if ProtocolManager is not shutting down. For miner.worker and core.TxPool the number of goroutines is static, WaitGroup can be used in the usual way without additional synchronisation.
Diffstat (limited to 'eth/helper_test.go')
-rw-r--r--eth/helper_test.go14
1 files changed, 7 insertions, 7 deletions
diff --git a/eth/helper_test.go b/eth/helper_test.go
index 5703d44cc..dacb1593f 100644
--- a/eth/helper_test.go
+++ b/eth/helper_test.go
@@ -140,14 +140,14 @@ func newTestPeer(name string, version int, pm *ProtocolManager, shake bool) (*te
// Start the peer on a new thread
errc := make(chan error, 1)
go func() {
- pm.newPeerCh <- peer
- errc <- pm.handle(peer)
+ select {
+ case pm.newPeerCh <- peer:
+ errc <- pm.handle(peer)
+ case <-pm.quitSync:
+ errc <- p2p.DiscQuitting
+ }
}()
- tp := &testPeer{
- app: app,
- net: net,
- peer: peer,
- }
+ tp := &testPeer{app: app, net: net, peer: peer}
// Execute any implicitly requested handshakes and return
if shake {
td, head, genesis := pm.blockchain.Status()