From a5abf917719ece8a4af476f0e052798265d633a9 Mon Sep 17 00:00:00 2001 From: Jingyi Hu Date: Wed, 2 Oct 2019 17:43:32 -0700 Subject: [PATCH] etcdctl: fix member add command --- etcdctl/ctlv3/command/member_command.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/etcdctl/ctlv3/command/member_command.go b/etcdctl/ctlv3/command/member_command.go index 182ff8ef722..239c34ca482 100644 --- a/etcdctl/ctlv3/command/member_command.go +++ b/etcdctl/ctlv3/command/member_command.go @@ -158,12 +158,14 @@ func memberAddCommandFunc(cmd *cobra.Command, args []string) { if _, ok := (display).(*simplePrinter); ok { ctx, cancel = commandCtx(cmd) listResp, err := cli.MemberList(ctx) - // get latest member list; if there's failover new member might have outdated list + // make sure the member who served member list request has the latest member list. + syncedMemberSet := make(map[uint64]struct{}) + syncedMemberSet[resp.Header.MemberId] = struct{}{} // the member who served member add is guaranteed to have the latest member list. for { if err != nil { ExitWithError(ExitError, err) } - if listResp.Header.MemberId == resp.Header.MemberId { + if _, ok := syncedMemberSet[listResp.Header.MemberId]; ok { break } // quorum get to sync cluster list @@ -171,7 +173,7 @@ func memberAddCommandFunc(cmd *cobra.Command, args []string) { if gerr != nil { ExitWithError(ExitError, err) } - resp.Header.MemberId = gresp.Header.MemberId + syncedMemberSet[gresp.Header.MemberId] = struct{}{} listResp, err = cli.MemberList(ctx) } cancel()