Skip to content
Snippets Groups Projects
Unverified Commit 63ce1010 authored by Luca Moser's avatar Luca Moser Committed by GitHub
Browse files

Log connection failed errors (#238)

* fixes locks not getting unlocked

* only hold the lock in DropNeighbor while deleted the neighbor entry

* log connection failed error

* fixes tests
parent 8a5d6298
No related branches found
No related tags found
No related merge requests found
......@@ -16,7 +16,7 @@ var Events = struct {
// A TransactionReceived event is triggered when a new transaction is received by the gossip protocol.
TransactionReceived *events.Event
}{
ConnectionFailed: events.NewEvent(peerCaller),
ConnectionFailed: events.NewEvent(peerAndErrorCaller),
NeighborAdded: events.NewEvent(neighborCaller),
NeighborRemoved: events.NewEvent(peerCaller),
TransactionReceived: events.NewEvent(transactionReceived),
......@@ -27,6 +27,10 @@ type TransactionReceivedEvent struct {
Peer *peer.Peer // peer that send the transaction
}
func peerAndErrorCaller(handler interface{}, params ...interface{}) {
handler.(func(*peer.Peer, error))(params[0].(*peer.Peer), params[1].(error))
}
func peerCaller(handler interface{}, params ...interface{}) {
handler.(func(*peer.Peer))(params[0].(*peer.Peer))
}
......
package gossip
import (
"errors"
"fmt"
"net"
"sync"
......@@ -17,6 +18,11 @@ const (
maxPacketSize = 2048
)
var (
ErrNeighborManagerNotRunning = errors.New("neighbor manager is not running")
ErrNeighborAlreadyConnected = errors.New("neighbor is already connected")
)
// GetTransaction defines a function that returns the transaction data with the given hash.
type GetTransaction func(txHash []byte) ([]byte, error)
......@@ -178,7 +184,7 @@ func (m *Manager) send(b []byte, to ...peer.ID) {
func (m *Manager) addNeighbor(peer *peer.Peer, connectorFunc func(*peer.Peer) (net.Conn, error)) error {
conn, err := connectorFunc(peer)
if err != nil {
Events.ConnectionFailed.Trigger(peer)
Events.ConnectionFailed.Trigger(peer, err)
return err
}
......@@ -186,12 +192,12 @@ func (m *Manager) addNeighbor(peer *peer.Peer, connectorFunc func(*peer.Peer) (n
defer m.mu.Unlock()
if !m.running {
_ = conn.Close()
Events.ConnectionFailed.Trigger(peer)
Events.ConnectionFailed.Trigger(peer, ErrNeighborManagerNotRunning)
return ErrClosed
}
if _, ok := m.neighbors[peer.ID()]; ok {
_ = conn.Close()
Events.ConnectionFailed.Trigger(peer)
Events.ConnectionFailed.Trigger(peer, ErrNeighborAlreadyConnected)
return ErrDuplicateNeighbor
}
......
......@@ -310,7 +310,7 @@ func TestDropUnsuccessfulAccept(t *testing.T) {
_, closeB, peerB := newTestManager(t, "B")
defer closeB()
e.On("connectionFailed", peerB).Once()
e.On("connectionFailed", peerB, mock.Anything).Once()
err := mgrA.AddInbound(peerB)
assert.Error(t, err)
......@@ -432,7 +432,7 @@ type eventMock struct {
mock.Mock
}
func (e *eventMock) connectionFailed(p *peer.Peer) { e.Called(p) }
func (e *eventMock) connectionFailed(p *peer.Peer, err error) { e.Called(p, err) }
func (e *eventMock) neighborAdded(n *Neighbor) { e.Called(n) }
func (e *eventMock) neighborRemoved(p *peer.Peer) { e.Called(p) }
func (e *eventMock) transactionReceived(ev *TransactionReceivedEvent) { e.Called(ev) }
......@@ -99,7 +99,7 @@ func (n *Neighbor) writeLoop() {
continue
}
if _, err := n.BufferedConnection.Write(msg); err != nil {
n.log.Warn("Write error", "err", err)
n.log.Warnw("Write error", "err", err)
_ = n.BufferedConnection.Close()
return
}
......
......@@ -33,7 +33,7 @@ func run(*node.Plugin) {
func configureEvents() {
// notify the selection when a connection is closed or failed.
gossip.Events.ConnectionFailed.Attach(events.NewClosure(func(p *peer.Peer) {
gossip.Events.ConnectionFailed.Attach(events.NewClosure(func(p *peer.Peer, _ error) {
Selection.RemoveNeighbor(p.ID())
}))
gossip.Events.NeighborRemoved.Attach(events.NewClosure(func(p *peer.Peer) {
......
......@@ -59,8 +59,8 @@ func configureEvents() {
}()
}))
gossip.Events.ConnectionFailed.Attach(events.NewClosure(func(p *peer.Peer) {
log.Infof("Connection to neighbor failed: %s / %s", gossip.GetAddress(p), p.ID())
gossip.Events.ConnectionFailed.Attach(events.NewClosure(func(p *peer.Peer, err error) {
log.Infof("Connection to neighbor %s / %s failed: %s", gossip.GetAddress(p), p.ID(), err)
}))
gossip.Events.NeighborAdded.Attach(events.NewClosure(func(n *gossip.Neighbor) {
log.Infof("Neighbor added: %s / %s", gossip.GetAddress(n.Peer), n.ID())
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment