# Test that leadership transfers don't use PreVote and don't need store liveness
# support to campaign.

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.
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 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
> 3 receiving messages
  2->3 MsgVote Term:2 Log:1/11
  DEBUG 3 setting election elapsed to start from 3 ticks after store liveness support expired
  INFO 3 [term: 1] received a MsgVote message with higher term from 2 [term: 2], advancing term
  INFO 3 became follower at term 2
  DEBUG 3 reset election elapsed to 0
  INFO 3 [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
> 3 handling Ready
  Ready MustSync=true:
  HardState Term:2 Vote:2 Commit:11 Lead:0 LeadEpoch:0
  Messages:
  3->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
  3->2 MsgVoteResp Term:2 Log:0/0
> 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 ""]
> 3 receiving messages
  2->3 MsgFortifyLeader Term:2 Log:0/0
  2->3 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
> 3 handling Ready
  Ready MustSync=true:
  HardState Term:2 Vote:2 Commit:11 Lead:2 LeadEpoch:1
  Entries:
  2/12 EntryNormal ""
  Messages:
  3->2 MsgFortifyLeaderResp Term:2 Log:0/0 LeadEpoch:1
  3->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
  3->2 MsgFortifyLeaderResp Term:2 Log:0/0 LeadEpoch:1
  3->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
  2->3 MsgApp Term:2 Log:1/11 Commit:12 Entries:[2/12 EntryNormal ""]
  2->3 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
> 3 receiving messages
  2->3 MsgApp Term:2 Log:1/11 Commit:12 Entries:[2/12 EntryNormal ""]
  2->3 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
> 3 handling Ready
  Ready MustSync=true:
  HardState Term:2 Vote:2 Commit:12 Lead:2 LeadEpoch:1
  CommittedEntries:
  2/12 EntryNormal ""
  Messages:
  3->2 MsgAppResp Term:2 Log:0/12 Commit:12
  3->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
  3->2 MsgAppResp Term:2 Log:0/12 Commit:12
  3->2 MsgAppResp Term:2 Log:0/12 Commit:12

# Withdraw support for 3 and transfer leadership to it.
withdraw-support 1 3
----
  1 2 3
1 1 1 x
2 1 1 1
3 1 1 1

withdraw-support 2 3
----
  1 2 3
1 1 1 x
2 1 1 x
3 1 1 1

# 3 should fail to campaign.
campaign 3
----
DEBUG 3 ignoring MsgHup due to leader fortification

stabilize
----
ok

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

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