diff --git a/etcdctl/ctlv3/command/member_command.go b/etcdctl/ctlv3/command/member_command.go index 094efa72d34..c45584ec3d7 100644 --- a/etcdctl/ctlv3/command/member_command.go +++ b/etcdctl/ctlv3/command/member_command.go @@ -107,7 +107,8 @@ func memberAddCommandFunc(cmd *cobra.Command, args []string) { urls := strings.Split(memberPeerURLs, ",") ctx, cancel := commandCtx(cmd) - resp, err := mustClientFromCmd(cmd).MemberAdd(ctx, urls) + cli := mustClientFromCmd(cmd) + resp, err := cli.MemberAdd(ctx, urls) cancel() if err != nil { ExitWithError(ExitError, err) @@ -118,12 +119,24 @@ func memberAddCommandFunc(cmd *cobra.Command, args []string) { if _, ok := (display).(*simplePrinter); ok { ctx, cancel = commandCtx(cmd) - listResp, err := mustClientFromCmd(cmd).MemberList(ctx) - cancel() - - if err != nil { - ExitWithError(ExitError, err) + listResp, err := cli.MemberList(ctx) + // get latest member list; if there's failover new member might have outdated list + for { + if err != nil { + ExitWithError(ExitError, err) + } + if listResp.Header.MemberId == resp.Header.MemberId { + break + } + // quorum get to sync cluster list + gresp, gerr := cli.Get(ctx, "_") + if gerr != nil { + ExitWithError(ExitError, err) + } + resp.Header.MemberId = gresp.Header.MemberId + listResp, err = cli.MemberList(ctx) } + cancel() conf := []string{} for _, memb := range listResp.Members {