p2p: limit the outbound dialing too
This commit is contained in:
parent
97c37356fd
commit
3953bf0031
|
@ -27,6 +27,9 @@ const (
|
|||
// 'added as peer'.
|
||||
maxAcceptConns = 50
|
||||
|
||||
// Maximum number of concurrently dialing outbound connections.
|
||||
maxDialingConns = 50
|
||||
|
||||
// total timeout for encryption handshake and protocol
|
||||
// handshake in both directions.
|
||||
handshakeTimeout = 5 * time.Second
|
||||
|
@ -401,7 +404,11 @@ func (srv *Server) dialLoop() {
|
|||
defer srv.loopWG.Done()
|
||||
defer refresh.Stop()
|
||||
|
||||
// TODO: maybe limit number of active dials
|
||||
// Limit the number of concurrent dials
|
||||
slots := make(chan struct{}, maxDialingConns)
|
||||
for i := 0; i < maxDialingConns; i++ {
|
||||
slots <- struct{}{}
|
||||
}
|
||||
dial := func(dest *discover.Node) {
|
||||
// Don't dial nodes that would fail the checks in addPeer.
|
||||
// This is important because the connection handshake is a lot
|
||||
|
@ -413,6 +420,9 @@ func (srv *Server) dialLoop() {
|
|||
if !ok || dialing[dest.ID] {
|
||||
return
|
||||
}
|
||||
// Request a dial slot to prevent CPU exhaustion
|
||||
<-slots
|
||||
defer func() { slots <- struct{}{} }()
|
||||
|
||||
dialing[dest.ID] = true
|
||||
srv.peerWG.Add(1)
|
||||
|
|
Loading…
Reference in New Issue