diff --git a/tests/framework/e2e/cluster.go b/tests/framework/e2e/cluster.go index 019bc4aa5f2c..5053ba5f422e 100644 --- a/tests/framework/e2e/cluster.go +++ b/tests/framework/e2e/cluster.go @@ -130,8 +130,9 @@ type EtcdProcessCluster struct { } type EtcdProcessClusterConfig struct { - Logger *zap.Logger - Version ClusterVersion + Logger *zap.Logger + Version ClusterVersion + ForceStop bool // DataDirPath specifies the data-dir for the members. If test cases // do not specify `DataDirPath`, then e2e framework creates a // temporary directory for each member; otherwise, it creates a @@ -878,6 +879,13 @@ func (epc *EtcdProcessCluster) Stop() (err error) { return err } +func (epc *EtcdProcessCluster) ForceStop() (err error) { + for _, member := range epc.Procs { + member.Kill() + } + return epc.Stop() +} + func (epc *EtcdProcessCluster) Client(opts ...config.ClientOption) *EtcdctlV3 { etcdctl, err := NewEtcdctl(epc.Cfg.Client, epc.EndpointsGRPC(), opts...) if err != nil { @@ -886,9 +894,14 @@ func (epc *EtcdProcessCluster) Client(opts ...config.ClientOption) *EtcdctlV3 { return etcdctl } -func (epc *EtcdProcessCluster) Close() error { +func (epc *EtcdProcessCluster) Close() (err error) { epc.lg.Info("closing test cluster...") - err := epc.Stop() + if epc.Cfg.ForceStop { + err = epc.ForceStop() + } else { + err = epc.Stop() + } + for _, p := range epc.Procs { // p is nil when NewEtcdProcess fails in the middle // Close still gets called to clean up test data diff --git a/tests/framework/e2e/e2e.go b/tests/framework/e2e/e2e.go index f78df57926ea..aa1a7269c90b 100644 --- a/tests/framework/e2e/e2e.go +++ b/tests/framework/e2e/e2e.go @@ -58,6 +58,10 @@ func (e e2eRunner) NewCluster(ctx context.Context, t testing.TB, opts ...config. e2eConfig.Version = e2eClusterCtx.Version } + if e2eConfig.ClusterSize == 3 { + e2eConfig.ForceStop = true + } + switch cfg.ClientTLS { case config.NoTLS: e2eConfig.Client.ConnectionType = ClientNonTLS