mirror of
https://github.com/nspcc-dev/neo-go.git
synced 2025-05-07 15:07:36 +00:00
network: rework discoverer/server interaction
* treat connected/handshaked peers separately in the discoverer, save "original" address for connected ones, it can be a name instead of IP and it's important to keep it to avoid reconnections * store name->IP mapping for seeds if and when they're connected to avoid reconnections * block seed if it's detected to be our own node (which is often the case for small private networks) * add an event for handshaked peers in the server, connected but non-handshaked ones are not really helpful for MinPeers or GetAddr logic Fixes #2796.
This commit is contained in:
parent
6ba4afc977
commit
23f118a1a9
10 changed files with 180 additions and 100 deletions
|
@ -9,6 +9,7 @@ import (
|
|||
"time"
|
||||
|
||||
"github.com/nspcc-dev/neo-go/pkg/network/capability"
|
||||
"github.com/nspcc-dev/neo-go/pkg/network/payload"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
atomic2 "go.uber.org/atomic"
|
||||
|
@ -22,18 +23,40 @@ type fakeTransp struct {
|
|||
addr string
|
||||
}
|
||||
|
||||
type fakeAPeer struct {
|
||||
addr string
|
||||
peer string
|
||||
version *payload.Version
|
||||
}
|
||||
|
||||
func (f *fakeAPeer) ConnectionAddr() string {
|
||||
return f.addr
|
||||
}
|
||||
|
||||
func (f *fakeAPeer) PeerAddr() net.Addr {
|
||||
tcpAddr, err := net.ResolveTCPAddr("tcp", f.peer)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return tcpAddr
|
||||
}
|
||||
|
||||
func (f *fakeAPeer) Version() *payload.Version {
|
||||
return f.version
|
||||
}
|
||||
|
||||
func newFakeTransp(s *Server) Transporter {
|
||||
return &fakeTransp{}
|
||||
}
|
||||
|
||||
func (ft *fakeTransp) Dial(addr string, timeout time.Duration) error {
|
||||
func (ft *fakeTransp) Dial(addr string, timeout time.Duration) (AddressablePeer, error) {
|
||||
var ret error
|
||||
if atomic.LoadInt32(&ft.retFalse) > 0 {
|
||||
ret = errors.New("smth bad happened")
|
||||
}
|
||||
ft.dialCh <- addr
|
||||
|
||||
return ret
|
||||
return &fakeAPeer{addr: addr, peer: addr}, ret
|
||||
}
|
||||
func (ft *fakeTransp) Accept() {
|
||||
if ft.started.Load() {
|
||||
|
@ -83,7 +106,7 @@ func TestDefaultDiscoverer(t *testing.T) {
|
|||
select {
|
||||
case a := <-ts.dialCh:
|
||||
dialled = append(dialled, a)
|
||||
d.RegisterConnectedAddr(a)
|
||||
d.RegisterConnected(&fakeAPeer{addr: a, peer: a})
|
||||
case <-time.After(time.Second):
|
||||
t.Fatalf("timeout expecting for transport dial")
|
||||
}
|
||||
|
@ -97,10 +120,14 @@ func TestDefaultDiscoverer(t *testing.T) {
|
|||
|
||||
// Registered good addresses should end up in appropriate set.
|
||||
for _, addr := range set1 {
|
||||
d.RegisterGoodAddr(addr, capability.Capabilities{
|
||||
{
|
||||
Type: capability.FullNode,
|
||||
Data: &capability.Node{StartHeight: 123},
|
||||
d.RegisterGood(&fakeAPeer{
|
||||
addr: addr,
|
||||
peer: addr,
|
||||
version: &payload.Version{
|
||||
Capabilities: capability.Capabilities{{
|
||||
Type: capability.FullNode,
|
||||
Data: &capability.Node{StartHeight: 123},
|
||||
}},
|
||||
},
|
||||
})
|
||||
}
|
||||
|
@ -130,7 +157,7 @@ func TestDefaultDiscoverer(t *testing.T) {
|
|||
|
||||
// Unregistering connected should work.
|
||||
for _, addr := range set1 {
|
||||
d.UnregisterConnectedAddr(addr)
|
||||
d.UnregisterConnected(&fakeAPeer{addr: addr, peer: addr}, false)
|
||||
}
|
||||
assert.Equal(t, 2, len(d.UnconnectedPeers())) // They're re-added automatically.
|
||||
assert.Equal(t, 0, len(d.BadPeers()))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue