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