Skip to content

Commit 99ff62e

Browse files
authored
Merge pull request kubernetes#127491 from SataQiu/fix-etcd-20240920
kubeadm: check whether the peer URL for the added etcd member already exists when the MemberAddAsLearner/MemberAdd fails
2 parents 2e62161 + 9af1b25 commit 99ff62e

File tree

1 file changed

+45
-14
lines changed

1 file changed

+45
-14
lines changed

cmd/kubeadm/app/util/etcd/etcd.go

Lines changed: 45 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -360,8 +360,28 @@ func (c *Client) RemoveMember(id uint64) ([]Member, error) {
360360
defer func() { _ = cli.Close() }()
361361

362362
ctx, cancel := context.WithTimeout(context.Background(), etcdTimeout)
363+
defer cancel()
364+
365+
// List members and quickly return if the member does not exist.
366+
listResp, err := cli.MemberList(ctx)
367+
if err != nil {
368+
klog.V(5).Infof("Failed to check whether the member %s exists: %v", strconv.FormatUint(id, 16), err)
369+
lastError = err
370+
return false, nil
371+
}
372+
found := false
373+
for _, member := range listResp.Members {
374+
if member.GetID() == id {
375+
found = true
376+
break
377+
}
378+
}
379+
if !found {
380+
klog.V(5).Infof("Member %s was not found; assuming it was already removed", strconv.FormatUint(id, 16))
381+
return true, nil
382+
}
383+
363384
resp, err = cli.MemberRemove(ctx, id)
364-
cancel()
365385
if err == nil {
366386
return true, nil
367387
}
@@ -421,29 +441,40 @@ func (c *Client) addMember(name string, peerAddrs string, isLearner bool) ([]Mem
421441
var (
422442
lastError error
423443
respMembers []*etcdserverpb.Member
424-
learnerID uint64
425444
resp *clientv3.MemberAddResponse
426445
)
427446
err = wait.PollUntilContextTimeout(context.Background(), constants.EtcdAPICallRetryInterval, constants.EtcdAPICallTimeout,
428447
true, func(_ context.Context) (bool, error) {
429448
ctx, cancel := context.WithTimeout(context.Background(), etcdTimeout)
430449
defer cancel()
431-
if isLearner {
432-
// if learnerID is set, it means the etcd member is already added successfully.
433-
if learnerID == 0 {
434-
klog.V(1).Info("[etcd] Adding etcd member as learner")
435-
resp, err = cli.MemberAddAsLearner(ctx, []string{peerAddrs})
436-
if err != nil {
437-
lastError = err
438-
return false, nil
439-
}
440-
learnerID = resp.Member.ID
450+
451+
// List members and quickly return if the member already exists.
452+
listResp, err := cli.MemberList(ctx)
453+
if err != nil {
454+
klog.V(5).Infof("Failed to check whether the member %q exists: %v", peerAddrs, err)
455+
lastError = err
456+
return false, nil
457+
}
458+
found := false
459+
for _, member := range listResp.Members {
460+
if member.GetPeerURLs()[0] == peerAddrs {
461+
found = true
462+
break
441463
}
442-
respMembers = resp.Members
464+
}
465+
if found {
466+
klog.V(5).Infof("The peer URL %q for the added etcd member already exists. Skipping etcd member addition", peerAddrs)
467+
respMembers = listResp.Members
443468
return true, nil
444469
}
445470

446-
resp, err = cli.MemberAdd(ctx, []string{peerAddrs})
471+
if isLearner {
472+
klog.V(1).Infof("[etcd] Adding etcd member %q as learner", peerAddrs)
473+
resp, err = cli.MemberAddAsLearner(ctx, []string{peerAddrs})
474+
} else {
475+
klog.V(1).Infof("[etcd] Adding etcd member %q", peerAddrs)
476+
resp, err = cli.MemberAdd(ctx, []string{peerAddrs})
477+
}
447478
if err == nil {
448479
respMembers = resp.Members
449480
return true, nil

0 commit comments

Comments
 (0)