@@ -360,8 +360,28 @@ func (c *Client) RemoveMember(id uint64) ([]Member, error) {
360
360
defer func () { _ = cli .Close () }()
361
361
362
362
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
+
363
384
resp , err = cli .MemberRemove (ctx , id )
364
- cancel ()
365
385
if err == nil {
366
386
return true , nil
367
387
}
@@ -427,6 +447,27 @@ func (c *Client) addMember(name string, peerAddrs string, isLearner bool) ([]Mem
427
447
true , func (_ context.Context ) (bool , error ) {
428
448
ctx , cancel := context .WithTimeout (context .Background (), etcdTimeout )
429
449
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
+
430
471
if isLearner {
431
472
klog .V (1 ).Infof ("[etcd] Adding etcd member %q as learner" , peerAddrs )
432
473
resp , err = cli .MemberAddAsLearner (ctx , []string {peerAddrs })
0 commit comments