Skip to content

Commit f81e09a

Browse files
authored
Merge pull request #1836 from fcrisciani/network-db-extra-nodes
NetworkDB incorrect number of entries in networkNodes
2 parents f23721a + 297c3d4 commit f81e09a

4 files changed

Lines changed: 92 additions & 5 deletions

File tree

networkdb/cluster.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -310,12 +310,11 @@ func (nDB *NetworkDB) reapState() {
310310

311311
func (nDB *NetworkDB) reapNetworks() {
312312
nDB.Lock()
313-
for name, nn := range nDB.networks {
313+
for _, nn := range nDB.networks {
314314
for id, n := range nn {
315315
if n.leaving {
316316
if n.reapTime <= 0 {
317317
delete(nn, id)
318-
nDB.deleteNetworkNode(id, name)
319318
continue
320319
}
321320
n.reapTime -= reapPeriod

networkdb/delegate.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,12 @@ func (nDB *NetworkDB) handleNetworkEvent(nEvent *NetworkEvent) bool {
179179
flushEntries = true
180180
}
181181

182-
nDB.addNetworkNode(nEvent.NetworkID, nEvent.NodeName)
182+
if nEvent.Type == NetworkEventTypeLeave {
183+
nDB.deleteNetworkNode(nEvent.NetworkID, nEvent.NodeName)
184+
} else {
185+
nDB.addNetworkNode(nEvent.NetworkID, nEvent.NodeName)
186+
}
187+
183188
return true
184189
}
185190

networkdb/networkdb.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,7 @@ func (nDB *NetworkDB) JoinNetwork(nid string) error {
487487
},
488488
RetransmitMult: 4,
489489
}
490-
nDB.networkNodes[nid] = append(nDB.networkNodes[nid], nDB.config.NodeName)
490+
nDB.addNetworkNode(nid, nDB.config.NodeName)
491491
networkNodes := nDB.networkNodes[nid]
492492
nDB.Unlock()
493493

@@ -522,6 +522,8 @@ func (nDB *NetworkDB) LeaveNetwork(nid string) error {
522522
entries []*entry
523523
)
524524

525+
nDB.deleteNetworkNode(nid, nDB.config.NodeName)
526+
525527
nwWalker := func(path string, v interface{}) bool {
526528
entry, ok := v.(*entry)
527529
if !ok {
@@ -580,7 +582,10 @@ func (nDB *NetworkDB) addNetworkNode(nid string, nodeName string) {
580582
// passed network. Caller should hold the NetworkDB lock while calling
581583
// this
582584
func (nDB *NetworkDB) deleteNetworkNode(nid string, nodeName string) {
583-
nodes := nDB.networkNodes[nid]
585+
nodes, ok := nDB.networkNodes[nid]
586+
if !ok || len(nodes) == 0 {
587+
return
588+
}
584589
newNodes := make([]string, 0, len(nodes)-1)
585590
for _, name := range nodes {
586591
if name == nodeName {

networkdb/networkdb_test.go

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,3 +436,81 @@ func TestNetworkDBCRUDMediumCluster(t *testing.T) {
436436
log.Print("Closing DB instances...")
437437
closeNetworkDBInstances(dbs)
438438
}
439+
440+
func TestNetworkDBNodeJoinLeaveIteration(t *testing.T) {
441+
maxRetry := 5
442+
dbs := createNetworkDBInstances(t, 2, "node")
443+
444+
// Single node Join/Leave
445+
err := dbs[0].JoinNetwork("network1")
446+
assert.NoError(t, err)
447+
448+
if len(dbs[0].networkNodes["network1"]) != 1 {
449+
t.Fatalf("The networkNodes list has to have be 1 instead of %d", len(dbs[0].networkNodes["network1"]))
450+
}
451+
452+
err = dbs[0].LeaveNetwork("network1")
453+
assert.NoError(t, err)
454+
455+
if len(dbs[0].networkNodes["network1"]) != 0 {
456+
t.Fatalf("The networkNodes list has to have be 0 instead of %d", len(dbs[0].networkNodes["network1"]))
457+
}
458+
459+
// Multiple nodes Join/Leave
460+
err = dbs[0].JoinNetwork("network1")
461+
assert.NoError(t, err)
462+
463+
err = dbs[1].JoinNetwork("network1")
464+
assert.NoError(t, err)
465+
466+
// Wait for the propagation on db[0]
467+
for i := 0; i < maxRetry; i++ {
468+
if len(dbs[0].networkNodes["network1"]) == 2 {
469+
break
470+
}
471+
time.Sleep(1 * time.Second)
472+
}
473+
if len(dbs[0].networkNodes["network1"]) != 2 {
474+
t.Fatalf("The networkNodes list has to have be 2 instead of %d - %v", len(dbs[0].networkNodes["network1"]), dbs[0].networkNodes["network1"])
475+
}
476+
477+
// Wait for the propagation on db[1]
478+
for i := 0; i < maxRetry; i++ {
479+
if len(dbs[1].networkNodes["network1"]) == 2 {
480+
break
481+
}
482+
time.Sleep(1 * time.Second)
483+
}
484+
if len(dbs[1].networkNodes["network1"]) != 2 {
485+
t.Fatalf("The networkNodes list has to have be 2 instead of %d - %v", len(dbs[1].networkNodes["network1"]), dbs[1].networkNodes["network1"])
486+
}
487+
488+
// Try a quick leave/join
489+
err = dbs[0].LeaveNetwork("network1")
490+
assert.NoError(t, err)
491+
err = dbs[0].JoinNetwork("network1")
492+
assert.NoError(t, err)
493+
494+
for i := 0; i < maxRetry; i++ {
495+
if len(dbs[0].networkNodes["network1"]) == 2 {
496+
break
497+
}
498+
time.Sleep(1 * time.Second)
499+
}
500+
if len(dbs[0].networkNodes["network1"]) != 2 {
501+
t.Fatalf("The networkNodes list has to have be 2 instead of %d - %v", len(dbs[0].networkNodes["network1"]), dbs[0].networkNodes["network1"])
502+
}
503+
504+
for i := 0; i < maxRetry; i++ {
505+
if len(dbs[1].networkNodes["network1"]) == 2 {
506+
break
507+
}
508+
time.Sleep(1 * time.Second)
509+
}
510+
if len(dbs[1].networkNodes["network1"]) != 2 {
511+
t.Fatalf("The networkNodes list has to have be 2 instead of %d - %v", len(dbs[1].networkNodes["network1"]), dbs[1].networkNodes["network1"])
512+
}
513+
514+
dbs[0].Close()
515+
dbs[1].Close()
516+
}

0 commit comments

Comments
 (0)