Commit 3953bf00 authored by Péter Szilágyi's avatar Péter Szilágyi

p2p: limit the outbound dialing too

parent 97c37356
...@@ -27,6 +27,9 @@ const ( ...@@ -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() { ...@@ -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() { ...@@ -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)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment