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>
This commit is contained in:
Anton Kaliaev 2019-05-01 09:38:26 +04:00 committed by GitHub
parent 40dbad9915
commit 43348022d6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 23 additions and 23 deletions

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, and will attempt to maintain persistent connections with them. If the
we will redial every 5s for a few minutes, then switch to an exponential backoff schedule, connections die, or we fail to dial, we will redial every 5s for a few minutes,
and after about a day of trying, stop dialing the peer. 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 As long as we have less than `MaxNumOutboundPeers`, we periodically request
from each of our own. If sufficient time goes by and we still can't find enough peers, additional peers from each of our own and try seeds.
we try the seeds again.
## Listening ## Listening

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: case errMaxAttemptsToDial, errTooEarlyToDial:
r.Logger.Debug(err.Error(), "addr", addr)
case 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 // 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 // This is done in addition to asking a peer for addresses to work-around
if r.book.NeedMoreAddrs() && len(toDial) == 0 { // peers not participating in PEX.
r.Logger.Info("No addresses to dial. Falling back to seeds") if len(toDial) == 0 {
r.dialSeeds() 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: case errMaxAttemptsToDial, errTooEarlyToDial:
r.Logger.Debug(err.Error(), "addr", addr)
case 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)

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 { if !opErr.Timeout() {
t.Errorf("for %s listener, got unexpected error: have %v, want %v", tc.description, have, want) t.Errorf("for %s listener, got unexpected error: have %v, want Timeout error", tc.description, opErr)
} }
} }
} }