diff options
author | Lewis Marshall <lewis@lmars.net> | 2017-12-01 19:49:04 +0800 |
---|---|---|
committer | Felix Lange <fjl@users.noreply.github.com> | 2017-12-01 19:49:04 +0800 |
commit | 54aeb8e4c0bb9f0e7a6c67258af67df3b266af3d (patch) | |
tree | 07bd996822874272ef163bedb56a2ade537cf658 /p2p/dial.go | |
parent | 73067fd24f39cb7d2cdf63a99f6fdac661f7a8bf (diff) | |
download | go-tangerine-54aeb8e4c0bb9f0e7a6c67258af67df3b266af3d.tar go-tangerine-54aeb8e4c0bb9f0e7a6c67258af67df3b266af3d.tar.gz go-tangerine-54aeb8e4c0bb9f0e7a6c67258af67df3b266af3d.tar.bz2 go-tangerine-54aeb8e4c0bb9f0e7a6c67258af67df3b266af3d.tar.lz go-tangerine-54aeb8e4c0bb9f0e7a6c67258af67df3b266af3d.tar.xz go-tangerine-54aeb8e4c0bb9f0e7a6c67258af67df3b266af3d.tar.zst go-tangerine-54aeb8e4c0bb9f0e7a6c67258af67df3b266af3d.zip |
p2p/simulations: various stability fixes (#15198)
p2p/simulations: introduce dialBan
- Refactor simulations/network connection getters to support
avoiding simultaneous dials between two peers If two peers dial
simultaneously, the connection will be dropped to help avoid
that, we essentially lock the connection object with a
timestamp which serves as a ban on dialing for a period of time
(dialBanTimeout).
- The connection getter InitConn can be wrapped and passed to the
nodes via adapters.NodeConfig#Reachable field and then used by
the respective services when they initiate connections. This
massively stablise the emerging connectivity when running with
hundreds of nodes bootstrapping a network.
p2p: add Inbound public method to p2p.Peer
p2p/simulations: Add server id to logs to support debugging
in-memory network simulations when multiple peers are logging.
p2p: SetupConn now returns error. The dialer checks the error and
only calls resolve if the actual TCP dial fails.
Diffstat (limited to 'p2p/dial.go')
-rw-r--r-- | p2p/dial.go | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/p2p/dial.go b/p2p/dial.go index 2d9e3a0ed..8ca3dc5a1 100644 --- a/p2p/dial.go +++ b/p2p/dial.go @@ -291,11 +291,14 @@ func (t *dialTask) Do(srv *Server) { return } } - success := t.dial(srv, t.dest) - // Try resolving the ID of static nodes if dialing failed. - if !success && t.flags&staticDialedConn != 0 { - if t.resolve(srv) { - t.dial(srv, t.dest) + err := t.dial(srv, t.dest) + if err != nil { + log.Trace("Dial error", "task", t, "err", err) + // Try resolving the ID of static nodes if dialing failed. + if _, ok := err.(*dialError); ok && t.flags&staticDialedConn != 0 { + if t.resolve(srv) { + t.dial(srv, t.dest) + } } } } @@ -334,16 +337,18 @@ func (t *dialTask) resolve(srv *Server) bool { return true } +type dialError struct { + error +} + // dial performs the actual connection attempt. -func (t *dialTask) dial(srv *Server, dest *discover.Node) bool { +func (t *dialTask) dial(srv *Server, dest *discover.Node) error { fd, err := srv.Dialer.Dial(dest) if err != nil { - log.Trace("Dial error", "task", t, "err", err) - return false + return &dialError{err} } mfd := newMeteredConn(fd, false) - srv.SetupConn(mfd, t.flags, dest) - return true + return srv.SetupConn(mfd, t.flags, dest) } func (t *dialTask) String() string { |