mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
etcdserver: return membership.ErrIDNotFound when the memberID not found
Backport https://github.com/etcd-io/etcd/pull/15095 to 3.4. When promoting a learner, we need to wait until the leader's applied ID catches up to the commitId. Afterwards, check whether the learner ID exist or not, and return `membership.ErrIDNotFound` directly in the API if the member ID not found, to avoid the request being unnecessarily delivered to raft. Signed-off-by: Benjamin Wang <wachao@vmware.com>
This commit is contained in:
parent
a577940b4e
commit
00b31512a1
@ -1798,6 +1798,10 @@ func (s *EtcdServer) mayPromoteMember(id types.ID) error {
|
|||||||
// Note: it will return nil if member is not found in cluster or if member is not learner.
|
// Note: it will return nil if member is not found in cluster or if member is not learner.
|
||||||
// These two conditions will be checked before apply phase later.
|
// These two conditions will be checked before apply phase later.
|
||||||
func (s *EtcdServer) isLearnerReady(id uint64) error {
|
func (s *EtcdServer) isLearnerReady(id uint64) error {
|
||||||
|
if err := s.waitAppliedIndex(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
rs := s.raftStatus()
|
rs := s.raftStatus()
|
||||||
|
|
||||||
// leader's raftStatus.Progress is not nil
|
// leader's raftStatus.Progress is not nil
|
||||||
@ -1817,13 +1821,17 @@ func (s *EtcdServer) isLearnerReady(id uint64) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if isFound {
|
// We should return an error in API directly, to avoid the request
|
||||||
|
// being unnecessarily delivered to raft.
|
||||||
|
if !isFound {
|
||||||
|
return membership.ErrIDNotFound
|
||||||
|
}
|
||||||
|
|
||||||
leaderMatch := rs.Progress[leaderID].Match
|
leaderMatch := rs.Progress[leaderID].Match
|
||||||
// the learner's Match not caught up with leader yet
|
// the learner's Match not caught up with leader yet
|
||||||
if float64(learnerMatch) < float64(leaderMatch)*readyPercent {
|
if float64(learnerMatch) < float64(leaderMatch)*readyPercent {
|
||||||
return ErrLearnerNotReady
|
return ErrLearnerNotReady
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user