Skip to content

Commit 3d92e8c

Browse files
authored
store/helper, executor: fix keyspace-aware region-to-table mapping (pingcap#66194) (pingcap#67505)
close pingcap#22225
1 parent 5ec8168 commit 3d92e8c

4 files changed

Lines changed: 202 additions & 49 deletions

File tree

pkg/executor/hot_regions_history_table_test.go

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -196,21 +196,22 @@ func TestTiDBHotRegionsHistory(t *testing.T) {
196196
}
197197

198198
mockDB := &model.DBInfo{}
199+
storeCodec := s.store.(helper.Storage).GetCodec()
199200
pdResps := []map[string]*executor.HistoryHotRegions{
200201
{
201202
core.HotRegionTypeRead: {
202203
HistoryHotRegion: []*executor.HistoryHotRegion{
203204
// mysql table_id = 11, table_name = TABLES_PRIV
204205
{UpdateTime: unixTimeMs("2019-10-10 10:10:11"), RegionID: 1, StoreID: 1, PeerID: 11111, IsLearner: false,
205206
IsLeader: true, HotRegionType: "READ", HotDegree: 99, FlowBytes: 99, KeyRate: 99, QueryRate: 99,
206-
StartKey: helper.NewTableWithKeyRange(mockDB, &model.TableInfo{ID: tablesPrivTid}).StartKey,
207-
EndKey: helper.NewTableWithKeyRange(mockDB, &model.TableInfo{ID: tablesPrivTid}).EndKey,
207+
StartKey: helper.NewTableWithKeyRange(mockDB, &model.TableInfo{ID: tablesPrivTid}, storeCodec).StartKey,
208+
EndKey: helper.NewTableWithKeyRange(mockDB, &model.TableInfo{ID: tablesPrivTid}, storeCodec).EndKey,
208209
},
209210
// mysql table_id = 21, table_name = STATS_META
210211
{UpdateTime: unixTimeMs("2019-10-10 10:10:13"), RegionID: 3, StoreID: 3, PeerID: 33333, IsLearner: false,
211212
IsLeader: true, HotRegionType: "READ", HotDegree: 99, FlowBytes: 99, KeyRate: 99, QueryRate: 99,
212-
StartKey: helper.NewTableWithKeyRange(mockDB, &model.TableInfo{ID: statsMetaTid}).StartKey,
213-
EndKey: helper.NewTableWithKeyRange(mockDB, &model.TableInfo{ID: statsMetaTid}).EndKey,
213+
StartKey: helper.NewTableWithKeyRange(mockDB, &model.TableInfo{ID: statsMetaTid}, storeCodec).StartKey,
214+
EndKey: helper.NewTableWithKeyRange(mockDB, &model.TableInfo{ID: statsMetaTid}, storeCodec).EndKey,
214215
},
215216
},
216217
},
@@ -219,14 +220,14 @@ func TestTiDBHotRegionsHistory(t *testing.T) {
219220
// mysql table_id = 11, table_name = TABLES_PRIV
220221
{UpdateTime: unixTimeMs("2019-10-10 10:10:12"), RegionID: 2, StoreID: 2, PeerID: 22222, IsLearner: false,
221222
IsLeader: false, HotRegionType: "WRITE", HotDegree: 99, FlowBytes: 99, KeyRate: 99, QueryRate: 99,
222-
StartKey: helper.NewTableWithKeyRange(mockDB, &model.TableInfo{ID: tablesPrivTid}).StartKey,
223-
EndKey: helper.NewTableWithKeyRange(mockDB, &model.TableInfo{ID: tablesPrivTid}).EndKey,
223+
StartKey: helper.NewTableWithKeyRange(mockDB, &model.TableInfo{ID: tablesPrivTid}, storeCodec).StartKey,
224+
EndKey: helper.NewTableWithKeyRange(mockDB, &model.TableInfo{ID: tablesPrivTid}, storeCodec).EndKey,
224225
},
225226
// mysql table_id = 21, table_name = STATS_META
226227
{UpdateTime: unixTimeMs("2019-10-10 10:10:14"), RegionID: 4, StoreID: 4, PeerID: 44444, IsLearner: false,
227228
IsLeader: false, HotRegionType: "WRITE", HotDegree: 99, FlowBytes: 99, KeyRate: 99, QueryRate: 99,
228-
StartKey: helper.NewTableWithKeyRange(mockDB, &model.TableInfo{ID: statsMetaTid}).StartKey,
229-
EndKey: helper.NewTableWithKeyRange(mockDB, &model.TableInfo{ID: statsMetaTid}).EndKey,
229+
StartKey: helper.NewTableWithKeyRange(mockDB, &model.TableInfo{ID: statsMetaTid}, storeCodec).StartKey,
230+
EndKey: helper.NewTableWithKeyRange(mockDB, &model.TableInfo{ID: statsMetaTid}, storeCodec).EndKey,
230231
},
231232
},
232233
},
@@ -237,14 +238,14 @@ func TestTiDBHotRegionsHistory(t *testing.T) {
237238
// table_id = 1313, deleted schema
238239
{UpdateTime: unixTimeMs("2019-10-10 10:10:15"), RegionID: 5, StoreID: 5, PeerID: 55555, IsLearner: false,
239240
IsLeader: true, HotRegionType: "READ", HotDegree: 99, FlowBytes: 99, KeyRate: 99, QueryRate: 99,
240-
StartKey: helper.NewTableWithKeyRange(mockDB, &model.TableInfo{ID: 1313}).StartKey,
241-
EndKey: helper.NewTableWithKeyRange(mockDB, &model.TableInfo{ID: 1313}).EndKey,
241+
StartKey: helper.NewTableWithKeyRange(mockDB, &model.TableInfo{ID: 1313}, storeCodec).StartKey,
242+
EndKey: helper.NewTableWithKeyRange(mockDB, &model.TableInfo{ID: 1313}, storeCodec).EndKey,
242243
},
243244
// mysql table_id = 11, index_id = 1, table_name = TABLES_PRIV, index_name = PRIMARY
244245
{UpdateTime: unixTimeMs("2019-10-10 10:10:17"), RegionID: 1, StoreID: 1, PeerID: 11111, IsLearner: false,
245246
IsLeader: true, HotRegionType: "READ", HotDegree: 99, FlowBytes: 99, KeyRate: 99, QueryRate: 99,
246-
StartKey: helper.NewIndexWithKeyRange(mockDB, &model.TableInfo{ID: tablesPrivTid}, &model.IndexInfo{ID: 1}).StartKey,
247-
EndKey: helper.NewIndexWithKeyRange(mockDB, &model.TableInfo{ID: tablesPrivTid}, &model.IndexInfo{ID: 1}).EndKey,
247+
StartKey: helper.NewIndexWithKeyRange(mockDB, &model.TableInfo{ID: tablesPrivTid}, &model.IndexInfo{ID: 1}, storeCodec).StartKey,
248+
EndKey: helper.NewIndexWithKeyRange(mockDB, &model.TableInfo{ID: tablesPrivTid}, &model.IndexInfo{ID: 1}, storeCodec).EndKey,
248249
},
249250
},
250251
},
@@ -253,14 +254,14 @@ func TestTiDBHotRegionsHistory(t *testing.T) {
253254
// table_id = 1313, deleted schema
254255
{UpdateTime: unixTimeMs("2019-10-10 10:10:16"), RegionID: 6, StoreID: 6, PeerID: 66666, IsLearner: false,
255256
IsLeader: false, HotRegionType: "WRITE", HotDegree: 99, FlowBytes: 99, KeyRate: 99, QueryRate: 99,
256-
StartKey: helper.NewTableWithKeyRange(mockDB, &model.TableInfo{ID: 1313}).StartKey,
257-
EndKey: helper.NewTableWithKeyRange(mockDB, &model.TableInfo{ID: 1313}).EndKey,
257+
StartKey: helper.NewTableWithKeyRange(mockDB, &model.TableInfo{ID: 1313}, storeCodec).StartKey,
258+
EndKey: helper.NewTableWithKeyRange(mockDB, &model.TableInfo{ID: 1313}, storeCodec).EndKey,
258259
},
259260
// mysql table_id = 11, index_id = 1, table_name = TABLES_PRIV, index_name = PRIMARY
260261
{UpdateTime: unixTimeMs("2019-10-10 10:10:18"), RegionID: 2, StoreID: 2, PeerID: 22222, IsLearner: false,
261262
IsLeader: false, HotRegionType: "WRITE", HotDegree: 99, FlowBytes: 99, KeyRate: 99, QueryRate: 99,
262-
StartKey: helper.NewIndexWithKeyRange(mockDB, &model.TableInfo{ID: tablesPrivTid}, &model.IndexInfo{ID: 1}).StartKey,
263-
EndKey: helper.NewIndexWithKeyRange(mockDB, &model.TableInfo{ID: tablesPrivTid}, &model.IndexInfo{ID: 1}).EndKey,
263+
StartKey: helper.NewIndexWithKeyRange(mockDB, &model.TableInfo{ID: tablesPrivTid}, &model.IndexInfo{ID: 1}, storeCodec).StartKey,
264+
EndKey: helper.NewIndexWithKeyRange(mockDB, &model.TableInfo{ID: tablesPrivTid}, &model.IndexInfo{ID: 1}, storeCodec).EndKey,
264265
},
265266
},
266267
},
@@ -271,20 +272,20 @@ func TestTiDBHotRegionsHistory(t *testing.T) {
271272
// mysql table_id = 21 ,index_id = 1, table_name = STATS_META, index_name = IDX_VER
272273
{UpdateTime: unixTimeMs("2019-10-10 10:10:19"), RegionID: 3, StoreID: 3, PeerID: 33333, IsLearner: false,
273274
IsLeader: true, HotRegionType: "READ", HotDegree: 99, FlowBytes: 99, KeyRate: 99, QueryRate: 99,
274-
StartKey: helper.NewIndexWithKeyRange(mockDB, &model.TableInfo{ID: statsMetaTid}, &model.IndexInfo{ID: 1}).StartKey,
275-
EndKey: helper.NewIndexWithKeyRange(mockDB, &model.TableInfo{ID: statsMetaTid}, &model.IndexInfo{ID: 1}).EndKey,
275+
StartKey: helper.NewIndexWithKeyRange(mockDB, &model.TableInfo{ID: statsMetaTid}, &model.IndexInfo{ID: 1}, storeCodec).StartKey,
276+
EndKey: helper.NewIndexWithKeyRange(mockDB, &model.TableInfo{ID: statsMetaTid}, &model.IndexInfo{ID: 1}, storeCodec).EndKey,
276277
},
277278
// mysql table_id = 21 ,index_id = 2, table_name = STATS_META, index_name = TBL
278279
{UpdateTime: unixTimeMs("2019-10-10 10:10:21"), RegionID: 5, StoreID: 5, PeerID: 55555, IsLearner: false,
279280
IsLeader: true, HotRegionType: "READ", HotDegree: 99, FlowBytes: 99, KeyRate: 99, QueryRate: 99,
280-
StartKey: helper.NewIndexWithKeyRange(mockDB, &model.TableInfo{ID: statsMetaTid}, &model.IndexInfo{ID: 2}).StartKey,
281-
EndKey: helper.NewIndexWithKeyRange(mockDB, &model.TableInfo{ID: statsMetaTid}, &model.IndexInfo{ID: 2}).EndKey,
281+
StartKey: helper.NewIndexWithKeyRange(mockDB, &model.TableInfo{ID: statsMetaTid}, &model.IndexInfo{ID: 2}, storeCodec).StartKey,
282+
EndKey: helper.NewIndexWithKeyRange(mockDB, &model.TableInfo{ID: statsMetaTid}, &model.IndexInfo{ID: 2}, storeCodec).EndKey,
282283
},
283284
// table_id = 1313, index_id = 1, deleted schema
284285
{UpdateTime: unixTimeMs("2019-10-10 10:10:23"), RegionID: 7, StoreID: 7, PeerID: 77777, IsLeader: true,
285286
HotRegionType: "READ", HotDegree: 99, FlowBytes: 99, KeyRate: 99, QueryRate: 99,
286-
StartKey: helper.NewIndexWithKeyRange(mockDB, &model.TableInfo{ID: 1313}, &model.IndexInfo{ID: 1}).StartKey,
287-
EndKey: helper.NewIndexWithKeyRange(mockDB, &model.TableInfo{ID: 1313}, &model.IndexInfo{ID: 1}).EndKey,
287+
StartKey: helper.NewIndexWithKeyRange(mockDB, &model.TableInfo{ID: 1313}, &model.IndexInfo{ID: 1}, storeCodec).StartKey,
288+
EndKey: helper.NewIndexWithKeyRange(mockDB, &model.TableInfo{ID: 1313}, &model.IndexInfo{ID: 1}, storeCodec).EndKey,
288289
},
289290
},
290291
},
@@ -293,20 +294,20 @@ func TestTiDBHotRegionsHistory(t *testing.T) {
293294
// mysql table_id = 21 ,index_id = 1, table_name = STATS_META, index_name = IDX_VER
294295
{UpdateTime: unixTimeMs("2019-10-10 10:10:20"), RegionID: 4, StoreID: 4, PeerID: 44444, IsLearner: false,
295296
IsLeader: false, HotRegionType: "WRITE", HotDegree: 99, FlowBytes: 99, KeyRate: 99, QueryRate: 99,
296-
StartKey: helper.NewIndexWithKeyRange(mockDB, &model.TableInfo{ID: statsMetaTid}, &model.IndexInfo{ID: 1}).StartKey,
297-
EndKey: helper.NewIndexWithKeyRange(mockDB, &model.TableInfo{ID: statsMetaTid}, &model.IndexInfo{ID: 1}).EndKey,
297+
StartKey: helper.NewIndexWithKeyRange(mockDB, &model.TableInfo{ID: statsMetaTid}, &model.IndexInfo{ID: 1}, storeCodec).StartKey,
298+
EndKey: helper.NewIndexWithKeyRange(mockDB, &model.TableInfo{ID: statsMetaTid}, &model.IndexInfo{ID: 1}, storeCodec).EndKey,
298299
},
299300
// mysql table_id = 21 ,index_id = 2, table_name = STATS_META, index_name = TBL
300301
{UpdateTime: unixTimeMs("2019-10-10 10:10:22"), RegionID: 6, StoreID: 6, PeerID: 66666, IsLearner: false,
301302
IsLeader: false, HotRegionType: "WRITE", HotDegree: 99, FlowBytes: 99, KeyRate: 99, QueryRate: 99,
302-
StartKey: helper.NewIndexWithKeyRange(mockDB, &model.TableInfo{ID: statsMetaTid}, &model.IndexInfo{ID: 2}).StartKey,
303-
EndKey: helper.NewIndexWithKeyRange(mockDB, &model.TableInfo{ID: statsMetaTid}, &model.IndexInfo{ID: 2}).EndKey,
303+
StartKey: helper.NewIndexWithKeyRange(mockDB, &model.TableInfo{ID: statsMetaTid}, &model.IndexInfo{ID: 2}, storeCodec).StartKey,
304+
EndKey: helper.NewIndexWithKeyRange(mockDB, &model.TableInfo{ID: statsMetaTid}, &model.IndexInfo{ID: 2}, storeCodec).EndKey,
304305
},
305306
// table_id = 1313, index_id = 1, deleted schema
306307
{UpdateTime: unixTimeMs("2019-10-10 10:10:24"), RegionID: 8, StoreID: 8, PeerID: 88888, IsLearner: false,
307308
IsLeader: false, HotRegionType: "WRITE", HotDegree: 99, FlowBytes: 99, KeyRate: 99, QueryRate: 99,
308-
StartKey: helper.NewIndexWithKeyRange(mockDB, &model.TableInfo{ID: 1313}, &model.IndexInfo{ID: 1}).StartKey,
309-
EndKey: helper.NewIndexWithKeyRange(mockDB, &model.TableInfo{ID: 1313}, &model.IndexInfo{ID: 1}).EndKey,
309+
StartKey: helper.NewIndexWithKeyRange(mockDB, &model.TableInfo{ID: 1313}, &model.IndexInfo{ID: 1}, storeCodec).StartKey,
310+
EndKey: helper.NewIndexWithKeyRange(mockDB, &model.TableInfo{ID: 1313}, &model.IndexInfo{ID: 1}, storeCodec).EndKey,
310311
},
311312
},
312313
},
@@ -495,7 +496,7 @@ func TestTiDBHotRegionsHistory(t *testing.T) {
495496
result := tk.MustQuery(sql)
496497
warnings := tk.Session().GetSessionVars().StmtCtx.GetWarnings()
497498
require.Len(t, warnings, 0, fmt.Sprintf("unexpected warnings: %+v, sql: %s", warnings, sql))
498-
var expected []string
499+
expected := make([]string, 0, len(cas.expected))
499500
for _, row := range cas.expected {
500501
expectedRow := row
501502
expected = append(expected, strings.Join(expectedRow, " "))

pkg/store/helper/BUILD.bazel

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ go_test(
3636
],
3737
embed = [":helper"],
3838
flaky = True,
39-
shard_count = 6,
39+
shard_count = 8,
4040
deps = [
4141
"//pkg/config/kerneltype",
4242
"//pkg/infoschema/context",
@@ -48,6 +48,7 @@ go_test(
4848
"//pkg/tablecodec",
4949
"//pkg/testkit/testsetup",
5050
"@com_github_gorilla_mux//:mux",
51+
"@com_github_pingcap_kvproto//pkg/keyspacepb",
5152
"@com_github_pingcap_log//:log",
5253
"@com_github_stretchr_testify//require",
5354
"@com_github_tikv_client_go_v2//testutils",

pkg/store/helper/helper.go

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -659,14 +659,16 @@ func (t TableInfoWithKeyRange) GetStartKey() string { return t.StartKey }
659659
// GetEndKey implements `withKeyRange` interface.
660660
func (t TableInfoWithKeyRange) GetEndKey() string { return t.EndKey }
661661

662-
// NewTableWithKeyRange constructs TableInfoWithKeyRange for given table, it is exported only for test.
663-
func NewTableWithKeyRange(db *model.DBInfo, table *model.TableInfo) TableInfoWithKeyRange {
664-
return newTableInfoWithKeyRange(db, table, nil, nil)
662+
// NewTableWithKeyRange constructs TableInfoWithKeyRange for given table with the specified codec.
663+
// It is exported only for test.
664+
func NewTableWithKeyRange(db *model.DBInfo, table *model.TableInfo, regionKeyCodec tikv.Codec) TableInfoWithKeyRange {
665+
return newTableInfoWithKeyRange(db, table, nil, nil, regionKeyCodec)
665666
}
666667

667-
// NewIndexWithKeyRange constructs TableInfoWithKeyRange for given index, it is exported only for test.
668-
func NewIndexWithKeyRange(db *model.DBInfo, table *model.TableInfo, index *model.IndexInfo) TableInfoWithKeyRange {
669-
return newTableInfoWithKeyRange(db, table, nil, index)
668+
// NewIndexWithKeyRange constructs TableInfoWithKeyRange for given index with the specified codec.
669+
// It is exported only for test.
670+
func NewIndexWithKeyRange(db *model.DBInfo, table *model.TableInfo, index *model.IndexInfo, regionKeyCodec tikv.Codec) TableInfoWithKeyRange {
671+
return newTableInfoWithKeyRange(db, table, nil, index, regionKeyCodec)
670672
}
671673

672674
// FilterMemDBs filters memory databases in the input schemas.
@@ -695,7 +697,7 @@ func (h *Helper) GetRegionsTableInfo(regionsInfo *pd.RegionsInfo, is infoschema.
695697
return tableInfos
696698
}
697699

698-
func newTableInfoWithKeyRange(db *model.DBInfo, table *model.TableInfo, partition *model.PartitionDefinition, index *model.IndexInfo) TableInfoWithKeyRange {
700+
func newTableInfoWithKeyRange(db *model.DBInfo, table *model.TableInfo, partition *model.PartitionDefinition, index *model.IndexInfo, regionKeyCodec tikv.Codec) TableInfoWithKeyRange {
699701
var sk, ek []byte
700702
if partition == nil && index == nil {
701703
sk, ek = tablecodec.GetTableHandleKeyRange(table.ID)
@@ -706,8 +708,9 @@ func newTableInfoWithKeyRange(db *model.DBInfo, table *model.TableInfo, partitio
706708
} else {
707709
sk, ek = tablecodec.GetTableIndexKeyRange(partition.ID, index.ID)
708710
}
709-
startKey := bytesKeyToHex(codec.EncodeBytes(nil, sk))
710-
endKey := bytesKeyToHex(codec.EncodeBytes(nil, ek))
711+
encodedSk, encodedEk := regionKeyCodec.EncodeRegionRange(sk, ek)
712+
startKey := bytesKeyToHex(encodedSk)
713+
endKey := bytesKeyToHex(encodedEk)
711714
return TableInfoWithKeyRange{
712715
&TableInfo{
713716
DB: db,
@@ -723,29 +726,33 @@ func newTableInfoWithKeyRange(db *model.DBInfo, table *model.TableInfo, partitio
723726
}
724727

725728
// GetTablesInfoWithKeyRange returns a slice containing tableInfos with key ranges of all tables in schemas.
726-
func (*Helper) GetTablesInfoWithKeyRange(is infoschema.SchemaAndTable, filter func([]*model.DBInfo) []*model.DBInfo) []TableInfoWithKeyRange {
729+
func (h *Helper) GetTablesInfoWithKeyRange(is infoschema.SchemaAndTable, filter func([]*model.DBInfo) []*model.DBInfo) []TableInfoWithKeyRange {
727730
tables := []TableInfoWithKeyRange{}
728731
dbInfos := is.AllSchemas()
729732
if filter != nil {
730733
dbInfos = filter(dbInfos)
731734
}
735+
regionKeyCodec := tikv.NewCodecV1(tikv.ModeTxn)
736+
if h.Store != nil {
737+
regionKeyCodec = h.Store.GetCodec()
738+
}
732739
for _, db := range dbInfos {
733740
tableInfos, _ := is.SchemaTableInfos(context.Background(), db.Name)
734741
for _, table := range tableInfos {
735742
if table.Partition != nil {
736743
for i := range table.Partition.Definitions {
737-
tables = append(tables, newTableInfoWithKeyRange(db, table, &table.Partition.Definitions[i], nil))
744+
tables = append(tables, newTableInfoWithKeyRange(db, table, &table.Partition.Definitions[i], nil, regionKeyCodec))
738745
}
739746
} else {
740-
tables = append(tables, newTableInfoWithKeyRange(db, table, nil, nil))
747+
tables = append(tables, newTableInfoWithKeyRange(db, table, nil, nil, regionKeyCodec))
741748
}
742749
for _, index := range table.Indices {
743750
if table.Partition == nil || index.Global {
744-
tables = append(tables, newTableInfoWithKeyRange(db, table, nil, index))
751+
tables = append(tables, newTableInfoWithKeyRange(db, table, nil, index, regionKeyCodec))
745752
continue
746753
}
747754
for i := range table.Partition.Definitions {
748-
tables = append(tables, newTableInfoWithKeyRange(db, table, &table.Partition.Definitions[i], index))
755+
tables = append(tables, newTableInfoWithKeyRange(db, table, &table.Partition.Definitions[i], index, regionKeyCodec))
749756
}
750757
}
751758
}
@@ -822,8 +829,7 @@ func (h *Helper) GetPDRegionStats(ctx context.Context, tableID int64, noIndexSta
822829
startKey = tablecodec.EncodeTablePrefix(tableID)
823830
endKey = kv.Key(startKey).PrefixNext()
824831
}
825-
startKey = codec.EncodeBytes([]byte{}, startKey)
826-
endKey = codec.EncodeBytes([]byte{}, endKey)
832+
startKey, endKey = h.Store.GetCodec().EncodeRegionRange(startKey, endKey)
827833

828834
return pdCli.GetRegionStatusByKeyRange(ctx, pd.NewKeyRange(startKey, endKey), false)
829835
}

0 commit comments

Comments
 (0)