make banTime an argument and set default in PEX reactor instead of AddrBook

This commit is contained in:
Callum Michael Waters
2020-03-11 15:44:22 +01:00
parent 08ccbdcb43
commit 4110c252af
3 changed files with 36 additions and 14 deletions

View File

@@ -22,9 +22,8 @@ import (
)
const (
bucketTypeNew = 0x01
bucketTypeOld = 0x02
defaultBanTime = 24 * time.Hour
bucketTypeNew = 0x01
bucketTypeOld = 0x02
)
// AddrBook is an address book used for tracking peers
@@ -60,7 +59,7 @@ type AddrBook interface {
// Mark address
MarkGood(p2p.ID)
MarkAttempt(*p2p.NetAddress)
MarkBad(*p2p.NetAddress) // Move peer to bad peers list
MarkBad(*p2p.NetAddress, time.Duration) // Move peer to bad peers list
// Add bad peers back to addrBook
ReinstateBadPeers()
@@ -326,11 +325,11 @@ func (a *addrBook) MarkAttempt(addr *p2p.NetAddress) {
// MarkBad implements AddrBook. Kicks address out from book, places
// the address in the badPeers pool.
func (a *addrBook) MarkBad(addr *p2p.NetAddress) {
func (a *addrBook) MarkBad(addr *p2p.NetAddress, banTime time.Duration) {
a.mtx.Lock()
defer a.mtx.Unlock()
if a.addBadPeer(addr) {
if a.addBadPeer(addr, banTime) {
a.removeAddress(addr)
}
}
@@ -751,7 +750,7 @@ func (a *addrBook) removeAddress(addr *p2p.NetAddress) {
a.removeFromAllBuckets(ka)
}
func (a *addrBook) addBadPeer(addr *p2p.NetAddress) bool {
func (a *addrBook) addBadPeer(addr *p2p.NetAddress, banTime time.Duration) bool {
a.mtx.Lock()
defer a.mtx.Unlock()
@@ -761,7 +760,7 @@ func (a *addrBook) addBadPeer(addr *p2p.NetAddress) bool {
if ka != nil {
if _, alreadyBadPeer := a.badPeers[addr.ID]; !alreadyBadPeer {
// add to bad peer list
ka.ban(defaultBanTime)
ka.ban(banTime)
a.badPeers[addr.ID] = ka
}
return true

View File

@@ -3,14 +3,13 @@ package pex
import (
"encoding/hex"
"fmt"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"io/ioutil"
"math"
"os"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/tendermint/tendermint/libs/log"
tmmath "github.com/tendermint/tendermint/libs/math"
tmrand "github.com/tendermint/tendermint/libs/rand"
@@ -343,7 +342,7 @@ func TestAddrBookGetSelectionWithBias(t *testing.T) {
}
}
got, expected := int((float64(good)/float64(len(selection)))*100), (100 - biasTowardsNewAddrs)
got, expected := int((float64(good)/float64(len(selection)))*100), 100-biasTowardsNewAddrs
// compute some slack to protect against small differences due to rounding:
slack := int(math.Round(float64(100) / float64(len(selection))))
@@ -544,6 +543,27 @@ func TestMultipleAddrBookAddressSelection(t *testing.T) {
}
}
//func TestBanBadPeers(t *testing.T) {
// fname := createTempFileName("addrbook_test")
// defer deleteTempFile(fname)
//
// book := NewAddrBook(fname, true)
// book.SetLogger(log.TestingLogger())
//
// addr := randIPv4Address(t)
// book.AddAddress(addr, addr)
//
// book.MarkBad(addr, 1 * time.Second)
//
// assert.False(t, book.HasAddress(addr))
//
// time.Sleep(1 * time.Second)
//
// book.ReinstateBadPeers()
//
// assert.True(t, book.HasAddress(addr))
//}
func assertMOldAndNNewAddrsInSelection(t *testing.T, m, n int, addrs []*p2p.NetAddress, book *addrBook) {
nOld, nNew := countOldAndNewAddrsInSelection(addrs, book)
assert.Equal(t, m, nOld, "old addresses")

View File

@@ -50,6 +50,9 @@ const (
// Especially in the beginning, node should have more trusted peers than
// untrusted.
biasToSelectNewPeers = 30 // 70 to select good peers
// if a peer is marked bad, it will be banned for at least this time period
defaultBanTime = 24 * time.Hour
)
type errMaxAttemptsToDial struct {
@@ -535,7 +538,7 @@ func (r *Reactor) dialPeer(addr *p2p.NetAddress) error {
// failed to connect to. Then we can clean up attemptsToDial, which acts as
// a blacklist currently.
// https://github.com/tendermint/tendermint/issues/3572
r.book.MarkBad(addr)
r.book.MarkBad(addr, defaultBanTime)
return errMaxAttemptsToDial{}
}
@@ -747,7 +750,7 @@ func markAddrInBookBasedOnErr(addr *p2p.NetAddress, book AddrBook, err error) {
// TODO: detect more "bad peer" scenarios
switch err.(type) {
case p2p.ErrSwitchAuthenticationFailure:
book.MarkBad(addr)
book.MarkBad(addr, defaultBanTime)
default:
book.MarkAttempt(addr)
}