kubeadm: remove nested loops for member promotion

This commit is contained in:
Paco Xu 2022-12-17 00:07:38 +08:00
parent b3deecfb17
commit 37f5da904b

View File

@ -368,6 +368,7 @@ func (c *Client) addMember(name string, peerAddrs string, isLearner bool) ([]Mem
var ( var (
lastError error lastError error
respMembers []*etcdserverpb.Member respMembers []*etcdserverpb.Member
learnerID uint64
) )
err = wait.ExponentialBackoff(etcdBackoff, func() (bool, error) { err = wait.ExponentialBackoff(etcdBackoff, func() (bool, error) {
cli, err := clientv3.New(clientv3.Config{ cli, err := clientv3.New(clientv3.Config{
@ -388,18 +389,23 @@ func (c *Client) addMember(name string, peerAddrs string, isLearner bool) ([]Mem
defer cancel() defer cancel()
var resp *clientv3.MemberAddResponse var resp *clientv3.MemberAddResponse
if isLearner { if isLearner {
klog.V(1).Infof("[etcd] Adding etcd member as learner: %016x", peerAddrs) // if learnerID is set, it means the etcd member is already added successfully.
resp, err = cli.MemberAddAsLearner(ctx, []string{peerAddrs}) if learnerID == 0 {
if err == nil { klog.V(1).Infof("[etcd] Adding etcd member as learner: %016x", peerAddrs)
learnerID := resp.Member.ID resp, err = cli.MemberAddAsLearner(ctx, []string{peerAddrs})
err = memberPromoteWithRety(ctx, cli, learnerID)
if err != nil { if err != nil {
lastError = err lastError = err
return false, lastError return false, nil
} }
respMembers = resp.Members learnerID = resp.Member.ID
return true, nil
} }
err = memberPromote(ctx, cli, learnerID)
if err != nil {
lastError = err
return false, nil
}
respMembers = resp.Members
return true, nil
} }
resp, err = cli.MemberAdd(ctx, []string{peerAddrs}) resp, err = cli.MemberAdd(ctx, []string{peerAddrs})
@ -453,23 +459,20 @@ func (c *Client) addMember(name string, peerAddrs string, isLearner bool) ([]Mem
return ret, nil return ret, nil
} }
func memberPromoteWithRety(ctx context.Context, cli *clientv3.Client, learnerID uint64) error { func memberPromote(ctx context.Context, cli *clientv3.Client, learnerID uint64) error {
klog.V(1).Infof("[etcd] Promoting a learner as a voting member: %016x", learnerID) klog.V(1).Infof("[etcd] Promoting a learner as a voting member: %016x", learnerID)
err := wait.PollImmediate(5*time.Second, 5*time.Minute, func() (bool, error) { // TODO: warning logs from etcd client should be removed.
// TODO: warning logs from etcd client should be removed. // The warning logs are printed by etcd client code for several reasons, including
// The warning logs are printed by etcd client code for several reasons, including // 1. can not promote yet(no synced)
// 1. can not promote yet(no synced) // 2. context deadline exceeded
// 2. context deadline exceeded // 3. peer URLs already exists
// 3. peer URLs already exists // Once the client provides a way to check if the etcd learner is ready to promote, the retry logic can be revisited.
// Once the client provides a way to check if the etcd learner is ready to promote, the retry logic can be revisited. _, err := cli.MemberPromote(ctx, learnerID)
_, err := cli.MemberPromote(ctx, learnerID) if err == nil {
if err == nil { klog.V(1).Infof("[etcd] The learner was promoted as a voting member: %016x", learnerID)
klog.V(1).Infof("[etcd] The learner was promoted as a voting member: %016x", learnerID) return nil
return true, nil }
} klog.V(5).Infof("[etcd] Promoting the learner %016x failed: %v", learnerID, err)
klog.V(4).Infof("[etcd] Promoting the learner %016x failed: %v", learnerID, err)
return false, nil
})
return err return err
} }