Skip to content
Snippets Groups Projects
Commit f4a9646a authored by Angelo Capossele's avatar Angelo Capossele Committed by Luca Moser
Browse files

:sparkles: adds open port check (#143)

* :sparkles:

 adds open port check

* Use gossip.server to check port

* Use same messages in gossip and autopeering

* Give correct error message when unreachable

Co-authored-by: default avatarWolfgang Welz <welzwo@gmail.com>
parent ec9592a7
No related branches found
No related tags found
No related merge requests found
...@@ -25,7 +25,7 @@ const ( ...@@ -25,7 +25,7 @@ const (
type network interface { type network interface {
local() *peer.Local local() *peer.Local
ping(*peer.Peer) error Ping(*peer.Peer) error
discoveryRequest(*peer.Peer) ([]*peer.Peer, error) discoveryRequest(*peer.Peer) ([]*peer.Peer, error)
} }
...@@ -139,7 +139,7 @@ func (m *manager) doReverify(done chan<- struct{}) { ...@@ -139,7 +139,7 @@ func (m *manager) doReverify(done chan<- struct{}) {
var err error var err error
for i := 0; i < reverifyTries; i++ { for i := 0; i < reverifyTries; i++ {
err = m.net.ping(unwrapPeer(p)) err = m.net.Ping(unwrapPeer(p))
if err == nil { if err == nil {
break break
} else { } else {
......
...@@ -22,7 +22,7 @@ func (m *NetworkMock) local() *peer.Local { ...@@ -22,7 +22,7 @@ func (m *NetworkMock) local() *peer.Local {
return m.loc return m.loc
} }
func (m *NetworkMock) ping(p *peer.Peer) error { func (m *NetworkMock) Ping(p *peer.Peer) error {
args := m.Called(p) args := m.Called(p)
return args.Error(0) return args.Error(0)
} }
...@@ -70,7 +70,7 @@ func TestMgrVerifyDiscoveredPeer(t *testing.T) { ...@@ -70,7 +70,7 @@ func TestMgrVerifyDiscoveredPeer(t *testing.T) {
p := newDummyPeer("p") p := newDummyPeer("p")
// expect ping of peer p // expect ping of peer p
m.On("ping", p).Return(nil).Once() m.On("Ping", p).Return(nil).Once()
// ignore discoveryRequest calls // ignore discoveryRequest calls
m.On("discoveryRequest", mock.Anything).Return([]*peer.Peer{}, nil).Maybe() m.On("discoveryRequest", mock.Anything).Return([]*peer.Peer{}, nil).Maybe()
...@@ -90,7 +90,7 @@ func TestMgrReverifyPeer(t *testing.T) { ...@@ -90,7 +90,7 @@ func TestMgrReverifyPeer(t *testing.T) {
p := newDummyPeer("p") p := newDummyPeer("p")
// expect ping of peer p // expect ping of peer p
m.On("ping", p).Return(nil).Once() m.On("Ping", p).Return(nil).Once()
// ignore discoveryRequest calls // ignore discoveryRequest calls
m.On("discoveryRequest", mock.Anything).Return([]*peer.Peer{}, nil).Maybe() m.On("discoveryRequest", mock.Anything).Return([]*peer.Peer{}, nil).Maybe()
...@@ -113,7 +113,7 @@ func TestMgrRequestDiscoveredPeer(t *testing.T) { ...@@ -113,7 +113,7 @@ func TestMgrRequestDiscoveredPeer(t *testing.T) {
// expect discoveryRequest on the discovered peer // expect discoveryRequest on the discovered peer
m.On("discoveryRequest", p1).Return([]*peer.Peer{p2}, nil).Once() m.On("discoveryRequest", p1).Return([]*peer.Peer{p2}, nil).Once()
// ignore any ping // ignore any ping
m.On("ping", mock.Anything).Return(nil).Maybe() m.On("Ping", mock.Anything).Return(nil).Maybe()
mgr.addVerifiedPeer(p1) mgr.addVerifiedPeer(p1)
mgr.addDiscoveredPeer(p2) mgr.addDiscoveredPeer(p2)
...@@ -129,7 +129,7 @@ func TestMgrAddManyVerifiedPeers(t *testing.T) { ...@@ -129,7 +129,7 @@ func TestMgrAddManyVerifiedPeers(t *testing.T) {
p := newDummyPeer("p") p := newDummyPeer("p")
// expect ping of peer p // expect ping of peer p
m.On("ping", p).Return(nil).Once() m.On("Ping", p).Return(nil).Once()
// ignore discoveryRequest calls // ignore discoveryRequest calls
m.On("discoveryRequest", mock.Anything).Return([]*peer.Peer{}, nil).Maybe() m.On("discoveryRequest", mock.Anything).Return([]*peer.Peer{}, nil).Maybe()
...@@ -157,7 +157,7 @@ func TestMgrDeleteUnreachablePeer(t *testing.T) { ...@@ -157,7 +157,7 @@ func TestMgrDeleteUnreachablePeer(t *testing.T) {
p := newDummyPeer("p") p := newDummyPeer("p")
// expect ping of peer p, but return error // expect ping of peer p, but return error
m.On("ping", p).Return(server.ErrTimeout).Times(reverifyTries) m.On("Ping", p).Return(server.ErrTimeout).Times(reverifyTries)
// ignore discoveryRequest calls // ignore discoveryRequest calls
m.On("discoveryRequest", mock.Anything).Return([]*peer.Peer{}, nil).Maybe() m.On("discoveryRequest", mock.Anything).Return([]*peer.Peer{}, nil).Maybe()
......
...@@ -149,7 +149,7 @@ func (p *Protocol) HandleMessage(s *server.Server, fromAddr string, fromID peer. ...@@ -149,7 +149,7 @@ func (p *Protocol) HandleMessage(s *server.Server, fromAddr string, fromID peer.
// ------ message senders ------ // ------ message senders ------
// ping sends a ping to the specified peer and blocks until a reply is received or timeout. // ping sends a ping to the specified peer and blocks until a reply is received or timeout.
func (p *Protocol) ping(to *peer.Peer) error { func (p *Protocol) Ping(to *peer.Peer) error {
return <-p.sendPing(to.Address(), to.ID()) return <-p.sendPing(to.Address(), to.ID())
} }
......
...@@ -89,11 +89,11 @@ func TestProtPingPong(t *testing.T) { ...@@ -89,11 +89,11 @@ func TestProtPingPong(t *testing.T) {
peerB := getPeer(srvB) peerB := getPeer(srvB)
// send a ping from node A to B // send a ping from node A to B
t.Run("A->B", func(t *testing.T) { assert.NoError(t, protA.ping(peerB)) }) t.Run("A->B", func(t *testing.T) { assert.NoError(t, protA.Ping(peerB)) })
time.Sleep(graceTime) time.Sleep(graceTime)
// send a ping from node B to A // send a ping from node B to A
t.Run("B->A", func(t *testing.T) { assert.NoError(t, protB.ping(peerA)) }) t.Run("B->A", func(t *testing.T) { assert.NoError(t, protB.Ping(peerA)) })
time.Sleep(graceTime) time.Sleep(graceTime)
} }
...@@ -109,7 +109,7 @@ func TestProtPingTimeout(t *testing.T) { ...@@ -109,7 +109,7 @@ func TestProtPingTimeout(t *testing.T) {
peerB := getPeer(srvB) peerB := getPeer(srvB)
// send a ping from node A to B // send a ping from node A to B
err := protA.ping(peerB) err := protA.Ping(peerB)
assert.EqualError(t, err, server.ErrTimeout.Error()) assert.EqualError(t, err, server.ErrTimeout.Error())
} }
...@@ -125,7 +125,7 @@ func TestProtVerifiedPeers(t *testing.T) { ...@@ -125,7 +125,7 @@ func TestProtVerifiedPeers(t *testing.T) {
peerB := getPeer(srvB) peerB := getPeer(srvB)
// send a ping from node A to B // send a ping from node A to B
assert.NoError(t, protA.ping(peerB)) assert.NoError(t, protA.Ping(peerB))
time.Sleep(graceTime) time.Sleep(graceTime)
// protA should have peerB as the single verified peer // protA should have peerB as the single verified peer
...@@ -148,7 +148,7 @@ func TestProtVerifiedPeer(t *testing.T) { ...@@ -148,7 +148,7 @@ func TestProtVerifiedPeer(t *testing.T) {
peerB := getPeer(srvB) peerB := getPeer(srvB)
// send a ping from node A to B // send a ping from node A to B
assert.NoError(t, protA.ping(peerB)) assert.NoError(t, protA.Ping(peerB))
time.Sleep(graceTime) time.Sleep(graceTime)
// we should have peerB as a verified peer // we should have peerB as a verified peer
...@@ -248,14 +248,14 @@ func BenchmarkPingPong(b *testing.B) { ...@@ -248,14 +248,14 @@ func BenchmarkPingPong(b *testing.B) {
peerB := getPeer(srvB) peerB := getPeer(srvB)
// send initial ping to ensure that every peer is verified // send initial ping to ensure that every peer is verified
err := protA.ping(peerB) err := protA.Ping(peerB)
require.NoError(b, err) require.NoError(b, err)
time.Sleep(graceTime) time.Sleep(graceTime)
b.ResetTimer() b.ResetTimer()
for n := 0; n < b.N; n++ { for n := 0; n < b.N; n++ {
// send a ping from node A to B // send a ping from node A to B
_ = protA.ping(peerB) _ = protA.Ping(peerB)
} }
b.StopTimer() b.StopTimer()
......
...@@ -15,6 +15,7 @@ import ( ...@@ -15,6 +15,7 @@ import (
"github.com/iotaledger/goshimmer/packages/autopeering/transport" "github.com/iotaledger/goshimmer/packages/autopeering/transport"
"github.com/iotaledger/goshimmer/packages/parameter" "github.com/iotaledger/goshimmer/packages/parameter"
"github.com/iotaledger/goshimmer/plugins/autopeering/local" "github.com/iotaledger/goshimmer/plugins/autopeering/local"
"github.com/iotaledger/goshimmer/plugins/cli"
"github.com/iotaledger/goshimmer/plugins/gossip" "github.com/iotaledger/goshimmer/plugins/gossip"
"github.com/iotaledger/hive.go/logger" "github.com/iotaledger/hive.go/logger"
"github.com/iotaledger/hive.go/node" "github.com/iotaledger/hive.go/node"
...@@ -53,7 +54,7 @@ func configureAP() { ...@@ -53,7 +54,7 @@ func configureAP() {
} }
func start(shutdownSignal <-chan struct{}) { func start(shutdownSignal <-chan struct{}) {
defer log.Info("Stopping Auto Peering server ... done") defer log.Info("Stopping " + name + " ... done")
addr := local.GetInstance().Services().Get(service.PeeringKey) addr := local.GetInstance().Services().Get(service.PeeringKey)
udpAddr, err := net.ResolveUDPAddr(addr.Network(), addr.String()) udpAddr, err := net.ResolveUDPAddr(addr.Network(), addr.String())
...@@ -92,17 +93,22 @@ func start(shutdownSignal <-chan struct{}) { ...@@ -92,17 +93,22 @@ func start(shutdownSignal <-chan struct{}) {
Discovery.Start(srv) Discovery.Start(srv)
defer Discovery.Close() defer Discovery.Close()
//check that discovery is working and the port is open
log.Info("Testing service ...")
checkConnection(srv, &local.GetInstance().Peer)
log.Info("Testing service ... done")
if Selection != nil { if Selection != nil {
// start the peering on that connection // start the peering on that connection
Selection.Start(srv) Selection.Start(srv)
defer Selection.Close() defer Selection.Close()
} }
log.Infof("Auto Peering started: address=%s", srv.LocalAddr()) log.Infof(name+" started: address=%s/udp", srv.LocalAddr())
log.Debugf("Auto Peering server started: PubKey=%s", base64.StdEncoding.EncodeToString(local.GetInstance().PublicKey())) log.Debugf(name+" server started: PubKey=%s", base64.StdEncoding.EncodeToString(local.GetInstance().PublicKey()))
<-shutdownSignal <-shutdownSignal
log.Info("Stopping Auto Peering server ...") log.Info("Stopping " + name + " ...")
} }
func parseEntryNodes() (result []*peer.Peer, err error) { func parseEntryNodes() (result []*peer.Peer, err error) {
...@@ -128,3 +134,15 @@ func parseEntryNodes() (result []*peer.Peer, err error) { ...@@ -128,3 +134,15 @@ func parseEntryNodes() (result []*peer.Peer, err error) {
return result, nil return result, nil
} }
func checkConnection(srv *server.Server, self *peer.Peer) {
if err := Discovery.Ping(self); err != nil {
if err == server.ErrTimeout {
log.Errorf("Error testing service: %s", err)
addr := self.Services().Get(service.PeeringKey)
log.Panicf("Please check that %s is publicly reachable at %s/%s",
cli.AppName, addr.String(), addr.Network())
}
log.Panicf("Error: %s", err)
}
}
...@@ -4,12 +4,15 @@ import ( ...@@ -4,12 +4,15 @@ import (
"fmt" "fmt"
"net" "net"
"strconv" "strconv"
"sync"
"github.com/iotaledger/goshimmer/packages/autopeering/peer"
"github.com/iotaledger/goshimmer/packages/autopeering/peer/service" "github.com/iotaledger/goshimmer/packages/autopeering/peer/service"
gp "github.com/iotaledger/goshimmer/packages/gossip" gp "github.com/iotaledger/goshimmer/packages/gossip"
"github.com/iotaledger/goshimmer/packages/gossip/server" "github.com/iotaledger/goshimmer/packages/gossip/server"
"github.com/iotaledger/goshimmer/packages/parameter" "github.com/iotaledger/goshimmer/packages/parameter"
"github.com/iotaledger/goshimmer/plugins/autopeering/local" "github.com/iotaledger/goshimmer/plugins/autopeering/local"
"github.com/iotaledger/goshimmer/plugins/cli"
"github.com/iotaledger/goshimmer/plugins/tangle" "github.com/iotaledger/goshimmer/plugins/tangle"
"github.com/iotaledger/hive.go/logger" "github.com/iotaledger/hive.go/logger"
"github.com/iotaledger/hive.go/typeutils" "github.com/iotaledger/hive.go/typeutils"
...@@ -39,7 +42,7 @@ func configureGossip() { ...@@ -39,7 +42,7 @@ func configureGossip() {
} }
func start(shutdownSignal <-chan struct{}) { func start(shutdownSignal <-chan struct{}) {
defer log.Info("Stopping Gossip ... done") defer log.Info("Stopping " + name + " ... done")
srv, err := server.ListenTCP(local.GetInstance(), log) srv, err := server.ListenTCP(local.GetInstance(), log)
if err != nil { if err != nil {
...@@ -47,13 +50,40 @@ func start(shutdownSignal <-chan struct{}) { ...@@ -47,13 +50,40 @@ func start(shutdownSignal <-chan struct{}) {
} }
defer srv.Close() defer srv.Close()
//check that the server is working and the port is open
log.Info("Testing service ...")
checkConnection(srv, &local.GetInstance().Peer)
log.Info("Testing service ... done")
mgr.Start(srv) mgr.Start(srv)
defer mgr.Close() defer mgr.Close()
log.Infof("Gossip started: address=%v", mgr.LocalAddr()) log.Infof(name+" started: address=%s/%s", mgr.LocalAddr().String(), mgr.LocalAddr().Network())
<-shutdownSignal <-shutdownSignal
log.Info("Stopping Gossip ...") log.Info("Stopping " + name + " ...")
}
func checkConnection(srv *server.TCP, self *peer.Peer) {
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
conn, err := srv.AcceptPeer(self)
if err != nil {
return
}
_ = conn.Close()
}()
conn, err := srv.DialPeer(self)
if err != nil {
log.Errorf("Error testing: %s", err)
addr := self.Services().Get(service.GossipKey)
log.Panicf("Please check that %s is publicly reachable at %s/%s",
cli.AppName, addr.String(), addr.Network())
}
_ = conn.Close()
wg.Wait()
} }
func loadTransaction(hash []byte) ([]byte, error) { func loadTransaction(hash []byte) ([]byte, error) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment