@@ -26,6 +26,7 @@ import (
26
26
"github.com/coreos/go-semver/semver"
27
27
"github.com/stretchr/testify/require"
28
28
"go.uber.org/zap"
29
+ "golang.org/x/sync/errgroup"
29
30
30
31
pb "go.etcd.io/etcd/api/v3/etcdserverpb"
31
32
"go.etcd.io/etcd/api/v3/version"
@@ -146,6 +147,7 @@ func DowngradeUpgradeMembersByID(t *testing.T, lg *zap.Logger, clus *EtcdProcess
146
147
opString = "downgrading"
147
148
newExecPath = BinPath .EtcdLastRelease
148
149
}
150
+ g := new (errgroup.Group )
149
151
for _ , memberID := range membersToChange {
150
152
member := clus .Procs [memberID ]
151
153
if member .Config ().ExecPath == newExecPath {
@@ -157,10 +159,15 @@ func DowngradeUpgradeMembersByID(t *testing.T, lg *zap.Logger, clus *EtcdProcess
157
159
}
158
160
member .Config ().ExecPath = newExecPath
159
161
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
164
171
}
165
172
166
173
t .Log ("Waiting health interval to make sure the leader propagates version to new processes" )
0 commit comments