Skip to content

Commit 9af1b25

Browse files
committed
kubeadm: check the member list status before adding or removing an etcd member
1 parent 18318a3 commit 9af1b25

File tree

1 file changed

+42
-1
lines changed

1 file changed

+42
-1
lines changed

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

Lines changed: 42 additions & 1 deletion
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
}
@@ -427,6 +447,27 @@ func (c *Client) addMember(name string, peerAddrs string, isLearner bool) ([]Mem
427447
true, func(_ context.Context) (bool, error) {
428448
ctx, cancel := context.WithTimeout(context.Background(), etcdTimeout)
429449
defer cancel()
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
463+
}
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
468+
return true, nil
469+
}
470+
430471
if isLearner {
431472
klog.V(1).Infof("[etcd] Adding etcd member %q as learner", peerAddrs)
432473
resp, err = cli.MemberAddAsLearner(ctx, []string{peerAddrs})

0 commit comments

Comments
 (0)