server.go (etcd-3.5.6) | : | server.go (etcd-3.5.7) | ||
---|---|---|---|---|
skipping to change at line 1747 | skipping to change at line 1747 | |||
return ErrNotEnoughStartedMembers | return ErrNotEnoughStartedMembers | |||
} | } | |||
return nil | return nil | |||
} | } | |||
// check whether the learner catches up with leader or not. | // check whether the learner catches up with leader or not. | |||
// Note: it will return nil if member is not found in cluster or if member is no t learner. | // Note: it will return nil if member is not found in cluster or if member is no t 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 | |||
if rs.Progress == nil { | if rs.Progress == nil { | |||
return ErrNotLeader | return ErrNotLeader | |||
} | } | |||
var learnerMatch uint64 | var learnerMatch uint64 | |||
isFound := false | isFound := false | |||
leaderID := rs.ID | leaderID := rs.ID | |||
for memberID, progress := range rs.Progress { | for memberID, progress := range rs.Progress { | |||
if id == memberID { | if id == memberID { | |||
// check its status | // check its status | |||
learnerMatch = progress.Match | learnerMatch = progress.Match | |||
isFound = true | isFound = true | |||
break | break | |||
} | } | |||
} | } | |||
if isFound { | // We should return an error in API directly, to avoid the request | |||
leaderMatch := rs.Progress[leaderID].Match | // being unnecessarily delivered to raft. | |||
// the learner's Match not caught up with leader yet | if !isFound { | |||
if float64(learnerMatch) < float64(leaderMatch)*readyPercent { | return membership.ErrIDNotFound | |||
return ErrLearnerNotReady | } | |||
} | ||||
leaderMatch := rs.Progress[leaderID].Match | ||||
// the learner's Match not caught up with leader yet | ||||
if float64(learnerMatch) < float64(leaderMatch)*readyPercent { | ||||
return ErrLearnerNotReady | ||||
} | } | |||
return nil | return nil | |||
} | } | |||
func (s *EtcdServer) mayRemoveMember(id types.ID) error { | func (s *EtcdServer) mayRemoveMember(id types.ID) error { | |||
if !s.Cfg.StrictReconfigCheck { | if !s.Cfg.StrictReconfigCheck { | |||
return nil | return nil | |||
} | } | |||
End of changes. 2 change blocks. | ||||
6 lines changed or deleted | 14 lines changed or added |