Преглед изворни кода

Merge pull request #11201 from jingyih/automated-cherry-pick-of-#11194-origin-release-3.3

Automated cherry pick of #11194 on release-3.3
Gyuho Lee пре 6 година
родитељ
комит
1be7ab4ee2
1 измењених фајлова са 5 додато и 3 уклоњено
  1. 5 3
      etcdctl/ctlv3/command/member_command.go

+ 5 - 3
etcdctl/ctlv3/command/member_command.go

@@ -120,12 +120,14 @@ func memberAddCommandFunc(cmd *cobra.Command, args []string) {
 	if _, ok := (display).(*simplePrinter); ok {
 	if _, ok := (display).(*simplePrinter); ok {
 		ctx, cancel = commandCtx(cmd)
 		ctx, cancel = commandCtx(cmd)
 		listResp, err := cli.MemberList(ctx)
 		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 {
 		for {
 			if err != nil {
 			if err != nil {
 				ExitWithError(ExitError, err)
 				ExitWithError(ExitError, err)
 			}
 			}
-			if listResp.Header.MemberId == resp.Header.MemberId {
+			if _, ok := syncedMemberSet[listResp.Header.MemberId]; ok {
 				break
 				break
 			}
 			}
 			// quorum get to sync cluster list
 			// quorum get to sync cluster list
@@ -133,7 +135,7 @@ func memberAddCommandFunc(cmd *cobra.Command, args []string) {
 			if gerr != nil {
 			if gerr != nil {
 				ExitWithError(ExitError, err)
 				ExitWithError(ExitError, err)
 			}
 			}
-			resp.Header.MemberId = gresp.Header.MemberId
+			syncedMemberSet[gresp.Header.MemberId] = struct{}{}
 			listResp, err = cli.MemberList(ctx)
 			listResp, err = cli.MemberList(ctx)
 		}
 		}
 		cancel()
 		cancel()