# Test that creates a scenario where a peer learns about a new leadership term
# via a snapshot.

log-level none
----
ok

add-nodes 3 voters=(1,2,3) index=10
----
ok

# Elect 1 as leader.
campaign 1
----
ok

stabilize
----
ok

log-level debug
----
ok

raft-state
----
1: StateLeader (Voter) Term:1 Lead:1 LeadEpoch:1
2: StateFollower (Voter) Term:1 Lead:1 LeadEpoch:1
3: StateFollower (Voter) Term:1 Lead:1 LeadEpoch:1

# Transfer leadership to 2, without 3 hearing about it.
transfer-leadership from=1 to=2
----
INFO 1 [term 1] starts to transfer leadership to 2
INFO 1 sends MsgTimeoutNow to 2 immediately as 2 already has up-to-date log
DEBUG 1 setting election elapsed to start from 3 ticks after store liveness support expired
INFO 1 became follower at term 1
DEBUG 1 reset election elapsed to 0

stabilize 1 2
----
> 1 handling Ready
  Ready MustSync=true:
  State:StateFollower
  HardState Term:1 Vote:1 Commit:11 Lead:0 LeadEpoch:0
  Messages:
  1->2 MsgTimeoutNow Term:1 Log:0/0
> 2 receiving messages
  1->2 MsgTimeoutNow Term:1 Log:0/0
  INFO 2 [term 1] received MsgTimeoutNow from 1 and starts an election to get leadership
  INFO 2 is starting a new election at term 1
  INFO 2 became candidate at term 2
  INFO 2 [logterm: 1, index: 11] sent MsgVote request to 1 at term 2
  INFO 2 [logterm: 1, index: 11] sent MsgVote request to 3 at term 2
> 2 handling Ready
  Ready MustSync=true:
  State:StateCandidate
  HardState Term:2 Vote:2 Commit:11 Lead:0 LeadEpoch:0
  Messages:
  2->1 MsgVote Term:2 Log:1/11
  2->3 MsgVote Term:2 Log:1/11
  INFO 2 received MsgVoteResp from 2 at term 2
  INFO 2 has received 1 MsgVoteResp votes and 0 vote rejections
> 1 receiving messages
  2->1 MsgVote Term:2 Log:1/11
  INFO 1 [term: 1] received a MsgVote message with higher term from 2 [term: 2], advancing term
  INFO 1 became follower at term 2
  DEBUG 1 reset election elapsed to 0
  INFO 1 [logterm: 1, index: 11, vote: 0] cast MsgVote for 2 [logterm: 1, index: 11] at term 2
> 1 handling Ready
  Ready MustSync=true:
  HardState Term:2 Vote:2 Commit:11 Lead:0 LeadEpoch:0
  Messages:
  1->2 MsgVoteResp Term:2 Log:0/0
> 2 receiving messages
  1->2 MsgVoteResp Term:2 Log:0/0
  INFO 2 received MsgVoteResp from 1 at term 2
  INFO 2 has received 2 MsgVoteResp votes and 0 vote rejections
  INFO 2 became leader at term 2
> 2 handling Ready
  Ready MustSync=true:
  State:StateLeader
  HardState Term:2 Vote:2 Commit:11 Lead:2 LeadEpoch:1
  Entries:
  2/12 EntryNormal ""
  Messages:
  2->1 MsgFortifyLeader Term:2 Log:0/0
  2->3 MsgFortifyLeader Term:2 Log:0/0
  2->1 MsgApp Term:2 Log:1/11 Commit:11 Entries:[2/12 EntryNormal ""]
  2->3 MsgApp Term:2 Log:1/11 Commit:11 Entries:[2/12 EntryNormal ""]
> 1 receiving messages
  2->1 MsgFortifyLeader Term:2 Log:0/0
  2->1 MsgApp Term:2 Log:1/11 Commit:11 Entries:[2/12 EntryNormal ""]
> 1 handling Ready
  Ready MustSync=true:
  HardState Term:2 Vote:2 Commit:11 Lead:2 LeadEpoch:1
  Entries:
  2/12 EntryNormal ""
  Messages:
  1->2 MsgFortifyLeaderResp Term:2 Log:0/0 LeadEpoch:1
  1->2 MsgAppResp Term:2 Log:0/12 Commit:11
> 2 receiving messages
  1->2 MsgFortifyLeaderResp Term:2 Log:0/0 LeadEpoch:1
  1->2 MsgAppResp Term:2 Log:0/12 Commit:11
> 2 handling Ready
  Ready MustSync=true:
  HardState Term:2 Vote:2 Commit:12 Lead:2 LeadEpoch:1
  CommittedEntries:
  2/12 EntryNormal ""
  Messages:
  2->1 MsgApp Term:2 Log:1/11 Commit:11 Entries:[2/12 EntryNormal ""]
  2->1 MsgApp Term:2 Log:2/12 Commit:12
> 1 receiving messages
  2->1 MsgApp Term:2 Log:1/11 Commit:11 Entries:[2/12 EntryNormal ""]
  2->1 MsgApp Term:2 Log:2/12 Commit:12
> 1 handling Ready
  Ready MustSync=true:
  HardState Term:2 Vote:2 Commit:12 Lead:2 LeadEpoch:1
  CommittedEntries:
  2/12 EntryNormal ""
  Messages:
  1->2 MsgAppResp Term:2 Log:0/12 Commit:11
  1->2 MsgAppResp Term:2 Log:0/12 Commit:12
> 2 receiving messages
  1->2 MsgAppResp Term:2 Log:0/12 Commit:11
  1->2 MsgAppResp Term:2 Log:0/12 Commit:12

# Drop inflight messages to 3.
deliver-msgs drop=(3)
----
dropped: 2->3 MsgVote Term:2 Log:1/11
dropped: 2->3 MsgFortifyLeader Term:2 Log:0/0
dropped: 2->3 MsgApp Term:2 Log:1/11 Commit:11 Entries:[2/12 EntryNormal ""]

# Send a manual snapshot from 2 to 3, which will be at term 2.
send-snapshot 2 3
----
2->3 MsgSnap Term:2 Log:0/0
  Snapshot: Index:12 Term:2 ConfState:Voters:[1 2 3] VotersOutgoing:[] Learners:[] LearnersNext:[] AutoLeave:false

stabilize
----
> 3 receiving messages
  2->3 MsgSnap Term:2 Log:0/0
    Snapshot: Index:12 Term:2 ConfState:Voters:[1 2 3] VotersOutgoing:[] Learners:[] LearnersNext:[] AutoLeave:false
  INFO 3 [term: 1] received a MsgSnap message with higher term from 2 [term: 2], new leader indicated, advancing term
  DEBUG 3 setting election elapsed to start from 3 ticks after store liveness support expired
  INFO 3 became follower at term 2
  DEBUG 3 reset election elapsed to 0
  INFO log [committed=11, applied=11, applying=11, unstable.offset=12, unstable.offsetInProgress=12, len(unstable.Entries)=0] starts to restore snapshot [index: 12, term: 2]
  INFO 3 switched to configuration voters=(1 2 3)
  INFO 3 [commit: 12, lastindex: 12, lastterm: 2] restored snapshot [index: 12, term: 2]
  INFO 3 [commit: 12] restored snapshot [index: 12, term: 2]
> 3 handling Ready
  Ready MustSync=true:
  HardState Term:2 Commit:12 Lead:0 LeadEpoch:0
  Snapshot Index:12 Term:2 ConfState:Voters:[1 2 3] VotersOutgoing:[] Learners:[] LearnersNext:[] AutoLeave:false
  Messages:
  3->2 MsgAppResp Term:2 Log:0/12 Commit:12
> 2 receiving messages
  3->2 MsgAppResp Term:2 Log:0/12 Commit:12
