aboutsummaryrefslogtreecommitdiffstats
path: root/p2p
diff options
context:
space:
mode:
authorPéter Szilágyi <peterke@gmail.com>2015-04-30 20:06:05 +0800
committerPéter Szilágyi <peterke@gmail.com>2015-05-07 20:22:08 +0800
commit3953bf0031b6b2a4302b333aa65fc8ccaa7d788c (patch)
treed69d0db10a4cec268fc44abbfa53d78ab7acfbaa /p2p
parent97c37356fdcfac8b704c3d75b33e322a737c4e55 (diff)
downloaddexon-3953bf0031b6b2a4302b333aa65fc8ccaa7d788c.tar.gz
dexon-3953bf0031b6b2a4302b333aa65fc8ccaa7d788c.tar.zst
dexon-3953bf0031b6b2a4302b333aa65fc8ccaa7d788c.zip
p2p: limit the outbound dialing too
Diffstat (limited to 'p2p')
-rw-r--r--p2p/server.go12
1 files changed, 11 insertions, 1 deletions
diff --git a/p2p/server.go b/p2p/server.go
index 5e0c917fc..5424b5463 100644
--- a/p2p/server.go
+++ b/p2p/server.go
@@ -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)