@@ -21,12 +21,14 @@ import (
21
21
"testing"
22
22
"time"
23
23
24
+ "github.com/pingcap/log"
24
25
"github.com/stretchr/testify/require"
25
26
"github.com/stretchr/testify/suite"
26
27
"github.com/tikv/pd/client/http"
27
28
"github.com/tikv/pd/client/testutil"
28
29
"github.com/tikv/pd/pkg/schedule/labeler"
29
30
"github.com/tikv/pd/pkg/schedule/types"
31
+ "go.uber.org/zap"
30
32
)
31
33
32
34
type schedulerSuite struct {
@@ -201,3 +203,72 @@ func (s *schedulerSuite) TestRegionLabelDenyScheduler() {
201
203
return true
202
204
}, testutil .WithWaitFor (time .Minute ))
203
205
}
206
+
207
+ func (s * schedulerSuite ) TestGrantOrEvictLeaderTwice () {
208
+ re := require .New (s .T ())
209
+ ctx , cancel := context .WithCancel (context .Background ())
210
+ defer cancel ()
211
+
212
+ pdHTTPCli := http .NewClient ("pd-real-cluster-test" , getPDEndpoints (s .T ()))
213
+ regions , err := pdHTTPCli .GetRegions (ctx )
214
+ re .NoError (err )
215
+ re .NotEmpty (regions .Regions )
216
+ region1 := regions .Regions [0 ]
217
+
218
+ var i int
219
+ evictLeader := func () {
220
+ re .NoError (pdHTTPCli .CreateScheduler (ctx , types .EvictLeaderScheduler .String (), uint64 (region1 .Leader .StoreID )))
221
+ // if the second evict leader scheduler cause the pause-leader-filter
222
+ // disable, the balance-leader-scheduler need some time to transfer
223
+ // leader. See details in https://github.com/tikv/pd/issues/8756.
224
+ if i == 1 {
225
+ time .Sleep (3 * time .Second )
226
+ }
227
+ testutil .Eventually (re , func () bool {
228
+ regions , err := pdHTTPCli .GetRegions (ctx )
229
+ if err != nil {
230
+ log .Error ("get regions failed" , zap .Error (err ))
231
+ return false
232
+ }
233
+ for _ , region := range regions .Regions {
234
+ if region .Leader .StoreID == region1 .Leader .StoreID {
235
+ return false
236
+ }
237
+ }
238
+ return true
239
+ }, testutil .WithWaitFor (time .Minute ))
240
+
241
+ i ++
242
+ }
243
+
244
+ evictLeader ()
245
+ evictLeader ()
246
+ pdHTTPCli .DeleteScheduler (ctx , types .EvictLeaderScheduler .String ())
247
+
248
+ i = 0
249
+ grantLeader := func () {
250
+ re .NoError (pdHTTPCli .CreateScheduler (ctx , types .GrantLeaderScheduler .String (), uint64 (region1 .Leader .StoreID )))
251
+ if i == 1 {
252
+ time .Sleep (3 * time .Second )
253
+ }
254
+ testutil .Eventually (re , func () bool {
255
+ regions , err := pdHTTPCli .GetRegions (ctx )
256
+ if err != nil {
257
+ log .Error ("get regions failed" , zap .Error (err ))
258
+ return false
259
+ }
260
+ for _ , region := range regions .Regions {
261
+ if region .Leader .StoreID != region1 .Leader .StoreID {
262
+ return false
263
+ }
264
+ }
265
+ return true
266
+ }, testutil .WithWaitFor (2 * time .Minute ))
267
+
268
+ i ++
269
+ }
270
+
271
+ grantLeader ()
272
+ grantLeader ()
273
+ pdHTTPCli .DeleteScheduler (ctx , types .GrantLeaderScheduler .String ())
274
+ }
0 commit comments