From 3953bf0031b6b2a4302b333aa65fc8ccaa7d788c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= <peterke@gmail.com>
Date: Thu, 30 Apr 2015 15:06:05 +0300
Subject: [PATCH] p2p: limit the outbound dialing too

---
 p2p/server.go | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

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)
-- 
GitLab