@@ -26,6 +26,7 @@ import (
2626 "github.com/coreos/go-semver/semver"
2727 "github.com/stretchr/testify/require"
2828 "go.uber.org/zap"
29+ "golang.org/x/sync/errgroup"
2930
3031 pb "go.etcd.io/etcd/api/v3/etcdserverpb"
3132 "go.etcd.io/etcd/api/v3/version"
@@ -146,6 +147,7 @@ func DowngradeUpgradeMembersByID(t *testing.T, lg *zap.Logger, clus *EtcdProcess
146147 opString = "downgrading"
147148 newExecPath = BinPath .EtcdLastRelease
148149 }
150+ g := new (errgroup.Group )
149151 for _ , memberID := range membersToChange {
150152 member := clus .Procs [memberID ]
151153 if member .Config ().ExecPath == newExecPath {
@@ -157,10 +159,15 @@ func DowngradeUpgradeMembersByID(t *testing.T, lg *zap.Logger, clus *EtcdProcess
157159 }
158160 member .Config ().ExecPath = newExecPath
159161 lg .Info ("Restarting member" , zap .String ("member" , member .Config ().Name ))
160- err := member .Start (context .TODO ())
161- if err != nil {
162- return err
163- }
162+ // We shouldn't block on waiting for the member to be ready,
163+ // otherwise it will be blocked forever if other members are
164+ // not started yet.
165+ g .Go (func () error {
166+ return member .Start (context .TODO ())
167+ })
168+ }
169+ if err := g .Wait (); err != nil {
170+ return err
164171 }
165172
166173 t .Log ("Waiting health interval to make sure the leader propagates version to new processes" )
0 commit comments