mirror of
https://github.com/fluencelabs/tendermint
synced 2025-06-06 10:01:19 +00:00
commit
43a0c253f8
@ -144,6 +144,7 @@ func (a *AddrBook) Stop() {
|
|||||||
func (a *AddrBook) AddOurAddress(addr *NetAddress) {
|
func (a *AddrBook) AddOurAddress(addr *NetAddress) {
|
||||||
a.mtx.Lock()
|
a.mtx.Lock()
|
||||||
defer a.mtx.Unlock()
|
defer a.mtx.Unlock()
|
||||||
|
log.Debug("Add our address to book", "addr", addr)
|
||||||
a.ourAddrs[addr.String()] = addr
|
a.ourAddrs[addr.String()] = addr
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -158,6 +159,7 @@ func (a *AddrBook) OurAddresses() []*NetAddress {
|
|||||||
func (a *AddrBook) AddAddress(addr *NetAddress, src *NetAddress) {
|
func (a *AddrBook) AddAddress(addr *NetAddress, src *NetAddress) {
|
||||||
a.mtx.Lock()
|
a.mtx.Lock()
|
||||||
defer a.mtx.Unlock()
|
defer a.mtx.Unlock()
|
||||||
|
log.Debug("Add address to book", "addr", addr, "src", src)
|
||||||
a.addAddress(addr, src)
|
a.addAddress(addr, src)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -334,7 +336,7 @@ func (a *AddrBook) loadFromFile(filePath string) {
|
|||||||
// If doesn't exist, do nothing.
|
// If doesn't exist, do nothing.
|
||||||
_, err := os.Stat(filePath)
|
_, err := os.Stat(filePath)
|
||||||
if os.IsNotExist(err) {
|
if os.IsNotExist(err) {
|
||||||
return
|
panic(Fmt("File does not exist: %v", filePath))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load addrBookJSON{}
|
// Load addrBookJSON{}
|
||||||
@ -546,7 +548,7 @@ func (a *AddrBook) addAddress(addr, src *NetAddress) {
|
|||||||
bucket := a.calcNewBucket(addr, src)
|
bucket := a.calcNewBucket(addr, src)
|
||||||
a.addToNewBucket(ka, bucket)
|
a.addToNewBucket(ka, bucket)
|
||||||
|
|
||||||
log.Info(Fmt("Added new address %s for a total of %d addresses", addr, a.size()))
|
log.Info("Added new address", "address", addr, "total", a.size())
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make space in the new buckets by expiring the really bad entries.
|
// Make space in the new buckets by expiring the really bad entries.
|
||||||
|
@ -70,12 +70,13 @@ func (ps *PeerSet) Remove(peer *Peer) {
|
|||||||
// If it's the last peer, that's an easy special case.
|
// If it's the last peer, that's an easy special case.
|
||||||
if index == len(ps.list)-1 {
|
if index == len(ps.list)-1 {
|
||||||
ps.list = newList
|
ps.list = newList
|
||||||
|
delete(ps.lookup, peer.Key)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// Move the last item from ps.list to "index" in list.
|
// Move the last item from ps.list to "index" in list.
|
||||||
lastPeer := ps.list[len(ps.list)-1]
|
lastPeer := ps.list[len(ps.list)-1]
|
||||||
lastPeerAddr := lastPeer.mconn.RemoteAddress.String()
|
lastPeerKey := lastPeer.Key
|
||||||
lastPeerItem := ps.lookup[lastPeerAddr]
|
lastPeerItem := ps.lookup[lastPeerKey]
|
||||||
newList[index] = lastPeer
|
newList[index] = lastPeer
|
||||||
lastPeerItem.index = index
|
lastPeerItem.index = index
|
||||||
ps.list = newList
|
ps.list = newList
|
||||||
|
63
p2p/peer_set_test.go
Normal file
63
p2p/peer_set_test.go
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
package p2p
|
||||||
|
|
||||||
|
import (
|
||||||
|
"math/rand"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
. "github.com/tendermint/tendermint/common"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Returns an empty dummy peer
|
||||||
|
func randPeer() *Peer {
|
||||||
|
return &Peer{
|
||||||
|
Key: Fmt("%v.%v.%v.%v:%v", rand.Int()%256, rand.Int()%256, rand.Int()%256, rand.Int()%256, rand.Int()%10000+80),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAddRemoveOne(t *testing.T) {
|
||||||
|
peerSet := NewPeerSet()
|
||||||
|
|
||||||
|
peer := randPeer()
|
||||||
|
added := peerSet.Add(peer)
|
||||||
|
if !added {
|
||||||
|
t.Errorf("Failed to add new peer")
|
||||||
|
}
|
||||||
|
if peerSet.Size() != 1 {
|
||||||
|
t.Errorf("Failed to add new peer and increment size")
|
||||||
|
}
|
||||||
|
|
||||||
|
peerSet.Remove(peer)
|
||||||
|
if peerSet.Has(peer.Key) {
|
||||||
|
t.Errorf("Failed to remove peer")
|
||||||
|
}
|
||||||
|
if peerSet.Size() != 0 {
|
||||||
|
t.Errorf("Failed to remove peer and decrement size")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAddRemoveMany(t *testing.T) {
|
||||||
|
peerSet := NewPeerSet()
|
||||||
|
|
||||||
|
peers := []*Peer{}
|
||||||
|
for i := 0; i < 100; i++ {
|
||||||
|
peer := randPeer()
|
||||||
|
added := peerSet.Add(peer)
|
||||||
|
if !added {
|
||||||
|
t.Errorf("Failed to add new peer")
|
||||||
|
}
|
||||||
|
if peerSet.Size() != i+1 {
|
||||||
|
t.Errorf("Failed to add new peer and increment size")
|
||||||
|
}
|
||||||
|
peers = append(peers, peer)
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, peer := range peers {
|
||||||
|
peerSet.Remove(peer)
|
||||||
|
if peerSet.Has(peer.Key) {
|
||||||
|
t.Errorf("Failed to remove peer")
|
||||||
|
}
|
||||||
|
if peerSet.Size() != len(peers)-i-1 {
|
||||||
|
t.Errorf("Failed to remove peer and decrement size")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -105,12 +105,7 @@ func (pexR *PEXReactor) Receive(chId byte, src *Peer, msgBytes []byte) {
|
|||||||
case *pexRequestMessage:
|
case *pexRequestMessage:
|
||||||
// src requested some peers.
|
// src requested some peers.
|
||||||
// TODO: prevent abuse.
|
// TODO: prevent abuse.
|
||||||
addrs := pexR.book.GetSelection()
|
pexR.SendAddrs(src, pexR.book.GetSelection())
|
||||||
msg := &pexAddrsMessage{Addrs: addrs}
|
|
||||||
queued := src.TrySend(PexCh, msg)
|
|
||||||
if !queued {
|
|
||||||
// ignore
|
|
||||||
}
|
|
||||||
case *pexAddrsMessage:
|
case *pexAddrsMessage:
|
||||||
// We received some peer addresses from src.
|
// We received some peer addresses from src.
|
||||||
// TODO: prevent abuse.
|
// TODO: prevent abuse.
|
||||||
@ -127,7 +122,7 @@ func (pexR *PEXReactor) Receive(chId byte, src *Peer, msgBytes []byte) {
|
|||||||
|
|
||||||
// Asks peer for more addresses.
|
// Asks peer for more addresses.
|
||||||
func (pexR *PEXReactor) RequestPEX(peer *Peer) {
|
func (pexR *PEXReactor) RequestPEX(peer *Peer) {
|
||||||
peer.TrySend(PexCh, &pexRequestMessage{})
|
peer.Send(PexCh, &pexRequestMessage{})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (pexR *PEXReactor) SendAddrs(peer *Peer, addrs []*NetAddress) {
|
func (pexR *PEXReactor) SendAddrs(peer *Peer, addrs []*NetAddress) {
|
||||||
@ -176,11 +171,17 @@ func (pexR *PEXReactor) ensurePeers() {
|
|||||||
if try == nil {
|
if try == nil {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if toDial.Has(try.String()) ||
|
alreadySelected := toDial.Has(try.String())
|
||||||
pexR.sw.IsDialing(try) ||
|
alreadyDialing := pexR.sw.IsDialing(try)
|
||||||
pexR.sw.Peers().Has(try.String()) {
|
alreadyConnected := pexR.sw.Peers().Has(try.String())
|
||||||
|
if alreadySelected || alreadyDialing || alreadyConnected {
|
||||||
|
log.Debug("Cannot dial address", "addr", try,
|
||||||
|
"alreadySelected", alreadySelected,
|
||||||
|
"alreadyDialing", alreadyDialing,
|
||||||
|
"alreadyConnected", alreadyConnected)
|
||||||
continue
|
continue
|
||||||
} else {
|
} else {
|
||||||
|
log.Debug("Will dial address", "addr", try)
|
||||||
picked = try
|
picked = try
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
@ -143,17 +143,20 @@ func (sw *Switch) DialPeerWithAddress(addr *NetAddress) (*Peer, error) {
|
|||||||
return nil, ErrSwitchStopped
|
return nil, ErrSwitchStopped
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Info("Dialing peer", "address", addr)
|
log.Debug("Dialing address", "address", addr)
|
||||||
sw.dialing.Set(addr.String(), addr)
|
sw.dialing.Set(addr.String(), addr)
|
||||||
conn, err := addr.DialTimeout(peerDialTimeoutSeconds * time.Second)
|
conn, err := addr.DialTimeout(peerDialTimeoutSeconds * time.Second)
|
||||||
sw.dialing.Delete(addr.String())
|
sw.dialing.Delete(addr.String())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
log.Debug("Failed dialing address", "address", addr, "error", err)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
peer, err := sw.AddPeerWithConnection(conn, true)
|
peer, err := sw.AddPeerWithConnection(conn, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
log.Debug("Failed adding peer", "address", addr, "conn", conn, "error", err)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
log.Info("Dialed and added peer", "address", addr, "peer", peer)
|
||||||
return peer, nil
|
return peer, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user