Browse Source

pex: various follow-ups (#3605)

* p2p: merge switch cases

also improve the error msg in privval

* pex: refactor code plus update specification

follow-up to https://github.com/tendermint/tendermint/pull/3603

* Update docs/spec/reactors/pex/pex.md

Co-Authored-By: melekes <anton.kalyaev@gmail.com>
pull/3609/head
Anton Kaliaev 6 years ago
committed by GitHub
parent
commit
43348022d6
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 23 additions and 23 deletions
  1. +11
    -8
      docs/spec/reactors/pex/pex.md
  2. +10
    -13
      p2p/pex/pex_reactor.go
  3. +2
    -2
      privval/socket_listeners_test.go

+ 11
- 8
docs/spec/reactors/pex/pex.md View File

@ -21,17 +21,20 @@ inbound (they dialed our public address) or outbound (we dialed them).
## Discovery ## Discovery
Peer discovery begins with a list of seeds. Peer discovery begins with a list of seeds.
When we have no peers, or have been unable to find enough peers from existing ones,
we dial a randomly selected seed to get a list of peers to dial.
When we don't have enough peers, we
1. ask existing peers
2. dial seeds if we're not dialing anyone currently
On startup, we will also immediately dial the given list of `persistent_peers`, On startup, we will also immediately dial the given list of `persistent_peers`,
and will attempt to maintain persistent connections with them. If the connections die, or we fail to dial,
we will redial every 5s for a few minutes, then switch to an exponential backoff schedule,
and after about a day of trying, stop dialing the peer.
and will attempt to maintain persistent connections with them. If the
connections die, or we fail to dial, we will redial every 5s for a few minutes,
then switch to an exponential backoff schedule, and after about a day of
trying, stop dialing the peer.
So long as we have less than `MaxNumOutboundPeers`, we periodically request additional peers
from each of our own. If sufficient time goes by and we still can't find enough peers,
we try the seeds again.
As long as we have less than `MaxNumOutboundPeers`, we periodically request
additional peers from each of our own and try seeds.
## Listening ## Listening


+ 10
- 13
p2p/pex/pex_reactor.go View File

@ -471,9 +471,7 @@ func (r *PEXReactor) ensurePeers() {
err := r.dialPeer(addr) err := r.dialPeer(addr)
if err != nil { if err != nil {
switch err.(type) { switch err.(type) {
case errMaxAttemptsToDial:
r.Logger.Debug(err.Error(), "addr", addr)
case errTooEarlyToDial:
case errMaxAttemptsToDial, errTooEarlyToDial:
r.Logger.Debug(err.Error(), "addr", addr) r.Logger.Debug(err.Error(), "addr", addr)
default: default:
r.Logger.Error(err.Error(), "addr", addr) r.Logger.Error(err.Error(), "addr", addr)
@ -482,8 +480,8 @@ func (r *PEXReactor) ensurePeers() {
}(addr) }(addr)
} }
// If we need more addresses, pick a random peer and ask for more.
if r.book.NeedMoreAddrs() { if r.book.NeedMoreAddrs() {
// 1) Pick a random peer and ask for more.
peers := r.Switch.Peers().List() peers := r.Switch.Peers().List()
peersCount := len(peers) peersCount := len(peers)
if peersCount > 0 { if peersCount > 0 {
@ -491,13 +489,14 @@ func (r *PEXReactor) ensurePeers() {
r.Logger.Info("We need more addresses. Sending pexRequest to random peer", "peer", peer) r.Logger.Info("We need more addresses. Sending pexRequest to random peer", "peer", peer)
r.RequestAddrs(peer) r.RequestAddrs(peer)
} }
}
// If we are not dialing anyone and need more addresses - dial a seed
// This is done in addition to asking a peer for addresses to work-around peers not participating in PEX
if r.book.NeedMoreAddrs() && len(toDial) == 0 {
r.Logger.Info("No addresses to dial. Falling back to seeds")
r.dialSeeds()
// 2) Dial seeds if we are not dialing anyone.
// This is done in addition to asking a peer for addresses to work-around
// peers not participating in PEX.
if len(toDial) == 0 {
r.Logger.Info("No addresses to dial. Falling back to seeds")
r.dialSeeds()
}
} }
} }
@ -664,9 +663,7 @@ func (r *PEXReactor) crawlPeers(addrs []*p2p.NetAddress) {
err := r.dialPeer(addr) err := r.dialPeer(addr)
if err != nil { if err != nil {
switch err.(type) { switch err.(type) {
case errMaxAttemptsToDial:
r.Logger.Debug(err.Error(), "addr", addr)
case errTooEarlyToDial:
case errMaxAttemptsToDial, errTooEarlyToDial:
r.Logger.Debug(err.Error(), "addr", addr) r.Logger.Debug(err.Error(), "addr", addr)
default: default:
r.Logger.Error(err.Error(), "addr", addr) r.Logger.Error(err.Error(), "addr", addr)


+ 2
- 2
privval/socket_listeners_test.go View File

@ -130,8 +130,8 @@ func TestListenerTimeoutReadWrite(t *testing.T) {
t.Errorf("for %s listener, have %v, want %v", tc.description, have, want) t.Errorf("for %s listener, have %v, want %v", tc.description, have, want)
} }
if have, want := opErr.Timeout(), true; have != want {
t.Errorf("for %s listener, got unexpected error: have %v, want %v", tc.description, have, want)
if !opErr.Timeout() {
t.Errorf("for %s listener, got unexpected error: have %v, want Timeout error", tc.description, opErr)
} }
} }
} }

Loading…
Cancel
Save