diff --git a/etcdserver/api/v3rpc/interceptor.go b/etcdserver/api/v3rpc/interceptor.go index 9882968c7..ce9047e80 100644 --- a/etcdserver/api/v3rpc/interceptor.go +++ b/etcdserver/api/v3rpc/interceptor.go @@ -48,7 +48,7 @@ func newUnaryInterceptor(s *etcdserver.EtcdServer) grpc.UnaryServerInterceptor { return nil, rpctypes.ErrGRPCNotCapable } - if s.IsLearner() && !isRPCSupportedForLearner(req) { + if s.IsMemberExist(s.ID()) && s.IsLearner() && !isRPCSupportedForLearner(req) { return nil, rpctypes.ErrGPRCNotSupportedForLearner } @@ -194,7 +194,7 @@ func newStreamInterceptor(s *etcdserver.EtcdServer) grpc.StreamServerInterceptor return rpctypes.ErrGRPCNotCapable } - if s.IsLearner() { // learner does not support Watch and LeaseKeepAlive RPC + if s.IsMemberExist(s.ID()) && s.IsLearner() { // learner does not support stream RPC return rpctypes.ErrGPRCNotSupportedForLearner } diff --git a/etcdserver/server.go b/etcdserver/server.go index ca62221a2..89f7ec335 100644 --- a/etcdserver/server.go +++ b/etcdserver/server.go @@ -2518,3 +2518,8 @@ func (s *EtcdServer) Logger() *zap.Logger { func (s *EtcdServer) IsLearner() bool { return s.cluster.IsLocalMemberLearner() } + +// IsMemberExist returns if the member with the given id exists in cluster. +func (s *EtcdServer) IsMemberExist(id types.ID) bool { + return s.cluster.IsMemberExist(id) +}