Merge pull request #867 from milosgajdos83/rlock-mess

Avoid recursive RLock()
This commit is contained in:
Asim Aslam 2019-10-18 11:35:08 +01:00 committed by GitHub
commit d3140c0fc2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -170,9 +170,6 @@ func (n *node) Nodes() []Node {
// GetPeerNode returns a node from node MaxDepth topology // GetPeerNode returns a node from node MaxDepth topology
// It returns nil if the peer was not found // It returns nil if the peer was not found
func (n *node) GetPeerNode(id string) *node { func (n *node) GetPeerNode(id string) *node {
n.RLock()
defer n.RUnlock()
// get node topology up to MaxDepth // get node topology up to MaxDepth
top := n.Topology(MaxDepth) top := n.Topology(MaxDepth)
@ -240,12 +237,9 @@ func (n *node) PruneStalePeerNodes(pruneTime time.Duration) map[string]*node {
return pruned return pruned
} }
// Topology returns a copy of the node topology down to given depth // getTopology traverses node graph and builds node topology
// NOTE: the returned node is a node graph - not a single node // NOTE: this function is not thread safe
func (n *node) Topology(depth uint) *node { func (n *node) getTopology(depth uint) *node {
n.RLock()
defer n.RUnlock()
// make a copy of yourself // make a copy of yourself
node := &node{ node := &node{
id: n.id, id: n.id,
@ -265,7 +259,7 @@ func (n *node) Topology(depth uint) *node {
// iterate through our peers and update the node peers // iterate through our peers and update the node peers
for _, peer := range n.peers { for _, peer := range n.peers {
nodePeer := peer.Topology(depth) nodePeer := peer.getTopology(depth)
if _, ok := node.peers[nodePeer.id]; !ok { if _, ok := node.peers[nodePeer.id]; !ok {
node.peers[nodePeer.id] = nodePeer node.peers[nodePeer.id] = nodePeer
} }
@ -274,6 +268,15 @@ func (n *node) Topology(depth uint) *node {
return node return node
} }
// Topology returns a copy of the node topology down to given depth
// NOTE: the returned node is a node graph - not a single node
func (n *node) Topology(depth uint) *node {
n.RLock()
defer n.RUnlock()
return n.getTopology(depth)
}
// Peers returns node peers up to MaxDepth // Peers returns node peers up to MaxDepth
func (n *node) Peers() []Node { func (n *node) Peers() []Node {
n.RLock() n.RLock()
@ -281,7 +284,7 @@ func (n *node) Peers() []Node {
var peers []Node var peers []Node
for _, nodePeer := range n.peers { for _, nodePeer := range n.peers {
peer := nodePeer.Topology(MaxDepth) peer := nodePeer.getTopology(MaxDepth)
peers = append(peers, peer) peers = append(peers, peer)
} }