Skip to content

Commit 53adbed

Browse files
authored
*: add test for syncer (#8873)
ref #8823 Signed-off-by: Ryan Leung <[email protected]>
1 parent 3cfd66f commit 53adbed

File tree

3 files changed

+147
-54
lines changed

3 files changed

+147
-54
lines changed

pkg/mock/mockserver/mockserver.go

+88
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
// Copyright 2024 TiKV Project Authors.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package mockserver
16+
17+
import (
18+
"context"
19+
20+
"github.com/pingcap/kvproto/pkg/pdpb"
21+
"github.com/tikv/pd/pkg/core"
22+
"github.com/tikv/pd/pkg/storage"
23+
"github.com/tikv/pd/pkg/utils/grpcutil"
24+
)
25+
26+
// MockServer is used to mock Server for test use.
27+
type MockServer struct {
28+
ctx context.Context
29+
member, leader *pdpb.Member
30+
storage storage.Storage
31+
bc *core.BasicCluster
32+
}
33+
34+
// NewMockServer creates a new MockServer.
35+
func NewMockServer(ctx context.Context, member, leader *pdpb.Member, storage storage.Storage, bc *core.BasicCluster) *MockServer {
36+
return &MockServer{
37+
ctx: ctx,
38+
member: member,
39+
leader: leader,
40+
storage: storage,
41+
bc: bc,
42+
}
43+
}
44+
45+
// LoopContext returns the context of the server.
46+
func (s *MockServer) LoopContext() context.Context {
47+
return s.ctx
48+
}
49+
50+
// ClusterID returns the cluster ID of the server.
51+
func (*MockServer) ClusterID() uint64 {
52+
return 1
53+
}
54+
55+
// GetMemberInfo returns the member info of the server.
56+
func (s *MockServer) GetMemberInfo() *pdpb.Member {
57+
return s.member
58+
}
59+
60+
// GetLeader returns the leader of the server.
61+
func (s *MockServer) GetLeader() *pdpb.Member {
62+
return s.leader
63+
}
64+
65+
// GetStorage returns the storage of the server.
66+
func (s *MockServer) GetStorage() storage.Storage {
67+
return s.storage
68+
}
69+
70+
// Name returns the name of the server.
71+
func (*MockServer) Name() string {
72+
return "mock-server"
73+
}
74+
75+
// GetRegions returns the regions of the server.
76+
func (s *MockServer) GetRegions() []*core.RegionInfo {
77+
return s.bc.GetRegions()
78+
}
79+
80+
// GetTLSConfig returns the TLS config of the server.
81+
func (*MockServer) GetTLSConfig() *grpcutil.TLSConfig {
82+
return &grpcutil.TLSConfig{}
83+
}
84+
85+
// GetBasicCluster returns the basic cluster of the server.
86+
func (s *MockServer) GetBasicCluster() *core.BasicCluster {
87+
return s.bc
88+
}

pkg/syncer/client_test.go

+15-54
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ import (
2121

2222
"github.com/pingcap/failpoint"
2323
"github.com/pingcap/kvproto/pkg/metapb"
24-
"github.com/pingcap/kvproto/pkg/pdpb"
2524
"github.com/stretchr/testify/require"
2625
"github.com/tikv/pd/pkg/core"
26+
"github.com/tikv/pd/pkg/mock/mockserver"
2727
"github.com/tikv/pd/pkg/storage"
2828
"github.com/tikv/pd/pkg/utils/grpcutil"
2929
"google.golang.org/grpc/codes"
@@ -37,11 +37,13 @@ func TestLoadRegion(t *testing.T) {
3737
rs, err := storage.NewRegionStorageWithLevelDBBackend(context.Background(), tempDir, nil)
3838
re.NoError(err)
3939

40-
server := &mockServer{
41-
ctx: context.Background(),
42-
storage: storage.NewCoreStorage(storage.NewStorageWithMemoryBackend(), rs),
43-
bc: core.NewBasicCluster(),
44-
}
40+
server := mockserver.NewMockServer(
41+
context.Background(),
42+
nil,
43+
nil,
44+
storage.NewCoreStorage(storage.NewStorageWithMemoryBackend(), rs),
45+
core.NewBasicCluster(),
46+
)
4547
for i := range 30 {
4648
rs.SaveRegion(&metapb.Region{Id: uint64(i) + 1})
4749
}
@@ -64,11 +66,13 @@ func TestErrorCode(t *testing.T) {
6466
tempDir := t.TempDir()
6567
rs, err := storage.NewRegionStorageWithLevelDBBackend(context.Background(), tempDir, nil)
6668
re.NoError(err)
67-
server := &mockServer{
68-
ctx: context.Background(),
69-
storage: storage.NewCoreStorage(storage.NewStorageWithMemoryBackend(), rs),
70-
bc: core.NewBasicCluster(),
71-
}
69+
server := mockserver.NewMockServer(
70+
context.Background(),
71+
nil,
72+
nil,
73+
storage.NewCoreStorage(storage.NewStorageWithMemoryBackend(), rs),
74+
core.NewBasicCluster(),
75+
)
7276
ctx, cancel := context.WithCancel(context.TODO())
7377
rc := NewRegionSyncer(server)
7478
conn, err := grpcutil.GetClientConn(ctx, "http://127.0.0.1", nil)
@@ -79,46 +83,3 @@ func TestErrorCode(t *testing.T) {
7983
re.True(ok)
8084
re.Equal(codes.Canceled, ev.Code())
8185
}
82-
83-
type mockServer struct {
84-
ctx context.Context
85-
member, leader *pdpb.Member
86-
storage storage.Storage
87-
bc *core.BasicCluster
88-
}
89-
90-
func (s *mockServer) LoopContext() context.Context {
91-
return s.ctx
92-
}
93-
94-
func (*mockServer) ClusterID() uint64 {
95-
return 1
96-
}
97-
98-
func (s *mockServer) GetMemberInfo() *pdpb.Member {
99-
return s.member
100-
}
101-
102-
func (s *mockServer) GetLeader() *pdpb.Member {
103-
return s.leader
104-
}
105-
106-
func (s *mockServer) GetStorage() storage.Storage {
107-
return s.storage
108-
}
109-
110-
func (*mockServer) Name() string {
111-
return "mock-server"
112-
}
113-
114-
func (s *mockServer) GetRegions() []*core.RegionInfo {
115-
return s.bc.GetRegions()
116-
}
117-
118-
func (*mockServer) GetTLSConfig() *grpcutil.TLSConfig {
119-
return &grpcutil.TLSConfig{}
120-
}
121-
122-
func (s *mockServer) GetBasicCluster() *core.BasicCluster {
123-
return s.bc
124-
}

tests/server/cluster/cluster_test.go

+44
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import (
3737
"github.com/tikv/pd/pkg/dashboard"
3838
"github.com/tikv/pd/pkg/id"
3939
"github.com/tikv/pd/pkg/mock/mockid"
40+
"github.com/tikv/pd/pkg/mock/mockserver"
4041
sc "github.com/tikv/pd/pkg/schedule/config"
4142
"github.com/tikv/pd/pkg/schedule/operator"
4243
"github.com/tikv/pd/pkg/schedule/schedulers"
@@ -45,6 +46,7 @@ import (
4546
"github.com/tikv/pd/pkg/storage"
4647
"github.com/tikv/pd/pkg/syncer"
4748
"github.com/tikv/pd/pkg/tso"
49+
"github.com/tikv/pd/pkg/utils/tempurl"
4850
"github.com/tikv/pd/pkg/utils/testutil"
4951
"github.com/tikv/pd/pkg/utils/tsoutil"
5052
"github.com/tikv/pd/pkg/utils/typeutil"
@@ -1887,3 +1889,45 @@ func checkLog(re *require.Assertions, fname, expect string) {
18871889
})
18881890
os.Truncate(fname, 0)
18891891
}
1892+
1893+
func TestFollowerExitSyncTime(t *testing.T) {
1894+
re := require.New(t)
1895+
ctx, cancel := context.WithCancel(context.Background())
1896+
defer cancel()
1897+
tc, err := tests.NewTestCluster(ctx, 1)
1898+
defer tc.Destroy()
1899+
re.NoError(err)
1900+
err = tc.RunInitialServers()
1901+
re.NoError(err)
1902+
tc.WaitLeader()
1903+
leaderServer := tc.GetLeaderServer()
1904+
re.NoError(leaderServer.BootstrapCluster())
1905+
1906+
tempDir := t.TempDir()
1907+
rs, err := storage.NewRegionStorageWithLevelDBBackend(context.Background(), tempDir, nil)
1908+
re.NoError(err)
1909+
1910+
server := mockserver.NewMockServer(
1911+
context.Background(),
1912+
&pdpb.Member{MemberId: 1, Name: "test", ClientUrls: []string{tempurl.Alloc()}},
1913+
nil,
1914+
storage.NewCoreStorage(storage.NewStorageWithMemoryBackend(), rs),
1915+
core.NewBasicCluster(),
1916+
)
1917+
s := syncer.NewRegionSyncer(server)
1918+
s.StartSyncWithLeader(leaderServer.GetAddr())
1919+
time.Sleep(time.Second)
1920+
1921+
// Record the time when exiting sync
1922+
startTime := time.Now()
1923+
1924+
// Simulate leader change scenario
1925+
// Directly call StopSyncWithLeader to simulate exit
1926+
s.StopSyncWithLeader()
1927+
1928+
// Calculate time difference
1929+
elapsedTime := time.Since(startTime)
1930+
1931+
// Assert that the sync exit time is within expected range
1932+
re.Less(elapsedTime, time.Second)
1933+
}

0 commit comments

Comments
 (0)