diff options
author | Péter Szilágyi <peterke@gmail.com> | 2015-05-04 22:35:49 +0800 |
---|---|---|
committer | Péter Szilágyi <peterke@gmail.com> | 2015-05-07 20:30:56 +0800 |
commit | 4d5a719f256d7dfbaab2cc9c632cd7996067508f (patch) | |
tree | d4841e10035f4fd557ef09f2f4c2f478dc3bf762 /p2p/server.go | |
parent | af932177755f5f839ab29b16dc490d3e1bb3708d (diff) | |
download | dexon-4d5a719f256d7dfbaab2cc9c632cd7996067508f.tar.gz dexon-4d5a719f256d7dfbaab2cc9c632cd7996067508f.tar.zst dexon-4d5a719f256d7dfbaab2cc9c632cd7996067508f.zip |
cmd, eth, p2p: introduce pending peer cli arg, add tests
Diffstat (limited to 'p2p/server.go')
-rw-r--r-- | p2p/server.go | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/p2p/server.go b/p2p/server.go index 164aaba37..77f66f167 100644 --- a/p2p/server.go +++ b/p2p/server.go @@ -22,9 +22,7 @@ const ( refreshPeersInterval = 30 * time.Second staticPeerCheckInterval = 15 * time.Second - // This is the maximum number of inbound connection - // that are allowed to linger between 'accepted' and - // 'added as peer'. + // Maximum number of concurrently handshaking inbound connections. maxAcceptConns = 10 // Maximum number of concurrently dialing outbound connections. @@ -55,6 +53,11 @@ type Server struct { // connected. It must be greater than zero. MaxPeers int + // MaxPendingPeers is the maximum number of peers that can be pending in the + // handshake phase, counted separately for inbound and outbound connections. + // Zero defaults to preset values. + MaxPendingPeers int + // Name sets the node name of this server. // Use common.MakeName to create a name that follows existing conventions. Name string @@ -334,8 +337,12 @@ func (srv *Server) listenLoop() { // This channel acts as a semaphore limiting // active inbound connections that are lingering pre-handshake. // If all slots are taken, no further connections are accepted. - slots := make(chan struct{}, maxAcceptConns) - for i := 0; i < maxAcceptConns; i++ { + tokens := maxAcceptConns + if srv.MaxPendingPeers > 0 { + tokens = srv.MaxPendingPeers + } + slots := make(chan struct{}, tokens) + for i := 0; i < tokens; i++ { slots <- struct{}{} } @@ -405,8 +412,12 @@ func (srv *Server) dialLoop() { defer refresh.Stop() // Limit the number of concurrent dials - slots := make(chan struct{}, maxDialingConns) - for i := 0; i < maxDialingConns; i++ { + tokens := maxAcceptConns + if srv.MaxPendingPeers > 0 { + tokens = srv.MaxPendingPeers + } + slots := make(chan struct{}, tokens) + for i := 0; i < tokens; i++ { slots <- struct{}{} } dial := func(dest *discover.Node) { |