Skip to content

Commit 533b617

Browse files
author
Yi EungJun
committed
Fix duplicated network node in NetworkDB
NetworkDB.networkNodes could have duplicated nodes if JoinNetwork is called repeteadly. Signed-off-by: Yi EungJun <[email protected]>
1 parent d34488a commit 533b617

File tree

2 files changed

+24
-34
lines changed

2 files changed

+24
-34
lines changed

networkdb/cluster.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ func (nDB *NetworkDB) gossip() {
327327
nDB.RLock()
328328
thisNodeNetworks := nDB.networks[nDB.config.NodeName]
329329
for nid := range thisNodeNetworks {
330-
networkNodes[nid] = nDB.networkNodes[nid]
330+
networkNodes[nid] = nDB.getNetworkNodes(nid)
331331

332332
}
333333
nDB.RUnlock()
@@ -399,7 +399,7 @@ func (nDB *NetworkDB) bulkSyncTables() {
399399
networks = networks[1:]
400400

401401
nDB.RLock()
402-
nodes := nDB.networkNodes[nid]
402+
nodes := nDB.getNetworkNodes(nid)
403403
nDB.RUnlock()
404404

405405
// No peer nodes on this network. Move on.

networkdb/networkdb.go

Lines changed: 22 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ type NetworkDB struct {
5757
// A map of nodes which are participating in a given
5858
// network. The key is a network ID.
5959

60-
networkNodes map[string][]string
60+
networkNodes map[string]map[string]bool
6161

6262
// A table of ack channels for every node from which we are
6363
// waiting for an ack.
@@ -167,7 +167,7 @@ func New(c *Config) (*NetworkDB, error) {
167167
nodes: make(map[string]*node),
168168
failedNodes: make(map[string]*node),
169169
leftNodes: make(map[string]*node),
170-
networkNodes: make(map[string][]string),
170+
networkNodes: make(map[string]map[string]bool),
171171
bulkSyncAckTbl: make(map[string]chan struct{}),
172172
broadcaster: events.NewBroadcaster(),
173173
}
@@ -308,17 +308,8 @@ func (nDB *NetworkDB) DeleteEntry(tname, nid, key string) error {
308308

309309
func (nDB *NetworkDB) deleteNetworkEntriesForNode(deletedNode string) {
310310
nDB.Lock()
311-
for nid, nodes := range nDB.networkNodes {
312-
updatedNodes := make([]string, 0, len(nodes))
313-
for _, node := range nodes {
314-
if node == deletedNode {
315-
continue
316-
}
317-
318-
updatedNodes = append(updatedNodes, node)
319-
}
320-
321-
nDB.networkNodes[nid] = updatedNodes
311+
for _, nodes := range nDB.networkNodes {
312+
delete(nodes, deletedNode)
322313
}
323314

324315
delete(nDB.networks, deletedNode)
@@ -402,16 +393,15 @@ func (nDB *NetworkDB) JoinNetwork(nid string) error {
402393
},
403394
RetransmitMult: 4,
404395
}
405-
nDB.networkNodes[nid] = append(nDB.networkNodes[nid], nDB.config.NodeName)
406-
networkNodes := nDB.networkNodes[nid]
396+
nDB.addNetworkNode(nid, nDB.config.NodeName)
407397
nDB.Unlock()
408398

409399
if err := nDB.sendNetworkEvent(nid, NetworkEventTypeJoin, ltime); err != nil {
410400
return fmt.Errorf("failed to send leave network event for %s: %v", nid, err)
411401
}
412402

413403
logrus.Debugf("%s: joined network %s", nDB.config.NodeName, nid)
414-
if _, err := nDB.bulkSync(networkNodes, true); err != nil {
404+
if _, err := nDB.bulkSync(nDB.getNetworkNodes(nid), true); err != nil {
415405
logrus.Errorf("Error bulk syncing while joining network %s: %v", nid, err)
416406
}
417407

@@ -481,29 +471,19 @@ func (nDB *NetworkDB) LeaveNetwork(nid string) error {
481471
// in the passed network only if it is not already present. Caller
482472
// should hold the NetworkDB lock while calling this
483473
func (nDB *NetworkDB) addNetworkNode(nid string, nodeName string) {
484-
nodes := nDB.networkNodes[nid]
485-
for _, node := range nodes {
486-
if node == nodeName {
487-
return
488-
}
474+
networkNodes, ok := nDB.networkNodes[nid]
475+
if !ok {
476+
networkNodes = make(map[string]bool)
477+
nDB.networkNodes[nid] = networkNodes
489478
}
490-
491-
nDB.networkNodes[nid] = append(nDB.networkNodes[nid], nodeName)
479+
networkNodes[nDB.config.NodeName] = true
492480
}
493481

494482
// Deletes the node from the list of nodes which participate in the
495483
// passed network. Caller should hold the NetworkDB lock while calling
496484
// this
497485
func (nDB *NetworkDB) deleteNetworkNode(nid string, nodeName string) {
498-
nodes := nDB.networkNodes[nid]
499-
for i, name := range nodes {
500-
if name == nodeName {
501-
nodes[i] = nodes[len(nodes)-1]
502-
nodes = nodes[:len(nodes)-1]
503-
break
504-
}
505-
}
506-
nDB.networkNodes[nid] = nodes
486+
delete(nDB.networkNodes[nid], nodeName)
507487
}
508488

509489
// findCommonnetworks find the networks that both this node and the
@@ -557,3 +537,13 @@ func (nDB *NetworkDB) updateLocalTableTime() {
557537
return false
558538
})
559539
}
540+
541+
// getNetworkNodes gets the list of nodes which participate
542+
// in the passed network.
543+
func (nDB *NetworkDB) getNetworkNodes(nid string) []string {
544+
names := []string{}
545+
for name := range nDB.networkNodes[nid] {
546+
names = append(names, name)
547+
}
548+
return names
549+
}

0 commit comments

Comments
 (0)