mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
raft: add RawNode.TickQuiesced
TickQuiesced allows the caller to support "quiesced" Raft groups which do not perform periodic heartbeats and elections. This is useful in a system with thousands of Raft groups where these periodic operations can be overwhelming in an otherwise idle system. It might seem possible to avoid advancing the logical clock at all in such Raft groups, but doing so has an interaction with the CheckQuorum functionality. If a follower is not quiesced while the leader is the follower can call an election that will fail because the leader's lease has not expired (electionElapsed < electionTimeout). The next time the leader sends a heartbeat to this follower the follower will see that the heartbeat is from a previous term and respond with a MsgAppResp. This in turn will cause the leader to step down and become a follower even though there isn't a leader in the group. By allowing the leader's logical clock to advance via TickQuiesced, the leader won't reject the election and there will be a smooth transfer of leadership to the follower.
This commit is contained in:
parent
9913e0073c
commit
37fa6ac45c
@ -123,6 +123,18 @@ func (rn *RawNode) Tick() {
|
||||
rn.raft.tick()
|
||||
}
|
||||
|
||||
// TickQuiesced advances the internal logical clock by a single tick without
|
||||
// performing any other state machine processing. It allows the caller to avoid
|
||||
// periodic heartbeats and elections when all of the peers in a Raft group are
|
||||
// known to be at the same state. Expected usage is to periodically invoke Tick
|
||||
// or TickQuiesced depending on whether the group is "active" or "quiesced".
|
||||
//
|
||||
// WARNING: Be very careful about using this method as it subverts the Raft
|
||||
// state machine. You should probably be using Tick instead.
|
||||
func (rn *RawNode) TickQuiesced() {
|
||||
rn.raft.electionElapsed++
|
||||
}
|
||||
|
||||
// Campaign causes this RawNode to transition to candidate state.
|
||||
func (rn *RawNode) Campaign() error {
|
||||
return rn.raft.Step(pb.Message{
|
||||
|
Loading…
x
Reference in New Issue
Block a user