From 071b116eb27d8c9a93f49bf9ed6099b02544842a Mon Sep 17 00:00:00 2001 From: lhy1024 Date: Fri, 13 Sep 2024 16:15:04 +0800 Subject: [PATCH 1/5] scheduler: add conflict detect for grant hot leader scheduler Signed-off-by: lhy1024 --- server/api/scheduler.go | 66 +++++++++++++++++++ tools/pd-ctl/pdctl/command/scheduler.go | 7 +- .../pd-ctl/tests/scheduler/scheduler_test.go | 34 +++++++++- 3 files changed, 102 insertions(+), 5 deletions(-) diff --git a/server/api/scheduler.go b/server/api/scheduler.go index c96e4c123de..a25aefd76cf 100644 --- a/server/api/scheduler.go +++ b/server/api/scheduler.go @@ -15,6 +15,9 @@ package api import ( + "encoding/json" + "fmt" + "io" "net/http" "net/url" "strconv" @@ -24,7 +27,9 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/log" "github.com/tikv/pd/pkg/errs" + "github.com/tikv/pd/pkg/mcs/utils/constant" "github.com/tikv/pd/pkg/schedule/types" + "github.com/tikv/pd/pkg/slice" "github.com/tikv/pd/pkg/utils/apiutil" "github.com/tikv/pd/server" "github.com/unrolled/render" @@ -143,6 +148,15 @@ func (h *schedulerHandler) CreateScheduler(w http.ResponseWriter, r *http.Reques } collector(strconv.FormatUint(limit, 10)) case types.GrantHotRegionScheduler: + schedulers, err := h.getSchedulers() + if err != nil { + h.r.JSON(w, http.StatusInternalServerError, err.Error()) + return + } + if slice.Contains(schedulers, types.BalanceHotRegionScheduler.String()) { + h.r.JSON(w, http.StatusBadRequest, "balance-hot-region-scheduler is running, please remove it first") + return + } leaderID, ok := input["store-leader-id"].(string) if !ok { h.r.JSON(w, http.StatusBadRequest, "missing leader id") @@ -155,6 +169,16 @@ func (h *schedulerHandler) CreateScheduler(w http.ResponseWriter, r *http.Reques } collector(leaderID) collector(peerIDs) + case types.BalanceHotRegionScheduler: + schedulers, err := h.getSchedulers() + if err != nil { + h.r.JSON(w, http.StatusInternalServerError, err.Error()) + return + } + if slice.Contains(schedulers, types.GrantHotRegionScheduler.String()) { + h.r.JSON(w, http.StatusBadRequest, "grant-hot-region-scheduler is running, please remove it first") + return + } } if err := h.AddScheduler(tp, args...); err != nil { @@ -246,6 +270,48 @@ func (h *schedulerHandler) PauseOrResumeScheduler(w http.ResponseWriter, r *http h.r.JSON(w, http.StatusOK, "Pause or resume the scheduler successfully.") } +func (h *schedulerHandler) getSchedulers() ([]string, error) { + rc, err := h.GetRaftCluster() + if err != nil { + return nil, err + } + if !rc.IsServiceIndependent(constant.SchedulingServiceName) { + schedulers, err := h.GetSchedulerByStatus("", false) + if err != nil { + return nil, err + } + return schedulers.([]string), nil + } + + addr, ok := h.svr.GetServicePrimaryAddr(h.svr.Context(), constant.SchedulingServiceName) + if !ok { + return nil, errs.ErrNotFoundSchedulingAddr.FastGenByArgs() + } + url := fmt.Sprintf("%s/scheduling/api/v1/schedulers", addr) + req, err := http.NewRequest(http.MethodGet, url, http.NoBody) + if err != nil { + return nil, err + } + resp, err := h.svr.GetHTTPClient().Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + return nil, errs.ErrSchedulingServer.FastGenByArgs(resp.StatusCode) + } + bs, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + var schedulers []string + err = json.Unmarshal(bs, &schedulers) + if err != nil { + return nil, err + } + return schedulers, nil +} + type schedulerConfigHandler struct { svr *server.Server rd *render.Render diff --git a/tools/pd-ctl/pdctl/command/scheduler.go b/tools/pd-ctl/pdctl/command/scheduler.go index 43c6429cd4f..16a1a92f2b1 100644 --- a/tools/pd-ctl/pdctl/command/scheduler.go +++ b/tools/pd-ctl/pdctl/command/scheduler.go @@ -354,9 +354,10 @@ func NewSplitBucketSchedulerCommand() *cobra.Command { // NewGrantHotRegionSchedulerCommand returns a command to add a grant-hot-region-scheduler. func NewGrantHotRegionSchedulerCommand() *cobra.Command { c := &cobra.Command{ - Use: "grant-hot-region-scheduler ", - Short: "add a scheduler to grant hot region to fixed stores", - Run: addSchedulerForGrantHotRegionCommandFunc, + Use: "grant-hot-region-scheduler ", + Short: `add a scheduler to grant hot region to fixed stores. + Note: If there is balance-hot-region-scheduler running, please remove it first, otherwise grant-hot-region-scheduler will not work.`, + Run: addSchedulerForGrantHotRegionCommandFunc, } return c } diff --git a/tools/pd-ctl/tests/scheduler/scheduler_test.go b/tools/pd-ctl/tests/scheduler/scheduler_test.go index f680a4bd2e7..4cad309d42c 100644 --- a/tools/pd-ctl/tests/scheduler/scheduler_test.go +++ b/tools/pd-ctl/tests/scheduler/scheduler_test.go @@ -488,12 +488,32 @@ func (suite *schedulerTestSuite) checkSchedulerConfig(cluster *pdTests.TestClust }) // test grant hot region scheduler config - checkSchedulerCommand(re, cmd, pdAddr, []string{"-u", pdAddr, "scheduler", "add", "grant-hot-region-scheduler", "1", "1,2,3"}, map[string]bool{ + // case 1: add grant-hot-region-scheduler when balance-hot-region-scheduler is running + echo = mustExec(re, cmd, []string{"-u", pdAddr, "scheduler", "add", "grant-hot-region-scheduler", "1", "1,2,3"}, nil) + re.Contains(echo, "balance-hot-region-scheduler is running, please remove it first") + + // case 2: add grant-hot-region-scheduler when balance-hot-region-scheduler is paused + checkSchedulerCommand(re, cmd, pdAddr, []string{"-u", pdAddr, "scheduler", "pause", "balance-hot-region-scheduler", "60"}, map[string]bool{ "balance-region-scheduler": true, "balance-leader-scheduler": true, "balance-hot-region-scheduler": true, - "grant-hot-region-scheduler": true, }) + echo = mustExec(re, cmd, []string{"-u", pdAddr, "scheduler", "add", "grant-hot-region-scheduler", "1", "1,2,3"}, nil) + re.Contains(echo, "balance-hot-region-scheduler is running, please remove it first") + + // case 3: add grant-hot-region-scheduler when balance-hot-region-scheduler is disabled + checkSchedulerCommand(re, cmd, pdAddr, []string{"-u", pdAddr, "scheduler", "remove", "balance-hot-region-scheduler"}, map[string]bool{ + "balance-region-scheduler": true, + "balance-leader-scheduler": true, + }) + + checkSchedulerCommand(re, cmd, pdAddr, []string{"-u", pdAddr, "scheduler", "add", "grant-hot-region-scheduler", "1", "1,2,3"}, map[string]bool{ + "balance-region-scheduler": true, + "balance-leader-scheduler": true, + "grant-hot-region-scheduler": true, + }) + + // case 4: test grant-hot-region-scheduler config var conf3 map[string]any expected3 := map[string]any{ "store-id": []any{float64(1), float64(2), float64(3)}, @@ -509,7 +529,17 @@ func (suite *schedulerTestSuite) checkSchedulerConfig(cluster *pdTests.TestClust mustExec(re, cmd, []string{"-u", pdAddr, "scheduler", "config", "grant-hot-region-scheduler"}, &conf3) return reflect.DeepEqual(expected3, conf3) }) + + // case 5: remove grant-hot-region-scheduler + echo = mustExec(re, cmd, []string{"-u", pdAddr, "scheduler", "add", "balance-hot-region-scheduler"}, nil) + re.Contains(echo, "grant-hot-region-scheduler is running, please remove it first") + checkSchedulerCommand(re, cmd, pdAddr, []string{"-u", pdAddr, "scheduler", "remove", "grant-hot-region-scheduler"}, map[string]bool{ + "balance-region-scheduler": true, + "balance-leader-scheduler": true, + }) + + checkSchedulerCommand(re, cmd, pdAddr, []string{"-u", pdAddr, "scheduler", "add", "balance-hot-region-scheduler"}, map[string]bool{ "balance-region-scheduler": true, "balance-leader-scheduler": true, "balance-hot-region-scheduler": true, From 4052699d2a22d184f1daaba77c43d3a5a66e04fd Mon Sep 17 00:00:00 2001 From: lhy1024 Date: Fri, 13 Sep 2024 16:24:39 +0800 Subject: [PATCH 2/5] rename for lint Signed-off-by: lhy1024 --- server/api/scheduler.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/api/scheduler.go b/server/api/scheduler.go index a25aefd76cf..3868bbde9ed 100644 --- a/server/api/scheduler.go +++ b/server/api/scheduler.go @@ -148,7 +148,7 @@ func (h *schedulerHandler) CreateScheduler(w http.ResponseWriter, r *http.Reques } collector(strconv.FormatUint(limit, 10)) case types.GrantHotRegionScheduler: - schedulers, err := h.getSchedulers() + schedulers, err := h.getSchedulersOnDifferentMode() if err != nil { h.r.JSON(w, http.StatusInternalServerError, err.Error()) return @@ -170,7 +170,7 @@ func (h *schedulerHandler) CreateScheduler(w http.ResponseWriter, r *http.Reques collector(leaderID) collector(peerIDs) case types.BalanceHotRegionScheduler: - schedulers, err := h.getSchedulers() + schedulers, err := h.getSchedulersOnDifferentMode() if err != nil { h.r.JSON(w, http.StatusInternalServerError, err.Error()) return @@ -270,7 +270,7 @@ func (h *schedulerHandler) PauseOrResumeScheduler(w http.ResponseWriter, r *http h.r.JSON(w, http.StatusOK, "Pause or resume the scheduler successfully.") } -func (h *schedulerHandler) getSchedulers() ([]string, error) { +func (h *schedulerHandler) getSchedulersOnDifferentMode() ([]string, error) { rc, err := h.GetRaftCluster() if err != nil { return nil, err From ec5ecf9c585d470c4f0854db41667f5f3acb8626 Mon Sep 17 00:00:00 2001 From: lhy1024 Date: Wed, 25 Sep 2024 14:55:24 +0800 Subject: [PATCH 3/5] move test Signed-off-by: lhy1024 --- .../pd-ctl/tests/scheduler/scheduler_test.go | 167 ++++++++++++------ 1 file changed, 109 insertions(+), 58 deletions(-) diff --git a/tools/pd-ctl/tests/scheduler/scheduler_test.go b/tools/pd-ctl/tests/scheduler/scheduler_test.go index 4cad309d42c..9c118c691ac 100644 --- a/tools/pd-ctl/tests/scheduler/scheduler_test.go +++ b/tools/pd-ctl/tests/scheduler/scheduler_test.go @@ -487,64 +487,6 @@ func (suite *schedulerTestSuite) checkSchedulerConfig(cluster *pdTests.TestClust "balance-hot-region-scheduler": true, }) - // test grant hot region scheduler config - // case 1: add grant-hot-region-scheduler when balance-hot-region-scheduler is running - echo = mustExec(re, cmd, []string{"-u", pdAddr, "scheduler", "add", "grant-hot-region-scheduler", "1", "1,2,3"}, nil) - re.Contains(echo, "balance-hot-region-scheduler is running, please remove it first") - - // case 2: add grant-hot-region-scheduler when balance-hot-region-scheduler is paused - checkSchedulerCommand(re, cmd, pdAddr, []string{"-u", pdAddr, "scheduler", "pause", "balance-hot-region-scheduler", "60"}, map[string]bool{ - "balance-region-scheduler": true, - "balance-leader-scheduler": true, - "balance-hot-region-scheduler": true, - }) - echo = mustExec(re, cmd, []string{"-u", pdAddr, "scheduler", "add", "grant-hot-region-scheduler", "1", "1,2,3"}, nil) - re.Contains(echo, "balance-hot-region-scheduler is running, please remove it first") - - // case 3: add grant-hot-region-scheduler when balance-hot-region-scheduler is disabled - checkSchedulerCommand(re, cmd, pdAddr, []string{"-u", pdAddr, "scheduler", "remove", "balance-hot-region-scheduler"}, map[string]bool{ - "balance-region-scheduler": true, - "balance-leader-scheduler": true, - }) - - checkSchedulerCommand(re, cmd, pdAddr, []string{"-u", pdAddr, "scheduler", "add", "grant-hot-region-scheduler", "1", "1,2,3"}, map[string]bool{ - "balance-region-scheduler": true, - "balance-leader-scheduler": true, - "grant-hot-region-scheduler": true, - }) - - // case 4: test grant-hot-region-scheduler config - var conf3 map[string]any - expected3 := map[string]any{ - "store-id": []any{float64(1), float64(2), float64(3)}, - "store-leader-id": float64(1), - } - mustExec(re, cmd, []string{"-u", pdAddr, "scheduler", "config", "grant-hot-region-scheduler"}, &conf3) - re.Equal(expected3, conf3) - - echo = mustExec(re, cmd, []string{"-u", pdAddr, "scheduler", "config", "grant-hot-region-scheduler", "set", "2", "1,2,3"}, nil) - re.Contains(echo, "Success!") - expected3["store-leader-id"] = float64(2) - testutil.Eventually(re, func() bool { - mustExec(re, cmd, []string{"-u", pdAddr, "scheduler", "config", "grant-hot-region-scheduler"}, &conf3) - return reflect.DeepEqual(expected3, conf3) - }) - - // case 5: remove grant-hot-region-scheduler - echo = mustExec(re, cmd, []string{"-u", pdAddr, "scheduler", "add", "balance-hot-region-scheduler"}, nil) - re.Contains(echo, "grant-hot-region-scheduler is running, please remove it first") - - checkSchedulerCommand(re, cmd, pdAddr, []string{"-u", pdAddr, "scheduler", "remove", "grant-hot-region-scheduler"}, map[string]bool{ - "balance-region-scheduler": true, - "balance-leader-scheduler": true, - }) - - checkSchedulerCommand(re, cmd, pdAddr, []string{"-u", pdAddr, "scheduler", "add", "balance-hot-region-scheduler"}, map[string]bool{ - "balance-region-scheduler": true, - "balance-leader-scheduler": true, - "balance-hot-region-scheduler": true, - }) - // test shuffle hot region scheduler echo = mustExec(re, cmd, []string{"-u", pdAddr, "scheduler", "add", "shuffle-hot-region-scheduler"}, nil) re.Contains(echo, "Success!") @@ -614,6 +556,115 @@ func (suite *schedulerTestSuite) checkSchedulerConfig(cluster *pdTests.TestClust re.Contains(echo, "Success!") } +func (suite *schedulerTestSuite) TestGrantLeaderScheduler() { + suite.env.RunTestBasedOnMode(suite.checkGrantLeaderScheduler) +} + +func (suite *schedulerTestSuite) checkGrantLeaderScheduler(cluster *pdTests.TestCluster) { + re := suite.Require() + pdAddr := cluster.GetConfig().GetClientURL() + cmd := ctl.GetRootCmd() + + stores := []*metapb.Store{ + { + Id: 1, + State: metapb.StoreState_Up, + LastHeartbeat: time.Now().UnixNano(), + }, + { + Id: 2, + State: metapb.StoreState_Up, + LastHeartbeat: time.Now().UnixNano(), + }, + { + Id: 3, + State: metapb.StoreState_Up, + LastHeartbeat: time.Now().UnixNano(), + }, + { + Id: 4, + State: metapb.StoreState_Up, + LastHeartbeat: time.Now().UnixNano(), + }, + } + for _, store := range stores { + pdTests.MustPutStore(re, cluster, store) + } + + // note: because pdqsort is an unstable sort algorithm, set ApproximateSize for this region. + pdTests.MustPutRegion(re, cluster, 1, 1, []byte("a"), []byte("b"), core.SetApproximateSize(10)) + + expected := map[string]bool{ + "balance-region-scheduler": true, + "balance-leader-scheduler": true, + "balance-hot-region-scheduler": true, + "evict-slow-store-scheduler": true, + } + checkSchedulerCommand(re, cmd, pdAddr, nil, expected) + + // case 1: add grant-hot-region-scheduler when balance-hot-region-scheduler is running + echo := mustExec(re, cmd, []string{"-u", pdAddr, "scheduler", "add", "grant-hot-region-scheduler", "1", "1,2,3"}, nil) + re.Contains(echo, "balance-hot-region-scheduler is running, please remove it first") + + // case 2: add grant-hot-region-scheduler when balance-hot-region-scheduler is paused + checkSchedulerCommand(re, cmd, pdAddr, []string{"-u", pdAddr, "scheduler", "pause", "balance-hot-region-scheduler", "60"}, map[string]bool{ + "balance-region-scheduler": true, + "balance-leader-scheduler": true, + "balance-hot-region-scheduler": true, + "evict-slow-store-scheduler": true, + }) + echo = mustExec(re, cmd, []string{"-u", pdAddr, "scheduler", "add", "grant-hot-region-scheduler", "1", "1,2,3"}, nil) + re.Contains(echo, "balance-hot-region-scheduler is running, please remove it first") + + // case 3: add grant-hot-region-scheduler when balance-hot-region-scheduler is disabled + checkSchedulerCommand(re, cmd, pdAddr, []string{"-u", pdAddr, "scheduler", "remove", "balance-hot-region-scheduler"}, map[string]bool{ + "balance-region-scheduler": true, + "balance-leader-scheduler": true, + "evict-slow-store-scheduler": true, + }) + + checkSchedulerCommand(re, cmd, pdAddr, []string{"-u", pdAddr, "scheduler", "add", "grant-hot-region-scheduler", "1", "1,2,3"}, map[string]bool{ + "balance-region-scheduler": true, + "balance-leader-scheduler": true, + "grant-hot-region-scheduler": true, + "evict-slow-store-scheduler": true, + }) + + // case 4: test grant-hot-region-scheduler config + var conf3 map[string]any + expected3 := map[string]any{ + "store-id": []any{float64(1), float64(2), float64(3)}, + "store-leader-id": float64(1), + } + mustExec(re, cmd, []string{"-u", pdAddr, "scheduler", "config", "grant-hot-region-scheduler"}, &conf3) + re.Equal(expected3, conf3) + + echo = mustExec(re, cmd, []string{"-u", pdAddr, "scheduler", "config", "grant-hot-region-scheduler", "set", "2", "1,2,3"}, nil) + re.Contains(echo, "Success!") + expected3["store-leader-id"] = float64(2) + testutil.Eventually(re, func() bool { + mustExec(re, cmd, []string{"-u", pdAddr, "scheduler", "config", "grant-hot-region-scheduler"}, &conf3) + return reflect.DeepEqual(expected3, conf3) + }) + + // case 5: remove grant-hot-region-scheduler + echo = mustExec(re, cmd, []string{"-u", pdAddr, "scheduler", "add", "balance-hot-region-scheduler"}, nil) + re.Contains(echo, "grant-hot-region-scheduler is running, please remove it first") + + checkSchedulerCommand(re, cmd, pdAddr, []string{"-u", pdAddr, "scheduler", "remove", "grant-hot-region-scheduler"}, map[string]bool{ + "balance-region-scheduler": true, + "balance-leader-scheduler": true, + "evict-slow-store-scheduler": true, + }) + + checkSchedulerCommand(re, cmd, pdAddr, []string{"-u", pdAddr, "scheduler", "add", "balance-hot-region-scheduler"}, map[string]bool{ + "balance-region-scheduler": true, + "balance-leader-scheduler": true, + "balance-hot-region-scheduler": true, + "evict-slow-store-scheduler": true, + }) +} + func (suite *schedulerTestSuite) TestHotRegionSchedulerConfig() { suite.env.RunTestBasedOnMode(suite.checkHotRegionSchedulerConfig) } From 201adb51f22e46fbc4b936391eded6a4a10e7091 Mon Sep 17 00:00:00 2001 From: lhy1024 Date: Wed, 25 Sep 2024 15:41:26 +0800 Subject: [PATCH 4/5] address comments Signed-off-by: lhy1024 --- server/api/scheduler.go | 56 +++++++++++------------------------------ 1 file changed, 14 insertions(+), 42 deletions(-) diff --git a/server/api/scheduler.go b/server/api/scheduler.go index 3868bbde9ed..3d69674db48 100644 --- a/server/api/scheduler.go +++ b/server/api/scheduler.go @@ -15,9 +15,6 @@ package api import ( - "encoding/json" - "fmt" - "io" "net/http" "net/url" "strconv" @@ -148,12 +145,12 @@ func (h *schedulerHandler) CreateScheduler(w http.ResponseWriter, r *http.Reques } collector(strconv.FormatUint(limit, 10)) case types.GrantHotRegionScheduler: - schedulers, err := h.getSchedulersOnDifferentMode() + isExist, err := h.isSchedulerExist(types.BalanceHotRegionScheduler) if err != nil { h.r.JSON(w, http.StatusInternalServerError, err.Error()) return } - if slice.Contains(schedulers, types.BalanceHotRegionScheduler.String()) { + if isExist { h.r.JSON(w, http.StatusBadRequest, "balance-hot-region-scheduler is running, please remove it first") return } @@ -170,12 +167,12 @@ func (h *schedulerHandler) CreateScheduler(w http.ResponseWriter, r *http.Reques collector(leaderID) collector(peerIDs) case types.BalanceHotRegionScheduler: - schedulers, err := h.getSchedulersOnDifferentMode() + isExist, err := h.isSchedulerExist(types.GrantHotRegionScheduler) if err != nil { h.r.JSON(w, http.StatusInternalServerError, err.Error()) return } - if slice.Contains(schedulers, types.GrantHotRegionScheduler.String()) { + if isExist { h.r.JSON(w, http.StatusBadRequest, "grant-hot-region-scheduler is running, please remove it first") return } @@ -270,46 +267,21 @@ func (h *schedulerHandler) PauseOrResumeScheduler(w http.ResponseWriter, r *http h.r.JSON(w, http.StatusOK, "Pause or resume the scheduler successfully.") } -func (h *schedulerHandler) getSchedulersOnDifferentMode() ([]string, error) { +func (h *schedulerHandler) isSchedulerExist(scheduler types.CheckerSchedulerType) (bool, error) { rc, err := h.GetRaftCluster() if err != nil { - return nil, err + return false, err } - if !rc.IsServiceIndependent(constant.SchedulingServiceName) { - schedulers, err := h.GetSchedulerByStatus("", false) - if err != nil { - return nil, err - } - return schedulers.([]string), nil - } - - addr, ok := h.svr.GetServicePrimaryAddr(h.svr.Context(), constant.SchedulingServiceName) - if !ok { - return nil, errs.ErrNotFoundSchedulingAddr.FastGenByArgs() - } - url := fmt.Sprintf("%s/scheduling/api/v1/schedulers", addr) - req, err := http.NewRequest(http.MethodGet, url, http.NoBody) - if err != nil { - return nil, err + if rc.IsServiceIndependent(constant.SchedulingServiceName) { + handlers := rc.GetSchedulerHandlers() + _, ok := handlers[scheduler.String()] + return ok, nil } - resp, err := h.svr.GetHTTPClient().Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - return nil, errs.ErrSchedulingServer.FastGenByArgs(resp.StatusCode) - } - bs, err := io.ReadAll(resp.Body) - if err != nil { - return nil, err - } - var schedulers []string - err = json.Unmarshal(bs, &schedulers) - if err != nil { - return nil, err + schedulers := rc.GetSchedulers() + if slice.Contains(schedulers, scheduler.String()) { + return !rc.GetSchedulerConfig().IsSchedulerDisabled(scheduler), nil } - return schedulers, nil + return false, nil } type schedulerConfigHandler struct { From 1f7991c4963500cb59ff177cee1d0fab5bbf523b Mon Sep 17 00:00:00 2001 From: lhy1024 Date: Wed, 25 Sep 2024 16:32:41 +0800 Subject: [PATCH 5/5] reduce duplicate code Signed-off-by: lhy1024 --- .../pd-ctl/tests/scheduler/scheduler_test.go | 34 ++++--------------- 1 file changed, 7 insertions(+), 27 deletions(-) diff --git a/tools/pd-ctl/tests/scheduler/scheduler_test.go b/tools/pd-ctl/tests/scheduler/scheduler_test.go index deb821f5930..332fe79614e 100644 --- a/tools/pd-ctl/tests/scheduler/scheduler_test.go +++ b/tools/pd-ctl/tests/scheduler/scheduler_test.go @@ -597,25 +597,16 @@ func (suite *schedulerTestSuite) checkGrantLeaderScheduler(cluster *pdTests.Test // note: because pdqsort is an unstable sort algorithm, set ApproximateSize for this region. pdTests.MustPutRegion(re, cluster, 1, 1, []byte("a"), []byte("b"), core.SetApproximateSize(10)) - expected := map[string]bool{ - "balance-region-scheduler": true, - "balance-leader-scheduler": true, - "balance-hot-region-scheduler": true, - "evict-slow-store-scheduler": true, - } - checkSchedulerCommand(re, cmd, pdAddr, nil, expected) + suite.checkDefaultSchedulers(re, cmd, pdAddr) // case 1: add grant-hot-region-scheduler when balance-hot-region-scheduler is running echo := mustExec(re, cmd, []string{"-u", pdAddr, "scheduler", "add", "grant-hot-region-scheduler", "1", "1,2,3"}, nil) re.Contains(echo, "balance-hot-region-scheduler is running, please remove it first") // case 2: add grant-hot-region-scheduler when balance-hot-region-scheduler is paused - checkSchedulerCommand(re, cmd, pdAddr, []string{"-u", pdAddr, "scheduler", "pause", "balance-hot-region-scheduler", "60"}, map[string]bool{ - "balance-region-scheduler": true, - "balance-leader-scheduler": true, - "balance-hot-region-scheduler": true, - "evict-slow-store-scheduler": true, - }) + echo = mustExec(re, cmd, []string{"-u", pdAddr, "scheduler", "pause", "balance-hot-region-scheduler", "60"}, nil) + re.Contains(echo, "Success!") + suite.checkDefaultSchedulers(re, cmd, pdAddr) echo = mustExec(re, cmd, []string{"-u", pdAddr, "scheduler", "add", "grant-hot-region-scheduler", "1", "1,2,3"}, nil) re.Contains(echo, "balance-hot-region-scheduler is running, please remove it first") @@ -660,12 +651,9 @@ func (suite *schedulerTestSuite) checkGrantLeaderScheduler(cluster *pdTests.Test "evict-slow-store-scheduler": true, }) - checkSchedulerCommand(re, cmd, pdAddr, []string{"-u", pdAddr, "scheduler", "add", "balance-hot-region-scheduler"}, map[string]bool{ - "balance-region-scheduler": true, - "balance-leader-scheduler": true, - "balance-hot-region-scheduler": true, - "evict-slow-store-scheduler": true, - }) + echo = mustExec(re, cmd, []string{"-u", pdAddr, "scheduler", "add", "balance-hot-region-scheduler"}, nil) + re.Contains(echo, "Success!") + suite.checkDefaultSchedulers(re, cmd, pdAddr) } func (suite *schedulerTestSuite) TestHotRegionSchedulerConfig() { @@ -731,14 +719,6 @@ func (suite *schedulerTestSuite) checkHotRegionSchedulerConfig(cluster *pdTests. return reflect.DeepEqual(expect, conf1) }) } - // scheduler show command - expected := map[string]bool{ - "balance-region-scheduler": true, - "balance-leader-scheduler": true, - "balance-hot-region-scheduler": true, - "evict-slow-store-scheduler": true, - } - checkSchedulerCommand(re, cmd, pdAddr, nil, expected) var conf map[string]any mustExec(re, cmd, []string{"-u", pdAddr, "scheduler", "config", "balance-hot-region-scheduler", "list"}, &conf) re.Equal(expected1, conf)