Skip to content
This repository has been archived by the owner on Feb 1, 2023. It is now read-only.

Commit

Permalink
fix(peermanager): race fix
Browse files Browse the repository at this point in the history
fix remaining issues for race detector in peer manager
  • Loading branch information
hannahhoward committed Feb 20, 2019
1 parent 97bc28b commit 434e0f4
Showing 1 changed file with 8 additions and 13 deletions.
21 changes: 8 additions & 13 deletions peermanager/peermanager.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,11 +56,12 @@ func New(ctx context.Context, createPeerQueue PeerQueueFactory) *PeerManager {

// ConnectedPeers returns a list of peers this PeerManager is managing.
func (pm *PeerManager) ConnectedPeers() []peer.ID {

pm.peerQueuesLk.RLock()
defer pm.peerQueuesLk.RUnlock()
peers := make([]peer.ID, 0, len(pm.peerQueues))
pm.iterate(func(p peer.ID, _ PeerQueue) {
for p := range pm.peerQueues {
peers = append(peers, p)
})
}
return peers
}

Expand Down Expand Up @@ -96,9 +97,11 @@ func (pm *PeerManager) Disconnected(p peer.ID) {
// if targets is nil, it sends to all.
func (pm *PeerManager) SendMessage(entries []*bsmsg.Entry, targets []peer.ID, from uint64) {
if len(targets) == 0 {
pm.iterate(func(_ peer.ID, p PeerQueue) {
pm.peerQueuesLk.RLock()
for _, p := range pm.peerQueues {
p.AddMessage(entries, from)
})
}
pm.peerQueuesLk.RUnlock()
} else {
for _, t := range targets {
p := pm.getOrCreate(t)
Expand All @@ -118,11 +121,3 @@ func (pm *PeerManager) getOrCreate(p peer.ID) PeerQueue {
pm.peerQueuesLk.Unlock()
return pq
}

func (pm *PeerManager) iterate(iterateFn func(peer.ID, PeerQueue)) {
pm.peerQueuesLk.RLock()
for p, pq := range pm.peerQueues {
iterateFn(p, pq)
}
pm.peerQueuesLk.RUnlock()
}

0 comments on commit 434e0f4

Please sign in to comment.