From be30595cb517ab37bfe08b1971e798aa30db3452 Mon Sep 17 00:00:00 2001 From: Chao Chen Date: Sun, 29 Oct 2023 09:45:58 -0700 Subject: [PATCH] etcdserver/raft.go: separate raft tick and ready Signed-off-by: Chao Chen --- server/etcdserver/api/v3rpc/interceptor.go | 2 +- server/etcdserver/raft.go | 13 +++++++++++-- server/etcdserver/server.go | 8 ++++---- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/server/etcdserver/api/v3rpc/interceptor.go b/server/etcdserver/api/v3rpc/interceptor.go index 776488ef9190..c764c5c516bd 100644 --- a/server/etcdserver/api/v3rpc/interceptor.go +++ b/server/etcdserver/api/v3rpc/interceptor.go @@ -323,7 +323,7 @@ func monitorLeader(s *etcdserver.EtcdServer) *streamsMap { case <-s.StoppingNotify(): return case <-time.After(election): - if s.Leader() == types.ID(raft.None) { + if s.RaftStatus().Lead == raft.None { noLeaderCnt++ } else { noLeaderCnt = 0 diff --git a/server/etcdserver/raft.go b/server/etcdserver/raft.go index 2a315ea58656..ce3f6367119f 100644 --- a/server/etcdserver/raft.go +++ b/server/etcdserver/raft.go @@ -163,14 +163,23 @@ func (r *raftNode) tick() { func (r *raftNode) start(rh *raftReadyHandler) { internalTimeout := time.Second + go func() { + for { + select { + case <-r.ticker.C: + r.tick() + case <-r.stopped: + return + } + } + }() + go func() { defer r.onStop() islead := false for { select { - case <-r.ticker.C: - r.tick() case rd := <-r.Ready(): if rd.SoftState != nil { newLeader := rd.SoftState.Lead != raft.None && rh.getLead() != rd.SoftState.Lead diff --git a/server/etcdserver/server.go b/server/etcdserver/server.go index 4b40e32bada2..aebd8b627b23 100644 --- a/server/etcdserver/server.go +++ b/server/etcdserver/server.go @@ -1492,9 +1492,9 @@ func (s *EtcdServer) isLearnerReady(id uint64) error { return err } - rs := s.raftStatus() + rs := s.RaftStatus() - // leader's raftStatus.Progress is not nil + // leader's RaftStatus.Progress is not nil if rs.Progress == nil { return errors.ErrNotLeader } @@ -2451,8 +2451,8 @@ func (s *EtcdServer) IsMemberExist(id types.ID) bool { return s.cluster.IsMemberExist(id) } -// raftStatus returns the raft status of this etcd node. -func (s *EtcdServer) raftStatus() raft.Status { +// RaftStatus returns the raft status of this etcd node. +func (s *EtcdServer) RaftStatus() raft.Status { return s.r.Node.Status() }