Lock the Nodes method properly when collecting them.
This commit is contained in:
		| @@ -46,16 +46,16 @@ func (n *node) Network() Network { | ||||
|  | ||||
| // Nodes returns a slice if all nodes in node topology | ||||
| func (n *node) Nodes() []Node { | ||||
| 	//track the visited nodes | ||||
| 	visited := make(map[string]*node) | ||||
| 	// queue of the nodes to visit | ||||
| 	queue := list.New() | ||||
|  | ||||
| 	// we need to freeze the network graph here | ||||
| 	// otherwise we might get invalid results | ||||
| 	n.RLock() | ||||
| 	defer n.RUnlock() | ||||
|  | ||||
| 	//track the visited nodes | ||||
| 	visited := make(map[string]*node) | ||||
| 	// queue of the nodes to visit | ||||
| 	queue := list.New() | ||||
|  | ||||
| 	// push node to the back of queue | ||||
| 	queue.PushBack(n) | ||||
| 	// mark the node as visited | ||||
|   | ||||
| @@ -53,8 +53,9 @@ func (m *ListRequest) XXX_DiscardUnknown() { | ||||
|  | ||||
| var xxx_messageInfo_ListRequest proto.InternalMessageInfo | ||||
|  | ||||
| // ListResponse is returned by ListNodes and ListNeighbours | ||||
| // ListResponse is returned by ListNodes | ||||
| type ListResponse struct { | ||||
| 	// network nodes | ||||
| 	Nodes                []*Node  `protobuf:"bytes,1,rep,name=nodes,proto3" json:"nodes,omitempty"` | ||||
| 	XXX_NoUnkeyedLiteral struct{} `json:"-"` | ||||
| 	XXX_unrecognized     []byte   `json:"-"` | ||||
| @@ -93,8 +94,9 @@ func (m *ListResponse) GetNodes() []*Node { | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // PeerRequest is sent to query node peers | ||||
| // PeerRequest requests list of peers | ||||
| type PeerRequest struct { | ||||
| 	// node id | ||||
| 	Id                   string   `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` | ||||
| 	XXX_NoUnkeyedLiteral struct{} `json:"-"` | ||||
| 	XXX_unrecognized     []byte   `json:"-"` | ||||
| @@ -133,7 +135,7 @@ func (m *PeerRequest) GetId() string { | ||||
| 	return "" | ||||
| } | ||||
|  | ||||
| // PeerResponse returns node neighbourhood | ||||
| // PeerResponse is returned by ListPeers | ||||
| type PeerResponse struct { | ||||
| 	Peers                *Peers   `protobuf:"bytes,1,opt,name=peers,proto3" json:"peers,omitempty"` | ||||
| 	XXX_NoUnkeyedLiteral struct{} `json:"-"` | ||||
| @@ -173,8 +175,11 @@ func (m *PeerResponse) GetPeers() *Peers { | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Peers are node peers | ||||
| type Peers struct { | ||||
| 	// network node | ||||
| 	Node *Node `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"` | ||||
| 	// node peers | ||||
| 	Peers                []*Node  `protobuf:"bytes,2,rep,name=peers,proto3" json:"peers,omitempty"` | ||||
| 	XXX_NoUnkeyedLiteral struct{} `json:"-"` | ||||
| 	XXX_unrecognized     []byte   `json:"-"` | ||||
| @@ -222,7 +227,7 @@ func (m *Peers) GetPeers() []*Node { | ||||
|  | ||||
| // Node is network node | ||||
| type Node struct { | ||||
| 	// node ide | ||||
| 	// node id | ||||
| 	Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` | ||||
| 	// node address | ||||
| 	Address              string   `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` | ||||
| @@ -352,7 +357,7 @@ func (m *Close) GetNode() *Node { | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Solicit is sent when requesting route advertisement from the network nodes | ||||
| // Solicit is sent when soliciting routes from the network nodes | ||||
| type Solicit struct { | ||||
| 	// network node | ||||
| 	Node                 *Node    `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"` | ||||
| @@ -393,11 +398,11 @@ func (m *Solicit) GetNode() *Node { | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Peer is used to announce node peers | ||||
| // Peer is used to advertise node peers | ||||
| type Peer struct { | ||||
| 	// network node | ||||
| 	Node *Node `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"` | ||||
| 	// neighbours | ||||
| 	// node peers | ||||
| 	Peers                []*Peer  `protobuf:"bytes,2,rep,name=peers,proto3" json:"peers,omitempty"` | ||||
| 	XXX_NoUnkeyedLiteral struct{} `json:"-"` | ||||
| 	XXX_unrecognized     []byte   `json:"-"` | ||||
|   | ||||
| @@ -14,29 +14,34 @@ service Network { | ||||
| // Empty request | ||||
| message ListRequest {} | ||||
|  | ||||
| // ListResponse is returned by ListNodes and ListNeighbours | ||||
| // ListResponse is returned by ListNodes | ||||
| message ListResponse { | ||||
|         // network nodes | ||||
| 	repeated Node nodes = 1; | ||||
| } | ||||
|  | ||||
| // PeerRequest is sent to query node peers | ||||
| // PeerRequest requests list of peers | ||||
| message PeerRequest { | ||||
|         // node id | ||||
|         string id = 1; | ||||
| } | ||||
|  | ||||
| // PeerResponse returns node neighbourhood | ||||
| // PeerResponse is returned by ListPeers | ||||
| message PeerResponse { | ||||
|         Peers peers = 1; | ||||
| } | ||||
|  | ||||
| // Peers are node peers | ||||
| message Peers { | ||||
|         // network node | ||||
|         Node node = 1; | ||||
|         // node peers | ||||
|         repeated Node peers = 2; | ||||
| } | ||||
|  | ||||
| // Node is network node | ||||
| message Node { | ||||
|         // node ide | ||||
|         // node id | ||||
|         string id = 1; | ||||
|         // node address | ||||
|         string address = 2; | ||||
| @@ -54,16 +59,16 @@ message Close { | ||||
|         Node node = 1; | ||||
| } | ||||
|  | ||||
| // Solicit is sent when requesting route advertisement from the network nodes | ||||
| // Solicit is sent when soliciting routes from the network nodes | ||||
| message Solicit { | ||||
|         // network node | ||||
|         Node node = 1; | ||||
| } | ||||
|  | ||||
| // Peer is used to announce node peers | ||||
| // Peer is used to advertise node peers | ||||
| message Peer { | ||||
|         // network node | ||||
|         Node node = 1; | ||||
|         // neighbours | ||||
|         // node peers | ||||
|         repeated Peer peers = 2; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user