File tree Expand file tree Collapse file tree 2 files changed +34
-6
lines changed Expand file tree Collapse file tree 2 files changed +34
-6
lines changed Original file line number Diff line number Diff line change @@ -1989,9 +1989,11 @@ func (n *raft) runAsFollower() {
1989
1989
n .debug ("Ignoring old vote response, we have stepped down" )
1990
1990
n .votes .popOne ()
1991
1991
case <- n .resp .ch :
1992
- // We're receiving append entry responses from the network, probably because
1993
- // we have only just stepped down and they were already in flight. Ignore them.
1994
- n .resp .popOne ()
1992
+ // Ignore append entry responses received from before the state change.
1993
+ n .resp .drain ()
1994
+ case <- n .prop .ch :
1995
+ // Ignore proposals received from before the state change.
1996
+ n .prop .drain ()
1995
1997
case <- n .reqs .ch :
1996
1998
// We've just received a vote request from the network.
1997
1999
// Because of drain() it is possible that we get nil from popOne().
@@ -2966,8 +2968,11 @@ func (n *raft) runAsCandidate() {
2966
2968
case <- n .entry .ch :
2967
2969
n .processAppendEntries ()
2968
2970
case <- n .resp .ch :
2969
- // Ignore
2970
- n .resp .popOne ()
2971
+ // Ignore append entry responses received from before the state change.
2972
+ n .resp .drain ()
2973
+ case <- n .prop .ch :
2974
+ // Ignore proposals received from before the state change.
2975
+ n .prop .drain ()
2971
2976
case <- n .s .quitCh :
2972
2977
n .shutdown (false )
2973
2978
return
@@ -4093,8 +4098,9 @@ func (n *raft) switchState(state RaftState) {
4093
4098
4094
4099
if pstate == Leader && state != Leader {
4095
4100
n .updateLeadChange (false )
4096
- // Drain the response queue .
4101
+ // Drain the append entry response and proposal queues .
4097
4102
n .resp .drain ()
4103
+ n .prop .drain ()
4098
4104
} else if state == Leader && pstate != Leader {
4099
4105
if len (n .pae ) > 0 {
4100
4106
n .pae = make (map [uint64 ]* appendEntry )
Original file line number Diff line number Diff line change @@ -342,6 +342,28 @@ func TestNRGSimpleElection(t *testing.T) {
342
342
}
343
343
}
344
344
345
+ func TestNRGSwitchStateClearsQueues (t * testing.T ) {
346
+ c := createJetStreamClusterExplicit (t , "R3S" , 3 )
347
+ defer c .shutdown ()
348
+
349
+ rg := c .createMemRaftGroup ("TEST" , 3 , newStateAdder )
350
+ rg .waitOnLeader ()
351
+
352
+ sa := rg .leader ().(* stateAdder )
353
+ n := sa .node ().(* raft )
354
+
355
+ for i := 0 ; i < 10_000 ; i ++ {
356
+ sa .proposeDelta (1 )
357
+ }
358
+
359
+ n .Lock ()
360
+ defer n .Unlock ()
361
+
362
+ n .switchState (Follower )
363
+ require_Equal (t , n .prop .len (), 0 )
364
+ require_Equal (t , n .resp .len (), 0 )
365
+ }
366
+
345
367
func TestNRGStepDownOnSameTermDoesntClearVote (t * testing.T ) {
346
368
c := createJetStreamClusterExplicit (t , "R3S" , 3 )
347
369
defer c .shutdown ()
You can’t perform that action at this time.
0 commit comments