Major bug overhaul in how we handle network.Nodes and related handler

This commit is contained in:
Milos Gajdos 2019-09-03 16:39:27 +01:00
parent 3ea4490d6c
commit 6eb6d050ed
No known key found for this signature in database
GPG Key ID: 8B31058CC55DFD4F
4 changed files with 84 additions and 66 deletions

View File

@ -30,6 +30,7 @@ var (
// node is network node // node is network node
type node struct { type node struct {
sync.RWMutex
// id is node id // id is node id
id string id string
// address is node address // address is node address
@ -60,9 +61,18 @@ func (n *node) Network() Network {
// Neighbourhood returns node neighbourhood // Neighbourhood returns node neighbourhood
func (n *node) Neighbourhood() []Node { func (n *node) Neighbourhood() []Node {
var nodes []Node var nodes []Node
for _, node := range n.neighbours { n.RLock()
nodes = append(nodes, node) for _, neighbourNode := range n.neighbours {
// make a copy of the node
n := &node{
id: neighbourNode.id,
address: neighbourNode.address,
network: neighbourNode.network,
}
// NOTE: we do not care about neighbour's neighbours
nodes = append(nodes, n)
} }
n.RUnlock()
return nodes return nodes
} }
@ -287,13 +297,19 @@ func (n *network) processNetChan(l tunnel.Listener) {
if pbNetConnect.Node.Id == n.options.Id { if pbNetConnect.Node.Id == n.options.Id {
continue continue
} }
neighbour := &node{ n.Lock()
// if the entry already exists skip adding it
if _, ok := n.neighbours[pbNetConnect.Node.Id]; ok {
n.Unlock()
continue
}
// add a new neighbour;
// NOTE: new node does not have any neighbours
n.neighbours[pbNetConnect.Node.Id] = &node{
id: pbNetConnect.Node.Id, id: pbNetConnect.Node.Id,
address: pbNetConnect.Node.Address, address: pbNetConnect.Node.Address,
neighbours: make(map[string]*node), neighbours: make(map[string]*node),
} }
n.Lock()
n.neighbours[neighbour.id] = neighbour
n.Unlock() n.Unlock()
case "neighbour": case "neighbour":
pbNetNeighbour := &pbNet.Neighbour{} pbNetNeighbour := &pbNet.Neighbour{}
@ -305,22 +321,24 @@ func (n *network) processNetChan(l tunnel.Listener) {
if pbNetNeighbour.Node.Id == n.options.Id { if pbNetNeighbour.Node.Id == n.options.Id {
continue continue
} }
neighbour := &node{
id: pbNetNeighbour.Node.Id,
address: pbNetNeighbour.Node.Address,
neighbours: make(map[string]*node),
lastSeen: time.Now(),
}
n.Lock() n.Lock()
// we override the existing neighbour map // only add the neighbour if it's not already in the neighbourhood
n.neighbours[neighbour.id] = neighbour if _, ok := n.neighbours[pbNetNeighbour.Node.Id]; !ok {
// store the neighbouring node and its neighbours neighbour := &node{
id: pbNetNeighbour.Node.Id,
address: pbNetNeighbour.Node.Address,
neighbours: make(map[string]*node),
lastSeen: time.Now(),
}
n.neighbours[pbNetNeighbour.Node.Id] = neighbour
}
// update/store the neighbour node neighbours
for _, pbNeighbour := range pbNetNeighbour.Neighbours { for _, pbNeighbour := range pbNetNeighbour.Neighbours {
neighbourNode := &node{ neighbourNode := &node{
id: pbNeighbour.Id, id: pbNeighbour.Id,
address: pbNeighbour.Address, address: pbNeighbour.Address,
} }
n.neighbours[neighbour.id].neighbours[neighbourNode.id] = neighbourNode n.neighbours[pbNetNeighbour.Node.Id].neighbours[neighbourNode.id] = neighbourNode
} }
n.Unlock() n.Unlock()
case "close": case "close":

View File

@ -76,35 +76,35 @@ func (n *Network) Neighbourhood(ctx context.Context, req *pbNet.NeighbourhoodReq
// find a node with a given id // find a node with a given id
i := sort.Search(len(nodes), func(j int) bool { return nodes[j].Id() >= id }) i := sort.Search(len(nodes), func(j int) bool { return nodes[j].Id() >= id })
var neighbours []*pbNet.Neighbour var neighbours []*pbNet.Node
// collect all the nodes in the neighbourhood of the found node // collect all the nodes in the neighbourhood of the found node
if i < len(nodes) && nodes[i].Id() == id { if i < len(nodes) && nodes[i].Id() == id {
for _, neighbour := range nodes[i].Neighbourhood() { for _, neighbour := range nodes[i].Neighbourhood() {
var nodeNeighbours []*pbNet.Node // don't return yourself in response
for _, nodeNeighbour := range neighbour.Neighbourhood() { if neighbour.Id() == n.Network.Id() {
// don't return yourself in response continue
if nodeNeighbour.Id() == n.Network.Id() {
continue
}
nn := &pbNet.Node{
Id: nodeNeighbour.Id(),
Address: nodeNeighbour.Address(),
}
nodeNeighbours = append(nodeNeighbours, nn)
} }
// node is present at node[i] pbNeighbour := &pbNet.Node{
neighbour := &pbNet.Neighbour{ Id: neighbour.Id(),
Node: &pbNet.Node{ Address: neighbour.Address(),
Id: neighbour.Id(),
Address: neighbour.Address(),
},
Neighbours: nodeNeighbours,
} }
neighbours = append(neighbours, neighbour) neighbours = append(neighbours, pbNeighbour)
} }
} }
resp.Neighbours = neighbours // requested neighbourhood node
node := &pbNet.Node{
Id: nodes[i].Id(),
Address: nodes[i].Address(),
}
// creaate neighbourhood answer
neighbourhood := &pbNet.Neighbour{
Node: node,
Neighbours: neighbours,
}
resp.Neighbourhood = neighbourhood
return nil return nil
} }

View File

@ -135,10 +135,10 @@ func (m *NeighbourhoodRequest) GetId() string {
// NeighbourhoodResponse contains node neighbourhood hierarchy // NeighbourhoodResponse contains node neighbourhood hierarchy
type NeighbourhoodResponse struct { type NeighbourhoodResponse struct {
Neighbours []*Neighbour `protobuf:"bytes,1,rep,name=neighbours,proto3" json:"neighbours,omitempty"` Neighbourhood *Neighbour `protobuf:"bytes,1,opt,name=neighbourhood,proto3" json:"neighbourhood,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
} }
func (m *NeighbourhoodResponse) Reset() { *m = NeighbourhoodResponse{} } func (m *NeighbourhoodResponse) Reset() { *m = NeighbourhoodResponse{} }
@ -166,9 +166,9 @@ func (m *NeighbourhoodResponse) XXX_DiscardUnknown() {
var xxx_messageInfo_NeighbourhoodResponse proto.InternalMessageInfo var xxx_messageInfo_NeighbourhoodResponse proto.InternalMessageInfo
func (m *NeighbourhoodResponse) GetNeighbours() []*Neighbour { func (m *NeighbourhoodResponse) GetNeighbourhood() *Neighbour {
if m != nil { if m != nil {
return m.Neighbours return m.Neighbourhood
} }
return nil return nil
} }
@ -369,27 +369,27 @@ func init() {
func init() { proto.RegisterFile("network.proto", fileDescriptor_8571034d60397816) } func init() { proto.RegisterFile("network.proto", fileDescriptor_8571034d60397816) }
var fileDescriptor_8571034d60397816 = []byte{ var fileDescriptor_8571034d60397816 = []byte{
// 344 bytes of a gzipped FileDescriptorProto // 348 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x52, 0x41, 0x4f, 0xf2, 0x40, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x52, 0x41, 0x4f, 0x32, 0x31,
0x10, 0xfd, 0x28, 0xf0, 0x11, 0x06, 0x31, 0x66, 0xa3, 0xa6, 0xa9, 0xc1, 0x90, 0x3d, 0x20, 0x31, 0x10, 0xfd, 0x58, 0xe0, 0x23, 0x0c, 0x62, 0x4c, 0xa3, 0x66, 0xb3, 0x06, 0x43, 0x7a, 0x40, 0x62,
0x5a, 0x0c, 0x44, 0x2f, 0x7a, 0xe3, 0xe0, 0x85, 0x70, 0x68, 0xfc, 0x03, 0x96, 0xdd, 0x94, 0x8d, 0x74, 0x31, 0x10, 0x3d, 0x79, 0x31, 0x1c, 0xbc, 0x10, 0x0e, 0x7b, 0xf4, 0xe6, 0xd2, 0x66, 0x69,
0xb2, 0x83, 0xbb, 0xdb, 0xf8, 0x07, 0xfc, 0xe1, 0xa6, 0xdb, 0x2d, 0x16, 0x10, 0x0c, 0xb7, 0xce, 0x94, 0x1d, 0x6c, 0xbb, 0xf1, 0x0f, 0xf8, 0xc3, 0x4d, 0xbb, 0x05, 0x97, 0x45, 0x30, 0xdc, 0xda,
0xcc, 0x7b, 0xf3, 0x66, 0xfb, 0x1e, 0xb4, 0x25, 0x37, 0x9f, 0xa8, 0xde, 0xc2, 0xa5, 0x42, 0x83, 0x99, 0xf7, 0xe6, 0xcd, 0xe4, 0x3d, 0x68, 0xa7, 0x5c, 0x7f, 0xa2, 0x7c, 0x0b, 0x97, 0x12, 0x35,
0xe4, 0x24, 0xc1, 0x70, 0x21, 0x66, 0x0a, 0x43, 0xd7, 0x0f, 0x46, 0x89, 0x30, 0xf3, 0x34, 0x0e, 0x92, 0x93, 0x04, 0xc3, 0x85, 0x98, 0x49, 0x0c, 0x5d, 0x3d, 0x18, 0x25, 0x42, 0xcf, 0xb3, 0x38,
0x67, 0xb8, 0x18, 0xd8, 0xc9, 0x20, 0xc1, 0xdb, 0xfc, 0x43, 0x61, 0x6a, 0xb8, 0x1a, 0x58, 0xa6, 0x9c, 0xe1, 0x62, 0x60, 0x3b, 0x83, 0x04, 0x6f, 0xf3, 0x87, 0xc4, 0x4c, 0x73, 0x39, 0xb0, 0x4c,
0x2b, 0xf2, 0x35, 0xb4, 0x0d, 0xad, 0x89, 0xd0, 0x26, 0xe2, 0x1f, 0x29, 0xd7, 0x86, 0x3e, 0xc1, 0xf7, 0xc9, 0xc7, 0xd0, 0x36, 0xb4, 0x26, 0x42, 0xe9, 0x88, 0x7f, 0x64, 0x5c, 0x69, 0xfa, 0x08,
0x51, 0x5e, 0xea, 0x25, 0x4a, 0xcd, 0xc9, 0x0d, 0xd4, 0x25, 0x32, 0xae, 0xfd, 0x4a, 0xb7, 0xda, 0x47, 0xf9, 0x57, 0x2d, 0x31, 0x55, 0x9c, 0xdc, 0x40, 0x3d, 0x45, 0xc6, 0x95, 0x5f, 0xe9, 0x56,
0x6f, 0x0d, 0xcf, 0xc3, 0x4d, 0xd5, 0x70, 0x8a, 0x8c, 0x47, 0x39, 0x88, 0xf6, 0xe0, 0x74, 0xca, 0xfb, 0xad, 0xe1, 0x79, 0x58, 0x56, 0x0d, 0xa7, 0xc8, 0x78, 0x94, 0x83, 0x68, 0x0f, 0x4e, 0xa7,
0x45, 0x32, 0x8f, 0x31, 0x55, 0x73, 0x44, 0xe6, 0xb6, 0x92, 0x63, 0xf0, 0x04, 0xf3, 0x2b, 0xdd, 0x5c, 0x24, 0xf3, 0x18, 0x33, 0x39, 0x47, 0x64, 0x6e, 0x2a, 0x39, 0x06, 0x4f, 0x30, 0xbf, 0xd2,
0x4a, 0xbf, 0x19, 0x79, 0x82, 0xd1, 0x17, 0x38, 0xdb, 0xc0, 0x39, 0xb9, 0x47, 0x00, 0x59, 0x0c, 0xad, 0xf4, 0x9b, 0x91, 0x27, 0x18, 0x7d, 0x81, 0xb3, 0x12, 0xce, 0xc9, 0x3d, 0x99, 0x2b, 0x0b,
0x0a, 0xcd, 0x8b, 0x5f, 0x34, 0x0b, 0x4c, 0x54, 0x82, 0xd3, 0x3b, 0xa8, 0x65, 0xc7, 0x6c, 0xaa, 0x0d, 0xcb, 0x69, 0x0d, 0x2f, 0x7e, 0x91, 0x5d, 0xc1, 0xa2, 0x4d, 0x06, 0xbd, 0x83, 0x9a, 0x59,
0x11, 0x1f, 0x1a, 0xaf, 0x8c, 0x29, 0xae, 0xb5, 0xef, 0xd9, 0x66, 0x51, 0xd2, 0x7b, 0x68, 0x8c, 0xa9, 0xac, 0x49, 0x7c, 0x68, 0xbc, 0x32, 0x26, 0xb9, 0x52, 0xbe, 0x67, 0x8b, 0xab, 0x2f, 0xbd,
0x51, 0x4a, 0x3e, 0x33, 0xe4, 0x1a, 0x6a, 0xd9, 0x1b, 0x2c, 0x6d, 0xf7, 0x3b, 0x2d, 0x86, 0x8e, 0x87, 0xc6, 0x18, 0xd3, 0x94, 0xcf, 0x34, 0xb9, 0x86, 0x9a, 0xb9, 0xc4, 0xc9, 0xee, 0xba, 0xd6,
0xa0, 0x3e, 0x7e, 0x47, 0xcd, 0x0f, 0x22, 0x21, 0x34, 0x57, 0x67, 0x1f, 0x42, 0x24, 0x0f, 0x6b, 0x62, 0xe8, 0x08, 0xea, 0xe3, 0x77, 0x54, 0xfc, 0x20, 0x12, 0x42, 0x73, 0xbd, 0xf9, 0x21, 0x44,
0xff, 0xa4, 0xba, 0xd7, 0x87, 0x12, 0x72, 0xf8, 0xe5, 0x41, 0x63, 0x9a, 0x0f, 0xc9, 0x33, 0x80, 0xf2, 0x00, 0xb0, 0xbe, 0x53, 0xf9, 0xd5, 0xbd, 0x6e, 0x14, 0x90, 0xc3, 0x2f, 0x0f, 0x1a, 0xd3,
0xb5, 0x35, 0x73, 0x5e, 0x13, 0xff, 0x87, 0xed, 0xb2, 0xe0, 0x8c, 0x0a, 0x3a, 0x5b, 0x93, 0x72, 0xbc, 0x49, 0x9e, 0x01, 0xac, 0xb9, 0xc6, 0x7f, 0x45, 0xfc, 0x1f, 0xb6, 0x4b, 0x84, 0xb3, 0x2b,
0x1a, 0xe8, 0x3f, 0x32, 0x81, 0x66, 0xd6, 0xc9, 0xc4, 0x34, 0xe9, 0x6c, 0x5f, 0x51, 0xca, 0x52, 0xe8, 0x6c, 0x75, 0x8a, 0x99, 0xa0, 0xff, 0xc8, 0x04, 0x9a, 0xa6, 0x62, 0xc4, 0x14, 0xe9, 0x6c,
0x70, 0xb9, 0x6b, 0xbc, 0xda, 0x16, 0x43, 0x7b, 0x2d, 0x07, 0xa4, 0xb7, 0xc7, 0xeb, 0x52, 0xa0, 0x6f, 0x51, 0x48, 0x54, 0x70, 0xb9, 0xab, 0xbd, 0x9e, 0x16, 0x43, 0x7b, 0x23, 0x0d, 0xa4, 0xb7,
0x82, 0xab, 0x3f, 0x71, 0x85, 0x46, 0xfc, 0xdf, 0xe6, 0x7c, 0xf4, 0x1d, 0x00, 0x00, 0xff, 0xff, 0xc7, 0xee, 0x42, 0xac, 0x82, 0xab, 0x3f, 0x71, 0x2b, 0x8d, 0xf8, 0xbf, 0x4d, 0xfb, 0xe8, 0x3b,
0x11, 0x41, 0xd2, 0x02, 0x3f, 0x03, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfb, 0xa1, 0x6b, 0xb0, 0x45, 0x03, 0x00, 0x00,
} }

View File

@ -26,7 +26,7 @@ message NeighbourhoodRequest {
// NeighbourhoodResponse contains node neighbourhood hierarchy // NeighbourhoodResponse contains node neighbourhood hierarchy
message NeighbourhoodResponse { message NeighbourhoodResponse {
repeated Neighbour neighbours = 1; Neighbour neighbourhood = 1;
} }
// Node is network node // Node is network node