Skip to content

Commit bcace52

Browse files
Merge branch 'release-6.5' into cherry-pick-6123-to-release-6.5
2 parents eacfa79 + 10b691a commit bcace52

File tree

3 files changed

+80
-0
lines changed

3 files changed

+80
-0
lines changed

server/api/region.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"net/url"
2323
"sort"
2424
"strconv"
25+
"strings"
2526

2627
"github.com/gorilla/mux"
2728
"github.com/pingcap/failpoint"
@@ -836,6 +837,64 @@ func (h *regionsHandler) AccelerateRegionsScheduleInRange(w http.ResponseWriter,
836837
h.rd.Text(w, http.StatusOK, fmt.Sprintf("Accelerate regions scheduling in a given range [%s,%s)", rawStartKey, rawEndKey))
837838
}
838839

840+
// @Tags region
841+
// @Summary Accelerate regions scheduling in given ranges, only receive hex format for keys
842+
// @Accept json
843+
// @Param body body object true "json params"
844+
// @Param limit query integer false "Limit count" default(256)
845+
// @Produce json
846+
// @Success 200 {string} string "Accelerate regions scheduling in given ranges [startKey1, endKey1), [startKey2, endKey2), ..."
847+
// @Failure 400 {string} string "The input is invalid."
848+
// @Router /regions/accelerate-schedule/batch [post]
849+
func (h *regionsHandler) AccelerateRegionsScheduleInRanges(w http.ResponseWriter, r *http.Request) {
850+
rc := getCluster(r)
851+
var input []map[string]interface{}
852+
if err := apiutil.ReadJSONRespondError(h.rd, w, r.Body, &input); err != nil {
853+
return
854+
}
855+
limit := 256
856+
if limitStr := r.URL.Query().Get("limit"); limitStr != "" {
857+
var err error
858+
limit, err = strconv.Atoi(limitStr)
859+
if err != nil {
860+
h.rd.JSON(w, http.StatusBadRequest, err.Error())
861+
return
862+
}
863+
}
864+
if limit > maxRegionLimit {
865+
limit = maxRegionLimit
866+
}
867+
var msgBuilder strings.Builder
868+
msgBuilder.Grow(128)
869+
msgBuilder.WriteString("Accelerate regions scheduling in given ranges: ")
870+
regionsIDSet := make(map[uint64]struct{})
871+
for _, rg := range input {
872+
startKey, rawStartKey, err := apiutil.ParseKey("start_key", rg)
873+
if err != nil {
874+
h.rd.JSON(w, http.StatusBadRequest, err.Error())
875+
return
876+
}
877+
endKey, rawEndKey, err := apiutil.ParseKey("end_key", rg)
878+
if err != nil {
879+
h.rd.JSON(w, http.StatusBadRequest, err.Error())
880+
return
881+
}
882+
regions := rc.ScanRegions(startKey, endKey, limit)
883+
for _, region := range regions {
884+
regionsIDSet[region.GetID()] = struct{}{}
885+
}
886+
msgBuilder.WriteString(fmt.Sprintf("[%s,%s), ", rawStartKey, rawEndKey))
887+
}
888+
if len(regionsIDSet) > 0 {
889+
regionsIDList := make([]uint64, 0, len(regionsIDSet))
890+
for id := range regionsIDSet {
891+
regionsIDList = append(regionsIDList, id)
892+
}
893+
rc.AddSuspectRegions(regionsIDList...)
894+
}
895+
h.rd.Text(w, http.StatusOK, msgBuilder.String())
896+
}
897+
839898
func (h *regionsHandler) GetTopNRegions(w http.ResponseWriter, r *http.Request, less func(a, b *core.RegionInfo) bool) {
840899
rc := getCluster(r)
841900
limit := defaultRegionLimit

server/api/region_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,26 @@ func (suite *regionTestSuite) TestAccelerateRegionsScheduleInRange() {
351351
suite.Len(idList, 2)
352352
}
353353

354+
func (suite *regionTestSuite) TestAccelerateRegionsScheduleInRanges() {
355+
re := suite.Require()
356+
r1 := newTestRegionInfo(557, 13, []byte("a1"), []byte("a2"))
357+
r2 := newTestRegionInfo(558, 14, []byte("a2"), []byte("a3"))
358+
r3 := newTestRegionInfo(559, 15, []byte("a3"), []byte("a4"))
359+
r4 := newTestRegionInfo(560, 16, []byte("a4"), []byte("a5"))
360+
r5 := newTestRegionInfo(561, 17, []byte("a5"), []byte("a6"))
361+
mustRegionHeartbeat(re, suite.svr, r1)
362+
mustRegionHeartbeat(re, suite.svr, r2)
363+
mustRegionHeartbeat(re, suite.svr, r3)
364+
mustRegionHeartbeat(re, suite.svr, r4)
365+
mustRegionHeartbeat(re, suite.svr, r5)
366+
body := fmt.Sprintf(`[{"start_key":"%s", "end_key": "%s"}, {"start_key":"%s", "end_key": "%s"}]`, hex.EncodeToString([]byte("a1")), hex.EncodeToString([]byte("a3")), hex.EncodeToString([]byte("a4")), hex.EncodeToString([]byte("a6")))
367+
368+
err := tu.CheckPostJSON(testDialClient, fmt.Sprintf("%s/regions/accelerate-schedule/batch", suite.urlPrefix), []byte(body), tu.StatusOK(re))
369+
suite.NoError(err)
370+
idList := suite.svr.GetRaftCluster().GetSuspectRegions()
371+
suite.Len(idList, 4)
372+
}
373+
354374
func (suite *regionTestSuite) TestScatterRegions() {
355375
re := suite.Require()
356376
r1 := newTestRegionInfo(601, 13, []byte("b1"), []byte("b2"))

server/api/router.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,7 @@ func createRouter(prefix string, svr *server.Server) *mux.Router {
266266
registerFunc(clusterRouter, "/regions/check/hist-keys", regionsHandler.GetKeysHistogram, setMethods(http.MethodGet), setAuditBackend(prometheus))
267267
registerFunc(clusterRouter, "/regions/sibling/{id}", regionsHandler.GetRegionSiblings, setMethods(http.MethodGet), setAuditBackend(prometheus))
268268
registerFunc(clusterRouter, "/regions/accelerate-schedule", regionsHandler.AccelerateRegionsScheduleInRange, setMethods(http.MethodPost), setAuditBackend(localLog, prometheus))
269+
registerFunc(clusterRouter, "/regions/accelerate-schedule/batch", regionsHandler.AccelerateRegionsScheduleInRanges, setMethods(http.MethodPost), setAuditBackend(localLog, prometheus))
269270
registerFunc(clusterRouter, "/regions/scatter", regionsHandler.ScatterRegions, setMethods(http.MethodPost), setAuditBackend(localLog, prometheus))
270271
registerFunc(clusterRouter, "/regions/split", regionsHandler.SplitRegions, setMethods(http.MethodPost), setAuditBackend(localLog, prometheus))
271272
registerFunc(clusterRouter, "/regions/range-holes", regionsHandler.GetRangeHoles, setMethods(http.MethodGet), setAuditBackend(prometheus))

0 commit comments

Comments
 (0)