@@ -1747,9 +1747,6 @@ func (r *Raft) requestPreVote(rpc RPC, req *RequestPreVoteRequest) {
1747
1747
}()
1748
1748
1749
1749
// Check if we have an existing leader [who's not the candidate] and also
1750
- // check the LeadershipTransfer flag is set. Usually votes are rejected if
1751
- // there is a known leader. But if the leader initiated a leadership transfer,
1752
- // vote!
1753
1750
var candidate ServerAddress
1754
1751
candidateID := ServerID (req .ID )
1755
1752
@@ -2050,6 +2047,14 @@ func (r *Raft) electSelf() <-chan *voteResult {
2050
2047
// vote for ourself).
2051
2048
// This must only be called from the main thread.
2052
2049
func (r * Raft ) preElectSelf () <- chan * preVoteResult {
2050
+
2051
+ // At this point transport should support pre-vote
2052
+ // but check just in case
2053
+ prevoteTrans , prevoteTransSupported := r .trans .(WithPreVote )
2054
+ if ! prevoteTransSupported {
2055
+ panic ("preElection is not possible if the transport don't support pre-vote" )
2056
+ }
2057
+
2053
2058
// Create a response channel
2054
2059
respCh := make (chan * preVoteResult , len (r .configurations .latest .Servers ))
2055
2060
@@ -2068,30 +2073,30 @@ func (r *Raft) preElectSelf() <-chan *preVoteResult {
2068
2073
// Construct a function to ask for a vote
2069
2074
askPeer := func (peer Server ) {
2070
2075
r .goFunc (func () {
2071
- defer metrics .MeasureSince ([]string {"raft" , "candidate" , "electSelf " }, time .Now ())
2076
+ defer metrics .MeasureSince ([]string {"raft" , "candidate" , "preElectSelf " }, time .Now ())
2072
2077
resp := & preVoteResult {voterID : peer .ID }
2073
- if prevoteTrans , ok := r .trans .(WithPreVote ); ok {
2074
- err := prevoteTrans .RequestPreVote (peer .ID , peer .Address , req , & resp .RequestPreVoteResponse )
2075
-
2076
- // If the target server do not support Pre-vote RPC we count this as a granted vote to allow
2077
- // the cluster to progress.
2078
- if err != nil && strings .Contains (err .Error (), rpcUnexpectedCommandError ) {
2079
- r .logger .Error ("target do not support pre-vote RPC" ,
2080
- "target" , peer ,
2081
- "error" , err ,
2082
- "term" , req .Term )
2083
- resp .Term = req .Term
2084
- resp .Granted = true
2085
- } else if err != nil {
2086
- r .logger .Error ("failed to make requestVote RPC" ,
2087
- "target" , peer ,
2088
- "error" , err ,
2089
- "term" , req .Term )
2090
- resp .Term = req .Term
2091
- resp .Granted = false
2092
- }
2093
- respCh <- resp
2078
+
2079
+ err := prevoteTrans .RequestPreVote (peer .ID , peer .Address , req , & resp .RequestPreVoteResponse )
2080
+
2081
+ // If the target server do not support Pre-vote RPC we count this as a granted vote to allow
2082
+ // the cluster to progress.
2083
+ if err != nil && strings .Contains (err .Error (), rpcUnexpectedCommandError ) {
2084
+ r .logger .Error ("target do not support pre-vote RPC" ,
2085
+ "target" , peer ,
2086
+ "error" , err ,
2087
+ "term" , req .Term )
2088
+ resp .Term = req .Term
2089
+ resp .Granted = true
2090
+ } else if err != nil {
2091
+ r .logger .Error ("failed to make requestVote RPC" ,
2092
+ "target" , peer ,
2093
+ "error" , err ,
2094
+ "term" , req .Term )
2095
+ resp .Term = req .Term
2096
+ resp .Granted = false
2094
2097
}
2098
+ respCh <- resp
2099
+
2095
2100
})
2096
2101
}
2097
2102
0 commit comments