mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
raft: fix promotable
This commit is contained in:
@@ -195,7 +195,7 @@ func (n *Node) Next() []Entry {
|
||||
// If the current elapsed is greater or equal than the timeout,
|
||||
// node will send corresponding message to the statemachine.
|
||||
func (n *Node) Tick() {
|
||||
if !n.sm.promotable() {
|
||||
if n.sm.promotable == false {
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@@ -13,8 +13,7 @@ const (
|
||||
func TestTickMsgHup(t *testing.T) {
|
||||
n := New(0, defaultHeartbeat, defaultElection)
|
||||
n.sm = newStateMachine(0, []int64{0, 1, 2})
|
||||
// simulate to patch the join log
|
||||
n.Step(Message{From: 1, Type: msgApp, Commit: 1, Entries: []Entry{Entry{}}})
|
||||
n.sm.promotable = true
|
||||
|
||||
for i := 0; i < defaultElection*2; i++ {
|
||||
n.Tick()
|
||||
@@ -80,6 +79,7 @@ func TestResetElapse(t *testing.T) {
|
||||
for i, tt := range tests {
|
||||
n := New(0, defaultHeartbeat, defaultElection)
|
||||
n.sm = newStateMachine(0, []int64{0, 1, 2})
|
||||
n.sm.promotable = true
|
||||
n.sm.raftLog.append(0, Entry{Type: Normal, Term: 1})
|
||||
n.sm.term = 2
|
||||
n.sm.raftLog.committed = 1
|
||||
|
||||
15
raft/raft.go
15
raft/raft.go
@@ -158,6 +158,11 @@ type stateMachine struct {
|
||||
pendingConf bool
|
||||
|
||||
unstableState State
|
||||
|
||||
// promotable indicates whether state machine could be promoted.
|
||||
// New machine has to wait until it has been added to the cluster, or it
|
||||
// may become the leader of the cluster without it.
|
||||
promotable bool
|
||||
}
|
||||
|
||||
func newStateMachine(id int64, peers []int64) *stateMachine {
|
||||
@@ -300,13 +305,6 @@ func (sm *stateMachine) appendEntry(e Entry) {
|
||||
sm.maybeCommit()
|
||||
}
|
||||
|
||||
// promotable indicates whether state machine could be promoted.
|
||||
// New machine has to wait for the first log entry to be committed, or it will
|
||||
// always start as a one-node cluster.
|
||||
func (sm *stateMachine) promotable() bool {
|
||||
return sm.raftLog.committed != 0
|
||||
}
|
||||
|
||||
func (sm *stateMachine) becomeFollower(term int64, lead int64) {
|
||||
sm.reset(term)
|
||||
sm.lead.Set(lead)
|
||||
@@ -408,6 +406,9 @@ func (sm *stateMachine) handleSnapshot(m Message) {
|
||||
func (sm *stateMachine) addNode(id int64) {
|
||||
sm.addIns(id, 0, sm.raftLog.lastIndex()+1)
|
||||
sm.pendingConf = false
|
||||
if id == sm.id {
|
||||
sm.promotable = true
|
||||
}
|
||||
}
|
||||
|
||||
func (sm *stateMachine) removeNode(id int64) {
|
||||
|
||||
Reference in New Issue
Block a user