aboutsummaryrefslogtreecommitdiffstats
path: root/p2p/server.go
diff options
context:
space:
mode:
authorJeffrey Wilcke <jeffrey@ethereum.org>2015-08-20 03:55:40 +0800
committerJeffrey Wilcke <jeffrey@ethereum.org>2015-08-20 03:55:40 +0800
commit61a6911eebfac5c70959227a8fe0a4e9c2ef5c61 (patch)
treed64cc534c627b2250e395df588982e61190a7573 /p2p/server.go
parent382d35bf403ab5dd9b0d2fe3a87c3960902d6e57 (diff)
parentdd54fef89888372ab5961c1b5a6ac917fc47d49c (diff)
downloaddexon-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.go31
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{}{}
}()
}