Skip to content

Commit e227f39

Browse files
okJiangti-chi-bot[bot]
authored andcommitted
scheduler: add test for creating evict-leader-scheduler twice (tikv#8757)
close tikv#8756 Signed-off-by: okJiang <[email protected]> Co-authored-by: ti-chi-bot[bot] <108142056+ti-chi-bot[bot]@users.noreply.github.com>
1 parent d62b7b6 commit e227f39

File tree

6 files changed

+81
-6
lines changed

6 files changed

+81
-6
lines changed

pkg/core/store.go

+2
Original file line numberDiff line numberDiff line change
@@ -779,6 +779,7 @@ func (s *StoresInfo) ResetStores() {
779779
func (s *StoresInfo) PauseLeaderTransfer(storeID uint64) error {
780780
s.Lock()
781781
defer s.Unlock()
782+
log.Info("pause store leader transfer", zap.Uint64("store-id", storeID), zap.String("direction", direction.String()))
782783
store, ok := s.stores[storeID]
783784
if !ok {
784785
return errs.ErrStoreNotFound.FastGenByArgs(storeID)
@@ -795,6 +796,7 @@ func (s *StoresInfo) PauseLeaderTransfer(storeID uint64) error {
795796
func (s *StoresInfo) ResumeLeaderTransfer(storeID uint64) {
796797
s.Lock()
797798
defer s.Unlock()
799+
log.Info("resume store leader transfer", zap.Uint64("store-id", storeID), zap.String("direction", direction.String()))
798800
store, ok := s.stores[storeID]
799801
if !ok {
800802
log.Warn("try to clean a store's pause state, but it is not found. It may be cleanup",

pkg/schedule/schedulers/grant_leader.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ type grantLeaderSchedulerConfig struct {
4545
}
4646

4747
func (conf *grantLeaderSchedulerConfig) buildWithArgs(args []string) error {
48-
if len(args) != 1 {
48+
if len(args) < 1 {
4949
return errs.ErrSchedulerConfig.FastGenByArgs("id")
5050
}
5151

@@ -271,6 +271,7 @@ func (handler *grantLeaderHandler) updateConfig(w http.ResponseWriter, r *http.R
271271

272272
err := handler.config.buildWithArgs(args)
273273
if err != nil {
274+
log.Error("fail to build config", errs.ZapError(err))
274275
handler.config.Lock()
275276
handler.config.cluster.ResumeLeaderTransfer(id)
276277
handler.config.Unlock()
@@ -279,6 +280,7 @@ func (handler *grantLeaderHandler) updateConfig(w http.ResponseWriter, r *http.R
279280
}
280281
err = handler.config.persist()
281282
if err != nil {
283+
log.Error("fail to persist config", errs.ZapError(err))
282284
_, _ = handler.config.removeStore(id)
283285
handler.rd.JSON(w, http.StatusInternalServerError, err.Error())
284286
return

pkg/schedule/schedulers/init.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ func schedulersRegister() {
134134
// evict leader
135135
RegisterSliceDecoderBuilder(types.EvictLeaderScheduler, func(args []string) ConfigDecoder {
136136
return func(v any) error {
137-
if len(args) != 1 {
137+
if len(args) < 1 {
138138
return errs.ErrSchedulerConfig.FastGenByArgs("id")
139139
}
140140
conf, ok := v.(*evictLeaderSchedulerConfig)
@@ -268,7 +268,7 @@ func schedulersRegister() {
268268
// grant leader
269269
RegisterSliceDecoderBuilder(types.GrantLeaderScheduler, func(args []string) ConfigDecoder {
270270
return func(v any) error {
271-
if len(args) != 1 {
271+
if len(args) < 1 {
272272
return errs.ErrSchedulerConfig.FastGenByArgs("id")
273273
}
274274

plugin/scheduler_example/evict_leader.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ const (
5050
func init() {
5151
schedulers.RegisterSliceDecoderBuilder(userEvictLeaderScheduler, func(args []string) schedulers.ConfigDecoder {
5252
return func(v any) error {
53-
if len(args) != 1 {
53+
if len(args) < 1 {
5454
return errors.New("should specify the store-id")
5555
}
5656
conf, ok := v.(*evictLeaderSchedulerConfig)
@@ -101,7 +101,7 @@ type evictLeaderSchedulerConfig struct {
101101

102102
// BuildWithArgs builds the config with the args.
103103
func (conf *evictLeaderSchedulerConfig) BuildWithArgs(args []string) error {
104-
if len(args) != 1 {
104+
if len(args) < 1 {
105105
return errors.New("should specify the store-id")
106106
}
107107

tests/integrations/realcluster/real_cluster.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ type realClusterSuite struct {
3737
}
3838

3939
var (
40-
playgroundLogDir = filepath.Join("tmp", "real_cluster", "playground")
40+
playgroundLogDir = "/tmp/real_cluster/playground"
4141
tiupBin = os.Getenv("HOME") + "/.tiup/bin/tiup"
4242
)
4343

tests/integrations/realcluster/scheduler_test.go

+71
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,14 @@ import (
2121
"testing"
2222
"time"
2323

24+
"github.com/pingcap/log"
2425
"github.com/stretchr/testify/require"
2526
"github.com/stretchr/testify/suite"
2627
"github.com/tikv/pd/client/http"
2728
"github.com/tikv/pd/client/testutil"
2829
"github.com/tikv/pd/pkg/schedule/labeler"
2930
"github.com/tikv/pd/pkg/schedule/types"
31+
"go.uber.org/zap"
3032
)
3133

3234
type schedulerSuite struct {
@@ -201,3 +203,72 @@ func (s *schedulerSuite) TestRegionLabelDenyScheduler() {
201203
return true
202204
}, testutil.WithWaitFor(time.Minute))
203205
}
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

Comments
 (0)