From 0b9f43410a5422a7ec7ce42d229c80cdaf94c28f Mon Sep 17 00:00:00 2001 From: Clark Date: Sun, 14 Aug 2022 18:00:25 +0800 Subject: [PATCH] tests: e2e and integration share TickDuration constant Signed-off-by: Clark --- tests/framework/config/cluster.go | 4 ++++ tests/framework/e2e.go | 6 ++---- tests/framework/integration/cluster.go | 24 +++++++++++----------- tests/integration/cluster_test.go | 5 +++-- tests/integration/v3_grpc_test.go | 5 +++-- tests/integration/v3_lease_test.go | 3 ++- tests/integration/v3_watch_restore_test.go | 3 ++- 7 files changed, 28 insertions(+), 22 deletions(-) diff --git a/tests/framework/config/cluster.go b/tests/framework/config/cluster.go index f18c6e5c406..cd7f50f39b9 100644 --- a/tests/framework/config/cluster.go +++ b/tests/framework/config/cluster.go @@ -14,12 +14,16 @@ package config +import "time" + type TLSConfig string const ( NoTLS TLSConfig = "" AutoTLS TLSConfig = "auto-tls" ManualTLS TLSConfig = "manual-tls" + + TickDuration = 10 * time.Millisecond ) type ClusterConfig struct { diff --git a/tests/framework/e2e.go b/tests/framework/e2e.go index a3039019d3d..fda02990d86 100644 --- a/tests/framework/e2e.go +++ b/tests/framework/e2e.go @@ -26,8 +26,6 @@ import ( "go.etcd.io/etcd/tests/v3/framework/e2e" ) -const TickDuration = 10 * time.Millisecond - type e2eRunner struct{} func (e e2eRunner) TestMain(m *testing.M) { @@ -116,7 +114,7 @@ func (c *e2eCluster) WaitMembersForLeader(ctx context.Context, t testing.TB, mem t.Fatal("WaitMembersForLeader timeout") default: } - _, err := cc.Get("0", config.GetOptions{Timeout: 10*TickDuration + time.Second}) + _, err := cc.Get("0", config.GetOptions{Timeout: 10*config.TickDuration + time.Second}) if err == nil || strings.Contains(err.Error(), "Key not found") { break } @@ -149,7 +147,7 @@ func (c *e2eCluster) WaitMembersForLeader(ctx context.Context, t testing.TB, mem } leaders = make(map[uint64]struct{}) members = make(map[uint64]int) - time.Sleep(10 * TickDuration) + time.Sleep(10 * config.TickDuration) } for l := range leaders { if index, ok := members[l]; ok { diff --git a/tests/framework/integration/cluster.go b/tests/framework/integration/cluster.go index e7cc1a86aa5..d9a21645348 100644 --- a/tests/framework/integration/cluster.go +++ b/tests/framework/integration/cluster.go @@ -55,6 +55,7 @@ import ( lockpb "go.etcd.io/etcd/server/v3/etcdserver/api/v3lock/v3lockpb" "go.etcd.io/etcd/server/v3/etcdserver/api/v3rpc" "go.etcd.io/etcd/server/v3/verify" + framecfg "go.etcd.io/etcd/tests/v3/framework/config" "go.uber.org/zap/zapcore" "go.uber.org/zap/zaptest" @@ -70,7 +71,6 @@ import ( const ( // RequestWaitTimeout is the time duration to wait for a request to go through or detect leader loss. RequestWaitTimeout = 5 * time.Second - TickDuration = 10 * time.Millisecond RequestTimeout = 20 * time.Second ClusterName = "etcd" @@ -363,7 +363,7 @@ func (c *Cluster) RemoveMember(t testutil.TB, cc *clientv3.Client, id uint64) er // 1s stop delay + election timeout + 1s disk and network delay + connection write timeout // TODO: remove connection write timeout by selecting on http response closeNotifier // blocking on https://github.com/golang/go/issues/9524 - case <-time.After(time.Second + time.Duration(ElectionTicks)*TickDuration + time.Second + rafthttp.ConnWriteTimeout): + case <-time.After(time.Second + time.Duration(ElectionTicks)*framecfg.TickDuration + time.Second + rafthttp.ConnWriteTimeout): t.Fatalf("failed to remove member %s in time", m.Server.MemberId()) } } @@ -394,7 +394,7 @@ func (c *Cluster) WaitMembersMatch(t testutil.TB, membs []*pb.Member) { if isMembersEqual(resp.Members, membs) { break } - time.Sleep(TickDuration) + time.Sleep(framecfg.TickDuration) } } } @@ -445,7 +445,7 @@ func (c *Cluster) waitMembersForLeader(ctx context.Context, t testing.TB, membs } // ensure leader is up via linearizable get for { - ctx, cancel := context.WithTimeout(ctx, 10*TickDuration+time.Second) + ctx, cancel := context.WithTimeout(ctx, 10*framecfg.TickDuration+time.Second) _, err := cc.Get(ctx, "0") cancel() if err == nil || strings.Contains(err.Error(), "Key not found") { @@ -463,7 +463,7 @@ func (c *Cluster) waitMembersForLeader(ctx context.Context, t testing.TB, membs } if lead != 0 && lead != m.Server.Lead() { lead = 0 - time.Sleep(10 * TickDuration) + time.Sleep(10 * framecfg.TickDuration) break } lead = m.Server.Lead() @@ -496,7 +496,7 @@ func (c *Cluster) WaitMembersNoLeader(membs []*Member) { } if m.Server.Lead() != 0 { noLeader = false - time.Sleep(10 * TickDuration) + time.Sleep(10 * framecfg.TickDuration) break } } @@ -509,7 +509,7 @@ func (c *Cluster) waitVersion() { if m.Server.ClusterVersion() != nil { break } - time.Sleep(TickDuration) + time.Sleep(framecfg.TickDuration) } } } @@ -655,7 +655,7 @@ func MustNewMember(t testutil.TB, mcfg MemberConfig) *Member { } m.ElectionTicks = ElectionTicks m.InitialElectionTickAdvance = true - m.TickMs = uint(TickDuration / time.Millisecond) + m.TickMs = uint(framecfg.TickDuration / time.Millisecond) m.QuotaBackendBytes = mcfg.QuotaBackendBytes m.MaxTxnOps = mcfg.MaxTxnOps if m.MaxTxnOps == 0 { @@ -1079,7 +1079,7 @@ func (m *Member) RecordedRequests() []grpc_testing.RequestInfo { func (m *Member) WaitOK(t testutil.TB) { m.WaitStarted(t) for m.Server.Leader() == 0 { - time.Sleep(TickDuration) + time.Sleep(framecfg.TickDuration) } } @@ -1088,7 +1088,7 @@ func (m *Member) WaitStarted(t testutil.TB) { ctx, cancel := context.WithTimeout(context.Background(), RequestTimeout) _, err := m.Client.Get(ctx, "/", clientv3.WithSerializable()) if err != nil { - time.Sleep(TickDuration) + time.Sleep(framecfg.TickDuration) continue } cancel() @@ -1106,7 +1106,7 @@ func WaitClientV3(t testutil.TB, kv clientv3.KV) { if err == nil { return } - time.Sleep(TickDuration) + time.Sleep(framecfg.TickDuration) } if err != nil { t.Fatalf("timed out waiting for client: %v", err) @@ -1604,7 +1604,7 @@ func (c *Cluster) waitMembersMatch(t testutil.TB) { return } - time.Sleep(TickDuration) + time.Sleep(framecfg.TickDuration) } } diff --git a/tests/integration/cluster_test.go b/tests/integration/cluster_test.go index 50e52cc7821..c938f8ea138 100644 --- a/tests/integration/cluster_test.go +++ b/tests/integration/cluster_test.go @@ -27,6 +27,7 @@ import ( clientv3 "go.etcd.io/etcd/client/v3" "go.etcd.io/etcd/server/v3/etcdserver" + "go.etcd.io/etcd/tests/v3/framework/config" "go.etcd.io/etcd/tests/v3/framework/integration" ) @@ -294,7 +295,7 @@ func TestIssue3699(t *testing.T) { // do not restart the killed member immediately. // the member will advance its election timeout after restart, // so it will have a better chance to become the leader again. - time.Sleep(time.Duration(integration.ElectionTicks * int(integration.TickDuration))) + time.Sleep(time.Duration(integration.ElectionTicks * int(config.TickDuration))) c.Members[leaderID].Restart(t) leaderID = c.WaitMembersForLeader(t, c.Members) } @@ -391,7 +392,7 @@ func TestRejectUnhealthyRemove(t *testing.T) { } // member stopped after launch; wait for missing heartbeats - time.Sleep(time.Duration(integration.ElectionTicks * int(integration.TickDuration))) + time.Sleep(time.Duration(integration.ElectionTicks * int(config.TickDuration))) // permit remove dead member since (3,2) - (0,1) => (3,1) has quorum if err = c.RemoveMember(t, c.Members[2].Client, uint64(c.Members[0].Server.MemberId())); err != nil { diff --git a/tests/integration/v3_grpc_test.go b/tests/integration/v3_grpc_test.go index 78b5c6c66cf..a19500bd884 100644 --- a/tests/integration/v3_grpc_test.go +++ b/tests/integration/v3_grpc_test.go @@ -29,6 +29,7 @@ import ( "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" "go.etcd.io/etcd/client/pkg/v3/transport" "go.etcd.io/etcd/client/v3" + "go.etcd.io/etcd/tests/v3/framework/config" "go.etcd.io/etcd/tests/v3/framework/integration" "google.golang.org/grpc" @@ -1817,7 +1818,7 @@ func TestGRPCRequireLeader(t *testing.T) { defer client.Close() // wait for election timeout, then member[0] will not have a leader. - time.Sleep(time.Duration(3*integration.ElectionTicks) * integration.TickDuration) + time.Sleep(time.Duration(3*integration.ElectionTicks) * config.TickDuration) md := metadata.Pairs(rpctypes.MetadataRequireLeaderKey, rpctypes.MetadataHasLeader) ctx := metadata.NewOutgoingContext(context.Background(), md) @@ -1870,7 +1871,7 @@ func TestGRPCStreamRequireLeader(t *testing.T) { clus.Members[2].Restart(t) clus.WaitMembersForLeader(t, clus.Members) - time.Sleep(time.Duration(2*integration.ElectionTicks) * integration.TickDuration) + time.Sleep(time.Duration(2*integration.ElectionTicks) * config.TickDuration) // new stream should also be OK now after we restarted the other members wStream, err = wAPI.Watch(ctx) diff --git a/tests/integration/v3_lease_test.go b/tests/integration/v3_lease_test.go index b2b7efbf6d9..2828e483aaf 100644 --- a/tests/integration/v3_lease_test.go +++ b/tests/integration/v3_lease_test.go @@ -26,6 +26,7 @@ import ( "go.etcd.io/etcd/api/v3/mvccpb" "go.etcd.io/etcd/api/v3/v3rpc/rpctypes" "go.etcd.io/etcd/client/pkg/v3/testutil" + framecfg "go.etcd.io/etcd/tests/v3/framework/config" "go.etcd.io/etcd/tests/v3/framework/integration" "google.golang.org/grpc/codes" @@ -391,7 +392,7 @@ func TestV3LeaseCheckpoint(t *testing.T) { leaderId := clus.WaitLeader(t) leader := clus.Members[leaderId] leader.Stop(t) - time.Sleep(time.Duration(3*integration.ElectionTicks) * integration.TickDuration) + time.Sleep(time.Duration(3*integration.ElectionTicks) * framecfg.TickDuration) leader.Restart(t) } diff --git a/tests/integration/v3_watch_restore_test.go b/tests/integration/v3_watch_restore_test.go index a7643f45189..bdebeacfc5c 100644 --- a/tests/integration/v3_watch_restore_test.go +++ b/tests/integration/v3_watch_restore_test.go @@ -21,6 +21,7 @@ import ( "time" pb "go.etcd.io/etcd/api/v3/etcdserverpb" + "go.etcd.io/etcd/tests/v3/framework/config" "go.etcd.io/etcd/tests/v3/framework/integration" ) @@ -28,7 +29,7 @@ import ( // waiting for not-empty value or 'timeout'. func MustFetchNotEmptyMetric(tb testing.TB, member *integration.Member, metric string, timeout <-chan time.Time) string { metricValue := "" - tick := time.Tick(integration.TickDuration) + tick := time.Tick(config.TickDuration) for metricValue == "" { tb.Logf("Waiting for metric: %v", metric) select {