mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-25 04:33:26 +00:00
kubeadm: remove nested loops for member promotion
This commit is contained in:
parent
b3deecfb17
commit
37f5da904b
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user