diff --git a/cmd/kubeadm/app/util/etcd/etcd.go b/cmd/kubeadm/app/util/etcd/etcd.go index f2f91ea8e22..e746c2012b5 100644 --- a/cmd/kubeadm/app/util/etcd/etcd.go +++ b/cmd/kubeadm/app/util/etcd/etcd.go @@ -584,6 +584,8 @@ func (c *Client) getMemberStatus(memberID uint64) (isLearner bool, started bool, func (c *Client) MemberPromote(learnerID uint64) error { var ( lastError error + isLearner bool + isStarted bool learnerIDUint = strconv.FormatUint(learnerID, 16) ) @@ -591,7 +593,8 @@ func (c *Client) MemberPromote(learnerID uint64) error { err := wait.PollUntilContextTimeout(context.Background(), constants.EtcdAPICallRetryInterval, kubeadmapi.GetActiveTimeouts().EtcdAPICall.Duration, true, func(_ context.Context) (bool, error) { - isLearner, started, err := c.getMemberStatus(learnerID) + var err error + isLearner, isStarted, err = c.getMemberStatus(learnerID) if err != nil { lastError = errors.WithMessagef(err, "failed to get member %s status", learnerIDUint) return false, nil @@ -600,7 +603,7 @@ func (c *Client) MemberPromote(learnerID uint64) error { klog.V(1).Infof("[etcd] Member %s was already promoted.", learnerIDUint) return true, nil } - if !started { + if !isStarted { klog.V(1).Infof("[etcd] Member %s is not started yet. Waiting for it to be started.", learnerIDUint) lastError = errors.Errorf("the etcd member %s is not started", learnerIDUint) return false, nil @@ -611,6 +614,10 @@ func (c *Client) MemberPromote(learnerID uint64) error { return lastError } + if !isLearner { + return nil + } + klog.V(1).Infof("[etcd] Promoting a learner as a voting member: %s", learnerIDUint) cli, err := c.newEtcdClient(c.Endpoints)