Skip to content

Commit 2902a08

Browse files
sre-botzz-jason
authored andcommitted
server: handle partitioned table in some http APIs (#11463) (#11466)
1 parent 8497868 commit 2902a08

File tree

2 files changed

+82
-23
lines changed

2 files changed

+82
-23
lines changed

server/http_handler.go

+61-22
Original file line numberDiff line numberDiff line change
@@ -482,14 +482,32 @@ type RegionDetail struct {
482482
func (rt *RegionDetail) addTableInRange(dbName string, curTable *model.TableInfo, r *helper.RegionFrameRange) {
483483
tName := curTable.Name.String()
484484
tID := curTable.ID
485-
485+
pi := curTable.GetPartitionInfo()
486486
for _, index := range curTable.Indices {
487-
if f := r.GetIndexFrame(tID, index.ID, dbName, tName, index.Name.String()); f != nil {
488-
rt.Frames = append(rt.Frames, f)
487+
if pi != nil {
488+
for _, def := range pi.Definitions {
489+
if f := r.GetIndexFrame(def.ID, index.ID, dbName, fmt.Sprintf("%s(%s)", tName, def.Name.O), index.Name.String()); f != nil {
490+
rt.Frames = append(rt.Frames, f)
491+
}
492+
}
493+
} else {
494+
if f := r.GetIndexFrame(tID, index.ID, dbName, tName, index.Name.String()); f != nil {
495+
rt.Frames = append(rt.Frames, f)
496+
}
489497
}
498+
490499
}
491-
if f := r.GetRecordFrame(tID, dbName, tName); f != nil {
492-
rt.Frames = append(rt.Frames, f)
500+
501+
if pi != nil {
502+
for _, def := range pi.Definitions {
503+
if f := r.GetRecordFrame(def.ID, dbName, fmt.Sprintf("%s(%s)", tName, def.Name.O)); f != nil {
504+
rt.Frames = append(rt.Frames, f)
505+
}
506+
}
507+
} else {
508+
if f := r.GetRecordFrame(tID, dbName, tName); f != nil {
509+
rt.Frames = append(rt.Frames, f)
510+
}
493511
}
494512
}
495513

@@ -916,18 +934,43 @@ func (h tableHandler) handleStopScatterTableRequest(schema infoschema.InfoSchema
916934
}
917935

918936
func (h tableHandler) handleRegionRequest(schema infoschema.InfoSchema, tbl table.Table, w http.ResponseWriter, req *http.Request) {
919-
tableID := tbl.Meta().ID
920-
// for record
921-
startKey, endKey := tablecodec.GetTableHandleKeyRange(tableID)
922-
recordRegionIDs, err := h.RegionCache.ListRegionIDsInKeyRange(tikv.NewBackoffer(context.Background(), 500), startKey, endKey)
937+
pi := tbl.Meta().GetPartitionInfo()
938+
if pi != nil {
939+
// Partitioned table.
940+
var data []*TableRegions
941+
for _, def := range pi.Definitions {
942+
tableRegions, err := h.getRegionsByID(tbl, def.ID, def.Name.O)
943+
if err != nil {
944+
writeError(w, err)
945+
return
946+
}
947+
948+
data = append(data, tableRegions)
949+
}
950+
writeData(w, data)
951+
return
952+
}
953+
954+
meta := tbl.Meta()
955+
tableRegions, err := h.getRegionsByID(tbl, meta.ID, meta.Name.O)
923956
if err != nil {
924957
writeError(w, err)
925958
return
926959
}
960+
961+
writeData(w, tableRegions)
962+
}
963+
964+
func (h tableHandler) getRegionsByID(tbl table.Table, id int64, name string) (*TableRegions, error) {
965+
// for record
966+
startKey, endKey := tablecodec.GetTableHandleKeyRange(id)
967+
recordRegionIDs, err := h.RegionCache.ListRegionIDsInKeyRange(tikv.NewBackoffer(context.Background(), 500), startKey, endKey)
968+
if err != nil {
969+
return nil, err
970+
}
927971
recordRegions, err := h.getRegionsMeta(recordRegionIDs)
928972
if err != nil {
929-
writeError(w, err)
930-
return
973+
return nil, err
931974
}
932975

933976
// for indices
@@ -936,27 +979,23 @@ func (h tableHandler) handleRegionRequest(schema infoschema.InfoSchema, tbl tabl
936979
indexID := index.Meta().ID
937980
indices[i].Name = index.Meta().Name.String()
938981
indices[i].ID = indexID
939-
startKey, endKey := tablecodec.GetTableIndexKeyRange(tableID, indexID)
982+
startKey, endKey := tablecodec.GetTableIndexKeyRange(id, indexID)
940983
rIDs, err := h.RegionCache.ListRegionIDsInKeyRange(tikv.NewBackoffer(context.Background(), 500), startKey, endKey)
941984
if err != nil {
942-
writeError(w, err)
943-
return
985+
return nil, err
944986
}
945987
indices[i].Regions, err = h.getRegionsMeta(rIDs)
946988
if err != nil {
947-
writeError(w, err)
948-
return
989+
return nil, err
949990
}
950991
}
951992

952-
tableRegions := &TableRegions{
953-
TableName: tbl.Meta().Name.O,
954-
TableID: tableID,
993+
return &TableRegions{
994+
TableName: name,
995+
TableID: id,
955996
Indices: indices,
956997
RecordRegions: recordRegions,
957-
}
958-
959-
writeData(w, tableRegions)
998+
}, nil
960999
}
9611000

9621001
// pdRegionStats is the json response from PD.

server/http_handler_test.go

+21-1
Original file line numberDiff line numberDiff line change
@@ -204,13 +204,28 @@ func regionContainsTable(c *C, regionID uint64, tableID int64) bool {
204204
return false
205205
}
206206

207-
func (ts *HTTPHandlerTestSuite) TestListTableRegionsWithError(c *C) {
207+
func (ts *HTTPHandlerTestSuite) TestListTableRegions(c *C) {
208208
ts.startServer(c)
209209
defer ts.stopServer(c)
210+
ts.prepareData(c)
211+
// Test list table regions with error
210212
resp, err := http.Get("http://127.0.0.1:10090/tables/fdsfds/aaa/regions")
211213
c.Assert(err, IsNil)
212214
defer resp.Body.Close()
213215
c.Assert(resp.StatusCode, Equals, http.StatusBadRequest)
216+
217+
resp, err = http.Get("http://127.0.0.1:10090/tables/tidb/pt/regions")
218+
c.Assert(err, IsNil)
219+
defer resp.Body.Close()
220+
221+
var data []*TableRegions
222+
dec := json.NewDecoder(resp.Body)
223+
err = dec.Decode(&data)
224+
c.Assert(err, IsNil)
225+
226+
region := data[1]
227+
resp, err = http.Get(fmt.Sprintf("http://127.0.0.1:10090/regions/%d", region.TableID))
228+
c.Assert(err, IsNil)
214229
}
215230

216231
func (ts *HTTPHandlerTestSuite) TestGetRegionByIDWithError(c *C) {
@@ -305,6 +320,11 @@ func (ts *HTTPHandlerTestSuite) prepareData(c *C) {
305320
c.Assert(err, IsNil)
306321
dbt.mustExec("alter table tidb.test add index idx1 (a, b);")
307322
dbt.mustExec("alter table tidb.test add unique index idx2 (a, b);")
323+
324+
dbt.mustExec(`create table tidb.pt (a int) partition by range (a)
325+
(partition p0 values less than (256),
326+
partition p1 values less than (512),
327+
partition p2 values less than (1024))`)
308328
}
309329

310330
func decodeKeyMvcc(closer io.ReadCloser, c *C, valid bool) {

0 commit comments

Comments
 (0)