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