From 895b9e505ad2b46b0698a5ee8ab46b345af65f8e Mon Sep 17 00:00:00 2001 From: Yanhao Mo Date: Wed, 21 Oct 2020 16:21:08 +0800 Subject: [PATCH] etcdserver: export method EtcdServer.leaderChangedNotify (#12378) --- server/etcdserver/server.go | 11 ++++++++++- server/etcdserver/v3_server.go | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/server/etcdserver/server.go b/server/etcdserver/server.go index a4fa259ae089..5c5a9fb6780f 100644 --- a/server/etcdserver/server.go +++ b/server/etcdserver/server.go @@ -185,6 +185,15 @@ type Server interface { ClusterVersion() *semver.Version Cluster() api.Cluster Alarms() []*pb.AlarmMember + + // LeaderChangedNotify returns a channel for application level code to be notified + // when etcd leader changes, this function is intend to be used only in application + // which embed etcd. + // Caution: + // 1. the returned channel is being closed when the leadership changes. + // 2. so the new channel needs to be obtained for each raft term. + // 3. user can loose some consecutive channel changes using this API. + LeaderChangedNotify() <-chan struct{} } // EtcdServer is the production implementation of the Server interface @@ -1743,7 +1752,7 @@ func (s *EtcdServer) getLead() uint64 { return atomic.LoadUint64(&s.lead) } -func (s *EtcdServer) leaderChangedNotify() <-chan struct{} { +func (s *EtcdServer) LeaderChangedNotify() <-chan struct{} { s.leaderChangedMu.RLock() defer s.leaderChangedMu.RUnlock() return s.leaderChanged diff --git a/server/etcdserver/v3_server.go b/server/etcdserver/v3_server.go index 4130d8e081f0..3fa64f7413ef 100644 --- a/server/etcdserver/v3_server.go +++ b/server/etcdserver/v3_server.go @@ -712,7 +712,7 @@ func (s *EtcdServer) linearizableReadLoop() { ctxToSend := make([]byte, 8) id1 := s.reqIDGen.Next() binary.BigEndian.PutUint64(ctxToSend, id1) - leaderChangedNotifier := s.leaderChangedNotify() + leaderChangedNotifier := s.LeaderChangedNotify() select { case <-leaderChangedNotifier: continue