From 3e86779ad5e6b0c5a7577d7837f99b26c3b869ec Mon Sep 17 00:00:00 2001 From: Anthony Romano Date: Tue, 14 Mar 2017 13:31:09 -0700 Subject: [PATCH] ctlv3: ensure synced member list before printing env vars on member add In cases of multiple endpoints, it's possible member add would get a its member list from a member that has not yet recognized the membership update. Instead, confirm that the member list response is from the member that acked the member add or from a member that has synced with the cluster following the member add. Fixes #7498 --- etcdctl/ctlv3/command/member_command.go | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) 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 {