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
@@ -4089,8 +4094,9 @@ func (n *raft) switchState(state RaftState) {
4089
4094
4090
4095
if pstate == Leader && state != Leader {
4091
4096
n .updateLeadChange (false )
4092
- // Drain the response queue .
4097
+ // Drain the append entry response and proposal queues .
4093
4098
n .resp .drain ()
4099
+ n .prop .drain ()
4094
4100
} else if state == Leader && pstate != Leader {
4095
4101
if len (n .pae ) > 0 {
4096
4102
n .pae = make (map [uint64 ]* appendEntry )
Original file line number Diff line number Diff line change @@ -295,6 +295,28 @@ func TestNRGSimpleElection(t *testing.T) {
295
295
}
296
296
}
297
297
298
+ func TestNRGSwitchStateClearsQueues (t * testing.T ) {
299
+ c := createJetStreamClusterExplicit (t , "R3S" , 3 )
300
+ defer c .shutdown ()
301
+
302
+ rg := c .createMemRaftGroup ("TEST" , 3 , newStateAdder )
303
+ rg .waitOnLeader ()
304
+
305
+ sa := rg .leader ().(* stateAdder )
306
+ n := sa .node ().(* raft )
307
+
308
+ for i := 0 ; i < 10_000 ; i ++ {
309
+ sa .proposeDelta (1 )
310
+ }
311
+
312
+ n .Lock ()
313
+ defer n .Unlock ()
314
+
315
+ n .switchState (Follower )
316
+ require_Equal (t , n .prop .len (), 0 )
317
+ require_Equal (t , n .resp .len (), 0 )
318
+ }
319
+
298
320
func TestNRGStepDownOnSameTermDoesntClearVote (t * testing.T ) {
299
321
c := createJetStreamClusterExplicit (t , "R3S" , 3 )
300
322
defer c .shutdown ()
You can’t perform that action at this time.
0 commit comments