diff options
author | Péter Szilágyi <peterke@gmail.com> | 2015-04-30 20:06:05 +0800 |
---|---|---|
committer | Péter Szilágyi <peterke@gmail.com> | 2015-05-07 20:22:08 +0800 |
commit | 3953bf0031b6b2a4302b333aa65fc8ccaa7d788c (patch) | |
tree | d69d0db10a4cec268fc44abbfa53d78ab7acfbaa /p2p/server.go | |
parent | 97c37356fdcfac8b704c3d75b33e322a737c4e55 (diff) | |
download | go-tangerine-3953bf0031b6b2a4302b333aa65fc8ccaa7d788c.tar.gz go-tangerine-3953bf0031b6b2a4302b333aa65fc8ccaa7d788c.tar.zst go-tangerine-3953bf0031b6b2a4302b333aa65fc8ccaa7d788c.zip |
p2p: limit the outbound dialing too
Diffstat (limited to 'p2p/server.go')
-rw-r--r-- | p2p/server.go | 12 |
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) |