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