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

Fixes deadlock in neighbor manager (#236)

* fixes locks not getting unlocked

* only hold the lock in DropNeighbor while deleted the neighbor entry
parent 5e2e96ec
No related branches found
No related tags found
No related merge requests found
...@@ -78,6 +78,7 @@ func (m *Manager) AddOutbound(p *peer.Peer) error { ...@@ -78,6 +78,7 @@ func (m *Manager) AddOutbound(p *peer.Peer) error {
var srv *server.TCP var srv *server.TCP
m.mu.RLock() m.mu.RLock()
if m.srv == nil { if m.srv == nil {
m.mu.RUnlock()
return ErrNotStarted return ErrNotStarted
} }
srv = m.srv srv = m.srv
...@@ -94,6 +95,7 @@ func (m *Manager) AddInbound(p *peer.Peer) error { ...@@ -94,6 +95,7 @@ func (m *Manager) AddInbound(p *peer.Peer) error {
var srv *server.TCP var srv *server.TCP
m.mu.RLock() m.mu.RLock()
if m.srv == nil { if m.srv == nil {
m.mu.RUnlock()
return ErrNotStarted return ErrNotStarted
} }
srv = m.srv srv = m.srv
...@@ -104,15 +106,11 @@ func (m *Manager) AddInbound(p *peer.Peer) error { ...@@ -104,15 +106,11 @@ func (m *Manager) AddInbound(p *peer.Peer) error {
// NeighborRemoved disconnects the neighbor with the given ID. // NeighborRemoved disconnects the neighbor with the given ID.
func (m *Manager) DropNeighbor(id peer.ID) error { func (m *Manager) DropNeighbor(id peer.ID) error {
m.mu.Lock() n, err := m.removeNeighbor(id)
defer m.mu.Unlock() if err != nil {
if _, ok := m.neighbors[id]; !ok { return err
return ErrNotANeighbor
} }
n := m.neighbors[id] err = n.Close()
delete(m.neighbors, id)
err := n.Close()
Events.NeighborRemoved.Trigger(n.Peer) Events.NeighborRemoved.Trigger(n.Peer)
return err return err
} }
...@@ -139,12 +137,11 @@ func (m *Manager) SendTransaction(txData []byte, to ...peer.ID) { ...@@ -139,12 +137,11 @@ func (m *Manager) SendTransaction(txData []byte, to ...peer.ID) {
func (m *Manager) GetAllNeighbors() []*Neighbor { func (m *Manager) GetAllNeighbors() []*Neighbor {
m.mu.RLock() m.mu.RLock()
defer m.mu.RUnlock()
result := make([]*Neighbor, 0, len(m.neighbors)) result := make([]*Neighbor, 0, len(m.neighbors))
for _, n := range m.neighbors { for _, n := range m.neighbors {
result = append(result, n) result = append(result, n)
} }
m.mu.RUnlock()
return result return result
} }
...@@ -159,13 +156,12 @@ func (m *Manager) getNeighborsById(ids []peer.ID) []*Neighbor { ...@@ -159,13 +156,12 @@ func (m *Manager) getNeighborsById(ids []peer.ID) []*Neighbor {
result := make([]*Neighbor, 0, len(ids)) result := make([]*Neighbor, 0, len(ids))
m.mu.RLock() m.mu.RLock()
defer m.mu.RUnlock()
for _, id := range ids { for _, id := range ids {
if n, ok := m.neighbors[id]; ok { if n, ok := m.neighbors[id]; ok {
result = append(result, n) result = append(result, n)
} }
} }
m.mu.RUnlock()
return result return result
} }
...@@ -215,6 +211,17 @@ func (m *Manager) addNeighbor(peer *peer.Peer, connectorFunc func(*peer.Peer) (n ...@@ -215,6 +211,17 @@ func (m *Manager) addNeighbor(peer *peer.Peer, connectorFunc func(*peer.Peer) (n
return nil return nil
} }
func (m *Manager) removeNeighbor(id peer.ID) (*Neighbor, error) {
m.mu.Lock()
defer m.mu.Unlock()
if _, ok := m.neighbors[id]; !ok {
return nil, ErrNotANeighbor
}
n := m.neighbors[id]
delete(m.neighbors, id)
return n, nil
}
func (m *Manager) handlePacket(data []byte, p *peer.Peer) error { func (m *Manager) handlePacket(data []byte, p *peer.Peer) error {
// ignore empty packages // ignore empty packages
if len(data) == 0 { if len(data) == 0 {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment