@@ -220,6 +220,53 @@ func TestNRGObserverMode(t *testing.T) {
220
220
}
221
221
}
222
222
223
+ func TestNRGAEFromOldLeader (t * testing.T ) {
224
+ c := createJetStreamClusterExplicit (t , "R3S" , 3 )
225
+ defer c .shutdown ()
226
+
227
+ nc , _ := jsClientConnect (t , c .leader (), nats .UserInfo ("admin" , "s3cr3t!" ))
228
+ defer nc .Close ()
229
+
230
+ rg := c .createMemRaftGroup ("TEST" , 3 , newStateAdder )
231
+ rg .waitOnLeader ()
232
+
233
+ // Listen out for catchup requests.
234
+ ch := make (chan * nats.Msg , 16 )
235
+ _ , err := nc .ChanSubscribe (fmt .Sprintf (raftCatchupReply , ">" ), ch )
236
+ require_NoError (t , err )
237
+
238
+ // Start next term so that we can reuse term 1 in the next step.
239
+ leader := rg .leader ().node ().(* raft )
240
+ leader .StepDown ()
241
+ time .Sleep (time .Millisecond * 100 )
242
+ rg .waitOnLeader ()
243
+ require_Equal (t , leader .Term (), 2 )
244
+ leader = rg .leader ().node ().(* raft )
245
+
246
+ // Send an append entry with an outdated term. Beforehand, doing
247
+ // so would have caused a WAL reset and then would have triggered
248
+ // a Raft-level catchup.
249
+ ae := & appendEntry {
250
+ term : 1 ,
251
+ pindex : 0 ,
252
+ leader : leader .id ,
253
+ reply : nc .NewRespInbox (),
254
+ }
255
+ payload , err := ae .encode (nil )
256
+ require_NoError (t , err )
257
+ resp , err := nc .Request (leader .asubj , payload , time .Second )
258
+ require_NoError (t , err )
259
+
260
+ // Wait for the response, the server should have rejected it.
261
+ ar := leader .decodeAppendEntryResponse (resp .Data )
262
+ require_NotNil (t , ar )
263
+ require_Equal (t , ar .success , false )
264
+
265
+ // No catchup should happen at this point because no reset should
266
+ // have happened.
267
+ require_NoChanRead (t , ch , time .Second * 2 )
268
+ }
269
+
223
270
// TestNRGSimpleElection tests that a simple election succeeds. It is
224
271
// simple because the group hasn't processed any entries and hasn't
225
272
// suffered any interruptions of any kind, therefore there should be
0 commit comments