diff --git a/tests/framework/e2e/cluster.go b/tests/framework/e2e/cluster.go index cf28e8b56..c383ca012 100644 --- a/tests/framework/e2e/cluster.go +++ b/tests/framework/e2e/cluster.go @@ -823,11 +823,17 @@ func (epc *EtcdProcessCluster) rollingStart(f func(ep EtcdProcess) error) error } func (epc *EtcdProcessCluster) Stop() (err error) { - for _, p := range epc.Procs { - if p == nil { + errCh := make(chan error, len(epc.Procs)) + for i := range epc.Procs { + if epc.Procs[i] == nil { + errCh <- nil continue } - if curErr := p.Stop(); curErr != nil { + go func(n int) { errCh <- epc.Procs[n].Stop() }(i) + } + + for range epc.Procs { + if curErr := <-errCh; curErr != nil { if err != nil { err = fmt.Errorf("%v; %v", err, curErr) } else { @@ -835,6 +841,7 @@ func (epc *EtcdProcessCluster) Stop() (err error) { } } } + close(errCh) return err } diff --git a/tests/linearizability/linearizability_test.go b/tests/linearizability/linearizability_test.go index 52fa13e4e..92866020d 100644 --- a/tests/linearizability/linearizability_test.go +++ b/tests/linearizability/linearizability_test.go @@ -163,7 +163,7 @@ func TestLinearizability(t *testing.T) { retries: 3, waitBetweenTriggers: waitBetweenFailpointTriggers, }, *scenario.traffic) - clus.Stop() + forcestopCluster(clus) longestHistory, remainingEvents := pickLongestHistory(events) validateEventsMatch(t, longestHistory, remainingEvents) operations = patchOperationBasedOnWatchEvents(operations, longestHistory) @@ -455,3 +455,11 @@ func testResultsDirectory(t *testing.T) (string, error) { } return path, nil } + +// forcestopCluster stops the etcd member with signal kill. +func forcestopCluster(clus *e2e.EtcdProcessCluster) error { + for _, member := range clus.Procs { + member.Kill() + } + return clus.Stop() +}