From 5ba0dd88808c67bbec937d0e4547dfff23e08513 Mon Sep 17 00:00:00 2001 From: Martin Holst Swende Date: Wed, 15 Jan 2020 09:07:52 +0100 Subject: [PATCH] p2p: wait for goroutine exit, fixes #20558 --- p2p/server.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/p2p/server.go b/p2p/server.go index 9b9effaf6c..41453a0792 100644 --- a/p2p/server.go +++ b/p2p/server.go @@ -864,7 +864,6 @@ func (srv *Server) maxDialedConns() int { // listenLoop runs in its own goroutine and accepts // inbound connections. func (srv *Server) listenLoop() { - defer srv.loopWG.Done() srv.log.Debug("TCP listener up", "addr", srv.listener.Addr()) tokens := defaultMaxPendingPeers @@ -872,6 +871,12 @@ func (srv *Server) listenLoop() { tokens = srv.MaxPendingPeers } slots := make(chan struct{}, tokens) + defer func() { + // Wait for a slot. This is to wait for any goroutine(s) doing srv.SetupConn + // to complete before exiting + <-slots + srv.loopWG.Done() + }() for i := 0; i < tokens; i++ { slots <- struct{}{} }