Skip to content

Commit 996e674

Browse files
authored
Merge pull request kubernetes#127650 from SataQiu/fix-etcd-20240926
kubeadm: fix a bug where the RemoveMember function did not return the correct member list when the member to be removed did not exist
2 parents 81ebfb3 + 2dc0d29 commit 996e674

File tree

1 file changed

+21
-18
lines changed

1 file changed

+21
-18
lines changed

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

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -347,18 +347,19 @@ func (c *Client) ListMembers() ([]Member, error) {
347347

348348
// RemoveMember notifies an etcd cluster to remove an existing member
349349
func (c *Client) RemoveMember(id uint64) ([]Member, error) {
350+
cli, err := c.newEtcdClient(c.Endpoints)
351+
if err != nil {
352+
return nil, err
353+
}
354+
defer func() { _ = cli.Close() }()
355+
350356
// Remove an existing member from the cluster
351-
var lastError error
352-
var resp *clientv3.MemberRemoveResponse
353-
err := wait.PollUntilContextTimeout(context.Background(), constants.EtcdAPICallRetryInterval, constants.EtcdAPICallTimeout,
357+
var (
358+
lastError error
359+
respMembers []*etcdserverpb.Member
360+
)
361+
err = wait.PollUntilContextTimeout(context.Background(), constants.EtcdAPICallRetryInterval, constants.EtcdAPICallTimeout,
354362
true, func(_ context.Context) (bool, error) {
355-
cli, err := c.newEtcdClient(c.Endpoints)
356-
if err != nil {
357-
lastError = err
358-
return false, nil
359-
}
360-
defer func() { _ = cli.Close() }()
361-
362363
ctx, cancel := context.WithTimeout(context.Background(), etcdTimeout)
363364
defer cancel()
364365

@@ -378,16 +379,22 @@ func (c *Client) RemoveMember(id uint64) ([]Member, error) {
378379
}
379380
if !found {
380381
klog.V(5).Infof("Member %s was not found; assuming it was already removed", strconv.FormatUint(id, 16))
382+
respMembers = listResp.Members
381383
return true, nil
382384
}
383385

384-
resp, err = cli.MemberRemove(ctx, id)
386+
resp, err := cli.MemberRemove(ctx, id)
385387
if err == nil {
388+
respMembers = resp.Members
386389
return true, nil
387390
}
388391
if errors.Is(rpctypes.ErrMemberNotFound, err) {
389392
klog.V(5).Infof("Member was already removed, because member %s was not found", strconv.FormatUint(id, 16))
390-
return true, nil
393+
listResp, err = cli.MemberList(ctx)
394+
if err == nil {
395+
respMembers = listResp.Members
396+
return true, nil
397+
}
391398
}
392399
klog.V(5).Infof("Failed to remove etcd member: %v", err)
393400
lastError = err
@@ -399,11 +406,8 @@ func (c *Client) RemoveMember(id uint64) ([]Member, error) {
399406

400407
// Returns the updated list of etcd members
401408
ret := []Member{}
402-
if resp != nil {
403-
for _, m := range resp.Members {
404-
ret = append(ret, Member{Name: m.Name, PeerURL: m.PeerURLs[0]})
405-
}
406-
409+
for _, m := range respMembers {
410+
ret = append(ret, Member{Name: m.Name, PeerURL: m.PeerURLs[0]})
407411
}
408412

409413
return ret, nil
@@ -484,7 +488,6 @@ func (c *Client) addMember(name string, peerAddrs string, isLearner bool) ([]Mem
484488
// call out to MemberList to fetch all the members before returning.
485489
if errors.Is(err, rpctypes.ErrPeerURLExist) {
486490
klog.V(5).Info("The peer URL for the added etcd member already exists. Fetching the existing etcd members")
487-
var listResp *clientv3.MemberListResponse
488491
listResp, err = cli.MemberList(ctx)
489492
if err == nil {
490493
respMembers = listResp.Members

0 commit comments

Comments
 (0)