mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
raft: set ready.st to empty state, if current state is equal to previous state
This commit is contained in:
23
raft/node.go
23
raft/node.go
@@ -38,8 +38,8 @@ func isStateEqual(a, b pb.State) bool {
|
||||
return a.Term == b.Term && a.Vote == b.Vote && a.LastIndex == b.LastIndex
|
||||
}
|
||||
|
||||
func (rd Ready) containsUpdates(prevSt pb.State) bool {
|
||||
return !isStateEqual(prevSt, rd.State) || len(rd.Entries) > 0 || len(rd.CommittedEntries) > 0 || len(rd.Messages) > 0
|
||||
func (rd Ready) containsUpdates() bool {
|
||||
return !isStateEqual(EmptyState, rd.State) || len(rd.Entries) > 0 || len(rd.CommittedEntries) > 0 || len(rd.Messages) > 0
|
||||
}
|
||||
|
||||
type Node struct {
|
||||
@@ -100,13 +100,18 @@ func (n *Node) run(r *raft) {
|
||||
}
|
||||
|
||||
rd := Ready{
|
||||
r.State,
|
||||
r.raftLog.unstableEnts(),
|
||||
r.raftLog.nextEnts(),
|
||||
r.msgs,
|
||||
Entries: r.raftLog.unstableEnts(),
|
||||
CommittedEntries: r.raftLog.nextEnts(),
|
||||
Messages: r.msgs,
|
||||
}
|
||||
|
||||
if rd.containsUpdates(prevSt) {
|
||||
if isStateEqual(r.State, prevSt) {
|
||||
rd.State = EmptyState
|
||||
} else {
|
||||
rd.State = r.State
|
||||
}
|
||||
|
||||
if rd.containsUpdates() {
|
||||
readyc = n.readyc
|
||||
} else {
|
||||
readyc = nil
|
||||
@@ -123,7 +128,9 @@ func (n *Node) run(r *raft) {
|
||||
case readyc <- rd:
|
||||
r.raftLog.resetNextEnts()
|
||||
r.raftLog.resetUnstable()
|
||||
prevSt = rd.State
|
||||
if !isStateEqual(rd.State, EmptyState) {
|
||||
prevSt = rd.State
|
||||
}
|
||||
r.msgs = nil
|
||||
case <-n.done:
|
||||
return
|
||||
|
||||
@@ -51,7 +51,7 @@ func TestNodeRestart(t *testing.T) {
|
||||
st := raftpb.State{Term: 1, Vote: -1, Commit: 1, LastIndex: 2}
|
||||
|
||||
want := Ready{
|
||||
State: st,
|
||||
State: EmptyState,
|
||||
// commit upto index commit index in st
|
||||
CommittedEntries: entries[:st.Commit],
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user