Skip to content

Commit 63ef41a

Browse files
committed
Fixing issue with aliveMsg replay
1 parent 9dc0511 commit 63ef41a

2 files changed

Lines changed: 21 additions & 4 deletions

File tree

state.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@ package memberlist
33
import (
44
"bytes"
55
"fmt"
6-
"github.com/armon/go-metrics"
76
"math"
87
"math/rand"
98
"net"
109
"sync/atomic"
1110
"time"
11+
12+
"github.com/armon/go-metrics"
1213
)
1314

1415
type nodeStateType int
@@ -277,6 +278,7 @@ func (m *Memberlist) resetNodes() {
277278

278279
// Deregister the dead nodes
279280
for i := deadIdx; i < len(m.nodes); i++ {
281+
delete(m.nodeMap, m.nodes[i].Name)
280282
m.nodes[i] = nil
281283
}
282284

@@ -855,9 +857,6 @@ func (m *Memberlist) deadNode(d *dead) {
855857
state.State = stateDead
856858
state.StateChange = time.Now()
857859

858-
// Remove from the node map
859-
delete(m.nodeMap, state.Name)
860-
861860
// Notify of death
862861
if m.config.Events != nil {
863862
m.config.Events.NotifyLeave(&state.Node)

state_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -712,6 +712,24 @@ func TestMemberList_DeadNode_OldDead(t *testing.T) {
712712
}
713713
}
714714

715+
func TestMemberList_DeadNode_AliveReplay(t *testing.T) {
716+
m := GetMemberlist(t)
717+
a := alive{Node: "test", Addr: []byte{127, 0, 0, 1}, Incarnation: 10}
718+
m.aliveNode(&a, nil, false)
719+
720+
d := dead{Node: "test", Incarnation: 10}
721+
m.deadNode(&d)
722+
723+
// Replay alive at same incarnation
724+
m.aliveNode(&a, nil, false)
725+
726+
// Should remain dead
727+
state, ok := m.nodeMap["test"]
728+
if ok && state.State != stateDead {
729+
t.Fatalf("Bad state")
730+
}
731+
}
732+
715733
func TestMemberList_DeadNode_Refute(t *testing.T) {
716734
m := GetMemberlist(t)
717735
a := alive{Node: m.config.Name, Addr: []byte{127, 0, 0, 1}, Incarnation: 1}

0 commit comments

Comments
 (0)