Merge pull request #867 from milosgajdos83/rlock-mess
Avoid recursive RLock()
This commit is contained in:
		| @@ -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) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user