Skip to content

Commit 07c19b1

Browse files
tests: add more cases for TestReadyAPI (tikv#9170)
ref tikv#4399 Signed-off-by: lhy1024 <[email protected]> Co-authored-by: ti-chi-bot[bot] <108142056+ti-chi-bot[bot]@users.noreply.github.com>
1 parent f3d41fa commit 07c19b1

File tree

3 files changed

+51
-22
lines changed

3 files changed

+51
-22
lines changed

pkg/storage/storage.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import (
2020

2121
clientv3 "go.etcd.io/etcd/client/v3"
2222

23-
"github.com/pingcap/failpoint"
2423
"github.com/pingcap/kvproto/pkg/metapb"
2524

2625
"github.com/tikv/pd/pkg/core"
@@ -221,9 +220,6 @@ func AreRegionsLoaded(s Storage) bool {
221220
ps := s.(*coreStorage)
222221
ps.mu.RLock()
223222
defer ps.mu.RUnlock()
224-
failpoint.Inject("loadRegionSlow", func() {
225-
failpoint.Return(false)
226-
})
227223
if ps.useRegionStorage.Load() {
228224
return ps.regionLoaded == fromLeveldb
229225
}

server/apiv2/handlers/ready.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import (
1919

2020
"github.com/gin-gonic/gin"
2121

22+
"github.com/pingcap/failpoint"
23+
2224
"github.com/tikv/pd/pkg/storage"
2325
"github.com/tikv/pd/server"
2426
"github.com/tikv/pd/server/apiv2/middlewares"
@@ -39,6 +41,13 @@ func Ready(c *gin.Context) {
3941
svr := c.MustGet(middlewares.ServerContextKey).(*server.Server)
4042
s := svr.GetStorage()
4143
regionLoaded := storage.AreRegionsLoaded(s)
44+
failpoint.Inject("loadRegionSlow", func(val failpoint.Value) {
45+
if s, ok := val.(string); ok {
46+
if svr.GetAddr() == s {
47+
regionLoaded = false
48+
}
49+
}
50+
})
4251
if regionLoaded {
4352
c.Status(http.StatusOK)
4453
} else {

tests/server/apiv2/handlers/ready_test.go

Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -25,48 +25,72 @@ import (
2525

2626
"github.com/pingcap/failpoint"
2727

28-
tu "github.com/tikv/pd/pkg/utils/testutil"
28+
"github.com/tikv/pd/pkg/utils/apiutil"
2929
"github.com/tikv/pd/server/apiv2/handlers"
3030
"github.com/tikv/pd/tests"
3131
)
3232

33-
func TestReady(t *testing.T) {
33+
func TestReadyAPI(t *testing.T) {
3434
re := require.New(t)
3535
ctx, cancel := context.WithCancel(context.Background())
3636
defer cancel()
37-
cluster, err := tests.NewTestCluster(ctx, 1)
37+
cluster, err := tests.NewTestCluster(ctx, 3)
3838
re.NoError(err)
3939
defer cluster.Destroy()
4040
re.NoError(cluster.RunInitialServers())
4141
re.NotEmpty(cluster.WaitLeader())
42-
server := cluster.GetLeaderServer()
43-
re.NoError(server.BootstrapCluster())
44-
url := server.GetConfig().ClientUrls + v2Prefix + "/ready"
45-
failpoint.Enable("github.com/tikv/pd/pkg/storage/loadRegionSlow", `return()`)
46-
checkReady(re, url, false)
47-
failpoint.Disable("github.com/tikv/pd/pkg/storage/loadRegionSlow")
48-
checkReady(re, url, true)
42+
leader := cluster.GetLeaderServer()
43+
re.NoError(leader.BootstrapCluster())
44+
url := leader.GetConfig().ClientUrls + v2Prefix + "/ready"
45+
// check ready status when region is not loaded for leader
46+
failpoint.Enable("github.com/tikv/pd/server/apiv2/handlers/loadRegionSlow", `return("`+leader.GetAddr()+`")`)
47+
checkReadyAPI(re, url, false)
48+
// check ready status when region is loaded for leader
49+
failpoint.Disable("github.com/tikv/pd/server/apiv2/handlers/loadRegionSlow")
50+
checkReadyAPI(re, url, true)
51+
// check ready status when region is not loaded for follower
52+
followerServer := cluster.GetServer(cluster.GetFollower())
53+
url = followerServer.GetConfig().ClientUrls + v2Prefix + "/ready"
54+
failpoint.Enable("github.com/tikv/pd/server/apiv2/handlers/loadRegionSlow", `return("`+followerServer.GetAddr()+`")`)
55+
checkReadyAPI(re, url, true)
56+
checkReadyAPI(re, url, false, apiutil.PDAllowFollowerHandleHeader)
57+
// check ready status when region is loaded for follower
58+
failpoint.Disable("github.com/tikv/pd/server/apiv2/handlers/loadRegionSlow")
59+
checkReadyAPI(re, url, true)
60+
checkReadyAPI(re, url, true, apiutil.PDAllowFollowerHandleHeader)
4961
}
5062

51-
func checkReady(re *require.Assertions, url string, isReady bool) {
63+
func checkReadyAPI(re *require.Assertions, url string, isReady bool, headers ...string) {
5264
expectCode := http.StatusOK
5365
if !isReady {
5466
expectCode = http.StatusInternalServerError
5567
}
56-
resp, err := tests.TestDialClient.Get(url)
68+
// check ready status
69+
req, err := http.NewRequest(http.MethodGet, url, http.NoBody)
70+
re.NoError(err)
71+
if len(headers) > 0 {
72+
req.Header.Add(headers[0], "true")
73+
}
74+
resp, err := tests.TestDialClient.Do(req)
5775
re.NoError(err)
5876
defer resp.Body.Close()
5977
buf, err := io.ReadAll(resp.Body)
6078
re.NoError(err)
6179
re.Empty(buf)
6280
re.Equal(expectCode, resp.StatusCode)
63-
r := &handlers.ReadyStatus{}
64-
if isReady {
65-
r.RegionLoaded = true
81+
// check ready status with verbose
82+
req, err = http.NewRequest(http.MethodGet, url+"?verbose", http.NoBody)
83+
re.NoError(err)
84+
if len(headers) > 0 {
85+
req.Header.Add(headers[0], "true")
6686
}
67-
data, err := json.Marshal(r)
87+
resp, err = tests.TestDialClient.Do(req)
6888
re.NoError(err)
69-
err = tu.CheckGetJSON(tests.TestDialClient, url+"?verbose", data,
70-
tu.Status(re, expectCode))
89+
defer resp.Body.Close()
90+
buf, err = io.ReadAll(resp.Body)
7191
re.NoError(err)
92+
r := &handlers.ReadyStatus{}
93+
re.NoError(json.Unmarshal(buf, &r))
94+
re.Equal(expectCode, resp.StatusCode)
95+
re.Equal(isReady, r.RegionLoaded)
7296
}

0 commit comments

Comments
 (0)