From fa527c5e544b9dd33b0b3ececbbd9e294869137e Mon Sep 17 00:00:00 2001 From: Wei Fu Date: Fri, 3 Feb 2023 22:23:06 +0800 Subject: [PATCH 1/2] tests: support to stop the multiple members concurrently Signed-off-by: Wei Fu --- tests/framework/e2e/cluster.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) 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 } From 2183a55b47422494f04e9e224aaf2c1e65a3fe05 Mon Sep 17 00:00:00 2001 From: Wei Fu Date: Fri, 3 Feb 2023 22:24:41 +0800 Subject: [PATCH 2/2] tests: forcestop member procs with signal kill When the linearizability test cases run with three members, it might take 7-8s to stop three members, especially stopping the leader. The leader will transfer the leadership and it might take more time to stop peer listener. In order to reduce the runtime, this commit is using signal kill to force stop members instead of graceful shutdown. REF: #15086 Signed-off-by: Wei Fu --- tests/linearizability/linearizability_test.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) 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() +}