diff options
author | Jeffrey Wilcke <jeffrey@ethereum.org> | 2015-08-20 03:55:40 +0800 |
---|---|---|
committer | Jeffrey Wilcke <jeffrey@ethereum.org> | 2015-08-20 03:55:40 +0800 |
commit | 61a6911eebfac5c70959227a8fe0a4e9c2ef5c61 (patch) | |
tree | d64cc534c627b2250e395df588982e61190a7573 /p2p/server.go | |
parent | 382d35bf403ab5dd9b0d2fe3a87c3960902d6e57 (diff) | |
parent | dd54fef89888372ab5961c1b5a6ac917fc47d49c (diff) | |
download | dexon-61a6911eebfac5c70959227a8fe0a4e9c2ef5c61.tar dexon-61a6911eebfac5c70959227a8fe0a4e9c2ef5c61.tar.gz dexon-61a6911eebfac5c70959227a8fe0a4e9c2ef5c61.tar.bz2 dexon-61a6911eebfac5c70959227a8fe0a4e9c2ef5c61.tar.lz dexon-61a6911eebfac5c70959227a8fe0a4e9c2ef5c61.tar.xz dexon-61a6911eebfac5c70959227a8fe0a4e9c2ef5c61.tar.zst dexon-61a6911eebfac5c70959227a8fe0a4e9c2ef5c61.zip |
Merge pull request #1689 from fjl/discover-ignore-temp-errors
p2p, p2p/discover: small fixes
Diffstat (limited to 'p2p/server.go')
-rw-r--r-- | p2p/server.go | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/p2p/server.go b/p2p/server.go index 7351a2654..d8be85323 100644 --- a/p2p/server.go +++ b/p2p/server.go @@ -542,6 +542,10 @@ func (srv *Server) encHandshakeChecks(peers map[discover.NodeID]*Peer, c *conn) } } +type tempError interface { + Temporary() bool +} + // listenLoop runs in its own goroutine and accepts // inbound connections. func (srv *Server) listenLoop() { @@ -561,16 +565,31 @@ func (srv *Server) listenLoop() { } for { + // Wait for a handshake slot before accepting. <-slots - fd, err := srv.listener.Accept() - if err != nil { - return + + var ( + fd net.Conn + err error + ) + for { + fd, err = srv.listener.Accept() + if tempErr, ok := err.(tempError); ok && tempErr.Temporary() { + glog.V(logger.Debug).Infof("Temporary read error: %v", err) + continue + } else if err != nil { + glog.V(logger.Debug).Infof("Read error: %v", err) + return + } + break } - mfd := newMeteredConn(fd, true) + fd = newMeteredConn(fd, true) + glog.V(logger.Debug).Infof("Accepted conn %v\n", fd.RemoteAddr()) - glog.V(logger.Debug).Infof("Accepted conn %v\n", mfd.RemoteAddr()) + // Spawn the handler. It will give the slot back when the connection + // has been established. go func() { - srv.setupConn(mfd, inboundConn, nil) + srv.setupConn(fd, inboundConn, nil) slots <- struct{}{} }() } |