Description
Followup RATIS-1762.
There might be race conditions between priority-based YieldLeadership and user-requested TransferLeadership. For example:
Node | Role | Priority |
---|---|---|
Peer 1 | Leader | 0 |
Peer 2 | Follower | 1 |
Peer 3 | Follower | 1 |
If user requested TransferLeadership to peer 3, while the YieldLeadership found peer 2 has higher priority than current leader.
Peer 1 will send StartLeaderElection to both peer 2 and peer 3, and there might be a race condition (although it's benign).
One immediate thought is to use the new TransferLeadership to yield leadership to higher priority peer.
But it may cause following problems as quoted:
If the higher priority peer lags behind a lot, it may take some time to catch up the latest transaction. If the prior leader reject client requests, then the service may be unavailable for a long time.
To solve this problem, the old leader should only start TransferLeadership iff the higher priority peer is up-to-date.