[ 
https://issues.apache.org/jira/browse/RATIS-1268?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Lokesh Jain resolved RATIS-1268.
--------------------------------
    Fix Version/s: 1.1.0
       Resolution: Fixed

> Fix leader can not vote for candidate
> -------------------------------------
>
>                 Key: RATIS-1268
>                 URL: https://issues.apache.org/jira/browse/RATIS-1268
>             Project: Ratis
>          Issue Type: Bug
>            Reporter: runzhiwang
>            Assignee: runzhiwang
>            Priority: Major
>             Fix For: 1.1.0
>
>          Time Spent: 1h 40m
>  Remaining Estimate: 0h
>
> What's the problem ?
> For example, when s0 is leader, and s1 askForVote, in the first rpc of 
> askForVote, s0 can not vote for s1, even though s1's log catch up. When s1 
> askForVote the second time, s0 has become follower in the first askForVote, 
> so s0 can vote for s1, waste one rpc call.
> What's the reason ?
> As the following code shows, when s0 is leader, 
> role.getFollowerState().orElse(null) should return null,
> then can not pass check if (fs != null && candidate != null) because fs is 
> null, so s0 can not vote for s1.
> {code:java}
>       FollowerState fs = role.getFollowerState().orElse(null);
>       if (shouldWithholdVotes(candidateTerm)) {
>         ...
>       } else if (state.recognizeCandidate(candidateId, candidateTerm)) {
>         final boolean termUpdated = changeToFollower(candidateTerm, true, 
> "recognizeCandidate:" + candidateId);
>         RaftPeer candidate = getRaftConf().getPeer(candidateId);
>         if (fs != null && candidate != null) {
>          ...
>        }
> {code}
> How to fix ?
> After leader final boolean termUpdated = changeToFollower(candidateTerm, 
> true, "recognizeCandidate:" + candidateId);, we can get fs again.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to