Skip to content

Commit 5c7db35

Browse files
authored
resource_control: init default resource group without ddl (#42478)
close #42403
1 parent 273763b commit 5c7db35

File tree

9 files changed

+110
-40
lines changed

9 files changed

+110
-40
lines changed

ddl/resourcegrouptest/resource_group_test.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,6 @@ func TestResourceGroupBasic(t *testing.T) {
5151
hook.OnJobUpdatedExported.Store(&onJobUpdatedExportedFunc)
5252
dom.DDL().SetHook(hook)
5353

54-
tk.MustQuery("select * from information_schema.resource_groups where name = 'default'").Check(testkit.Rows("default 1000000 MEDIUM YES"))
55-
5654
tk.MustExec("set global tidb_enable_resource_control = 'off'")
5755
tk.MustGetErrCode("create user usr1 resource group rg1", mysql.ErrResourceGroupSupportDisabled)
5856
tk.MustExec("create user usr1")
@@ -61,8 +59,10 @@ func TestResourceGroupBasic(t *testing.T) {
6159

6260
tk.MustExec("set global tidb_enable_resource_control = 'on'")
6361

64-
tk.MustExec("alter resource group `default` ru_per_sec=10000")
65-
tk.MustQuery("select * from information_schema.resource_groups where name = 'default'").Check(testkit.Rows("default 10000 MEDIUM NO"))
62+
// test default resource group.
63+
tk.MustQuery("select * from information_schema.resource_groups where name = 'default'").Check(testkit.Rows("default 1000000 MEDIUM YES"))
64+
tk.MustExec("alter resource group `default` RU_PER_SEC=1000 PRIORITY=LOW")
65+
tk.MustQuery("select * from information_schema.resource_groups where name = 'default'").Check(testkit.Rows("default 1000 LOW NO"))
6666
tk.MustContainErrMsg("drop resource group `default`", "can't drop reserved resource group")
6767

6868
tk.MustExec("create resource group x RU_PER_SEC=1000")

domain/infosync/info.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -258,10 +258,10 @@ func initPlacementManager(etcdCli *clientv3.Client) PlacementManager {
258258
}
259259

260260
func initResourceGroupManager(pdCli pd.Client) (cli pd.ResourceManagerClient) {
261+
cli = pdCli
261262
if pdCli == nil {
262-
cli = &mockResourceGroupManager{groups: make(map[string]*rmpb.ResourceGroup)}
263+
cli = NewMockResourceGroupManager()
263264
}
264-
cli = pdCli
265265
failpoint.Inject("managerAlreadyCreateSomeGroups", func(val failpoint.Value) {
266266
if val.(bool) {
267267
_, err := cli.AddResourceGroup(context.TODO(),

domain/infosync/resource_group_manager.go

+21
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,27 @@ type mockResourceGroupManager struct {
2828
groups map[string]*rmpb.ResourceGroup
2929
}
3030

31+
// NewMockResourceGroupManager return a mock ResourceManagerClient for test usage.
32+
func NewMockResourceGroupManager() pd.ResourceManagerClient {
33+
mockMgr := &mockResourceGroupManager{
34+
groups: make(map[string]*rmpb.ResourceGroup),
35+
}
36+
mockMgr.groups["default"] = &rmpb.ResourceGroup{
37+
Name: "default",
38+
Mode: rmpb.GroupMode_RUMode,
39+
RUSettings: &rmpb.GroupRequestUnitSettings{
40+
RU: &rmpb.TokenBucket{
41+
Settings: &rmpb.TokenLimitSettings{
42+
FillRate: 1000000,
43+
BurstLimit: -1,
44+
},
45+
},
46+
},
47+
Priority: 8,
48+
}
49+
return mockMgr
50+
}
51+
3152
var _ pd.ResourceManagerClient = (*mockResourceGroupManager)(nil)
3253

3354
func (m *mockResourceGroupManager) ListResourceGroups(ctx context.Context) ([]*rmpb.ResourceGroup, error) {

executor/calibrate_resource.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ type ruConfig struct {
132132
}
133133

134134
func getRUSettings(ctx context.Context, exec sqlexec.RestrictedSQLExecutor) (*ruConfig, error) {
135-
rows, fields, err := exec.ExecRestrictedSQL(ctx, []sqlexec.OptionFuncAlias{sqlexec.ExecOptionUseCurSession}, "SHOW CONFIG WHERE TYPE = 'pd' AND name like 'request_unit.%'")
135+
rows, fields, err := exec.ExecRestrictedSQL(ctx, []sqlexec.OptionFuncAlias{sqlexec.ExecOptionUseCurSession}, "SHOW CONFIG WHERE TYPE = 'pd' AND name like 'controller.request-unit.%'")
136136
if err != nil {
137137
return nil, errors.Trace(err)
138138
}
@@ -155,7 +155,7 @@ func getRUSettings(ctx context.Context, exec sqlexec.RestrictedSQLExecutor) (*ru
155155
if err != nil {
156156
return nil, errors.Trace(err)
157157
}
158-
name, _ := strings.CutPrefix(row.GetString(nameIdx), "request-unit.")
158+
name, _ := strings.CutPrefix(row.GetString(nameIdx), "controller.request-unit.")
159159

160160
switch name {
161161
case "read-base-cost":

executor/calibrate_resource_test.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,11 @@ func TestCalibrateResource(t *testing.T) {
5151
err = rs.Next(context.Background(), rs.NewChunk(nil))
5252
require.ErrorContains(t, err, "PD request-unit config not found")
5353

54-
confItems = append(confItems, strs2Items("pd", "127.0.0.1:2379", "request-unit.read-base-cost", "0.25"))
55-
confItems = append(confItems, strs2Items("pd", "127.0.0.1:2379", "request-unit.read-cost-per-byte", "0.0000152587890625"))
56-
confItems = append(confItems, strs2Items("pd", "127.0.0.1:2379", "request-unit.read-cpu-ms-cost", "0.3333333333333333"))
57-
confItems = append(confItems, strs2Items("pd", "127.0.0.1:2379", "request-unit.write-base-cost", "1"))
58-
confItems = append(confItems, strs2Items("pd", "127.0.0.1:2379", "request-unit.write-cost-per-byte", "0.0009765625"))
54+
confItems = append(confItems, strs2Items("pd", "127.0.0.1:2379", "controller.request-unit.read-base-cost", "0.25"))
55+
confItems = append(confItems, strs2Items("pd", "127.0.0.1:2379", "controller.request-unit.read-cost-per-byte", "0.0000152587890625"))
56+
confItems = append(confItems, strs2Items("pd", "127.0.0.1:2379", "controller.request-unit.read-cpu-ms-cost", "0.3333333333333333"))
57+
confItems = append(confItems, strs2Items("pd", "127.0.0.1:2379", "controller.request-unit.write-base-cost", "1"))
58+
confItems = append(confItems, strs2Items("pd", "127.0.0.1:2379", "controller.request-unit.write-cost-per-byte", "0.0009765625"))
5959

6060
// empty metrics error
6161
rs, err = tk.Exec("CALIBRATE RESOURCE")

meta/meta.go

+33-2
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,20 @@ var (
7777
mPolicyMagicByte = CurrentMagicByteVer
7878
mDDLTableVersion = []byte("DDLTableVersion")
7979
mMetaDataLock = []byte("metadataLock")
80+
// the id for 'default' group, the internal ddl can ensure
81+
// user created resource group won't duplicate with this id.
82+
defaultGroupID = int64(1)
83+
// the default meta of the `default` group
84+
defaultRGroupMeta = &model.ResourceGroupInfo{
85+
ResourceGroupSettings: &model.ResourceGroupSettings{
86+
RURate: 1000000,
87+
BurstLimit: -1,
88+
Priority: model.MediumPriorityValue,
89+
},
90+
ID: defaultGroupID,
91+
Name: model.NewCIStr("default"),
92+
State: model.StatePublic,
93+
}
8094
)
8195

8296
const (
@@ -559,8 +573,11 @@ func (m *Meta) AddResourceGroup(group *model.ResourceGroupInfo) error {
559573
// UpdateResourceGroup updates a resource group.
560574
func (m *Meta) UpdateResourceGroup(group *model.ResourceGroupInfo) error {
561575
groupKey := m.resourceGroupKey(group.ID)
562-
if err := m.checkResourceGroupExists(groupKey); err != nil {
563-
return errors.Trace(err)
576+
// do not check the default because it may not be persisted.
577+
if group.ID != defaultGroupID {
578+
if err := m.checkResourceGroupExists(groupKey); err != nil {
579+
return errors.Trace(err)
580+
}
564581
}
565582

566583
data, err := json.Marshal(group)
@@ -964,6 +981,7 @@ func (m *Meta) ListResourceGroups() ([]*model.ResourceGroupInfo, error) {
964981
return nil, errors.Trace(err)
965982
}
966983

984+
hasDefault := false
967985
groups := make([]*model.ResourceGroupInfo, 0, len(res))
968986
for _, r := range res {
969987
value, err := detachMagicByte(r.Value)
@@ -976,10 +994,19 @@ func (m *Meta) ListResourceGroups() ([]*model.ResourceGroupInfo, error) {
976994
return nil, errors.Trace(err)
977995
}
978996
groups = append(groups, group)
997+
hasDefault = hasDefault || (group.Name.L == "default")
998+
}
999+
if !hasDefault {
1000+
groups = append(groups, defaultRGroupMeta)
9791001
}
9801002
return groups, nil
9811003
}
9821004

1005+
// DefaultGroupMeta4Test return the default group info for test usage.
1006+
func DefaultGroupMeta4Test() *model.ResourceGroupInfo {
1007+
return defaultRGroupMeta
1008+
}
1009+
9831010
// GetResourceGroup gets the database value with ID.
9841011
func (m *Meta) GetResourceGroup(groupID int64) (*model.ResourceGroupInfo, error) {
9851012
groupKey := m.resourceGroupKey(groupID)
@@ -988,6 +1015,10 @@ func (m *Meta) GetResourceGroup(groupID int64) (*model.ResourceGroupInfo, error)
9881015
return nil, errors.Trace(err)
9891016
}
9901017
if value == nil {
1018+
// the default group is not persistanted to tikv by default.
1019+
if groupID == defaultGroupID {
1020+
return defaultRGroupMeta, nil
1021+
}
9911022
return nil, ErrResourceGroupNotExists.GenWithStack("resource group id : %d doesn't exist", groupID)
9921023
}
9931024

meta/meta_test.go

+13-4
Original file line numberDiff line numberDiff line change
@@ -114,15 +114,20 @@ func TestResourceGroup(t *testing.T) {
114114

115115
// test the independent policy ID allocation.
116116
m := meta.NewMeta(txn)
117+
groups, err := m.ListResourceGroups()
118+
require.NoError(t, err)
119+
require.Equal(t, len(groups), 1)
120+
require.Equal(t, groups[0], meta.DefaultGroupMeta4Test())
117121

122+
groupID := int64(2)
118123
checkResourceGroup := func(ru uint64) {
119-
rg, err := m.GetResourceGroup(1)
124+
rg, err := m.GetResourceGroup(groupID)
120125
require.NoError(t, err)
121126
require.Equal(t, rg.RURate, ru)
122127
}
123128

124129
rg := &model.ResourceGroupInfo{
125-
ID: 1,
130+
ID: groupID,
126131
Name: model.NewCIStr("aa"),
127132
ResourceGroupSettings: &model.ResourceGroupSettings{
128133
RURate: 100,
@@ -131,12 +136,16 @@ func TestResourceGroup(t *testing.T) {
131136
require.NoError(t, m.AddResourceGroup(rg))
132137
checkResourceGroup(100)
133138

139+
groups, err = m.ListResourceGroups()
140+
require.NoError(t, err)
141+
require.Equal(t, len(groups), 2)
142+
134143
rg.RURate = 200
135144
require.NoError(t, m.UpdateResourceGroup(rg))
136145
checkResourceGroup(200)
137146

138-
m.DropResourceGroup(1)
139-
_, err = m.GetResourceGroup(1)
147+
m.DropResourceGroup(groupID)
148+
_, err = m.GetResourceGroup(groupID)
140149
require.Error(t, err)
141150
}
142151

session/bootstrap.go

+1-9
Original file line numberDiff line numberDiff line change
@@ -564,9 +564,6 @@ const (
564564
key(state)
565565
);`
566566

567-
// CreateDefaultResourceGroup is the statement to create the default resource group
568-
CreateDefaultResourceGroup = "CREATE RESOURCE GROUP IF NOT EXISTS `default` RU_PER_SEC=1000000 BURSTABLE;"
569-
570567
// CreateLoadDataJobs is a table that LOAD DATA uses
571568
CreateLoadDataJobs = `CREATE TABLE IF NOT EXISTS mysql.load_data_jobs (
572569
job_id bigint(64) NOT NULL AUTO_INCREMENT,
@@ -2411,10 +2408,7 @@ func upgradeToVer136(s Session, ver int64) {
24112408
}
24122409

24132410
func upgradeToVer137(s Session, ver int64) {
2414-
if ver >= version137 {
2415-
return
2416-
}
2417-
doReentrantDDL(s, CreateDefaultResourceGroup)
2411+
// NOOP, we don't depend on ddl to init the default group due to backward compatible issue.
24182412
}
24192413

24202414
// For users that upgrade TiDB from a version below 7.0, we want to enable tidb tidb_enable_null_aware_anti_join by default.
@@ -2544,8 +2538,6 @@ func doDDLWorks(s Session) {
25442538
mustExecute(s, CreateTTLJobHistory)
25452539
// Create tidb_global_task table
25462540
mustExecute(s, CreateGlobalTask)
2547-
// Create default resource group
2548-
mustExecute(s, CreateDefaultResourceGroup)
25492541
// Create load_data_jobs
25502542
mustExecute(s, CreateLoadDataJobs)
25512543
}

store/mockstore/unistore/pd.go

+29-12
Original file line numberDiff line numberDiff line change
@@ -40,23 +40,40 @@ type pdClient struct {
4040
gcSafePointMu sync.Mutex
4141
globalConfig map[string]string
4242
externalTimestamp atomic.Uint64
43-
resourceGroupManager struct {
44-
sync.RWMutex
45-
groups map[string]*rmpb.ResourceGroup
43+
resourceGroupManager *resourceGroupManager
44+
}
45+
46+
type resourceGroupManager struct {
47+
sync.RWMutex
48+
groups map[string]*rmpb.ResourceGroup
49+
}
50+
51+
func newResourceGroupManager() *resourceGroupManager {
52+
mgr := &resourceGroupManager{
53+
groups: make(map[string]*rmpb.ResourceGroup),
4654
}
55+
mgr.groups["default"] = &rmpb.ResourceGroup{
56+
Name: "default",
57+
Mode: rmpb.GroupMode_RUMode,
58+
RUSettings: &rmpb.GroupRequestUnitSettings{
59+
RU: &rmpb.TokenBucket{
60+
Settings: &rmpb.TokenLimitSettings{
61+
FillRate: 1000000,
62+
BurstLimit: -1,
63+
},
64+
},
65+
},
66+
Priority: 8,
67+
}
68+
return mgr
4769
}
4870

4971
func newPDClient(pd *us.MockPD) *pdClient {
5072
return &pdClient{
51-
MockPD: pd,
52-
serviceSafePoints: make(map[string]uint64),
53-
globalConfig: make(map[string]string),
54-
resourceGroupManager: struct {
55-
sync.RWMutex
56-
groups map[string]*rmpb.ResourceGroup
57-
}{
58-
groups: make(map[string]*rmpb.ResourceGroup),
59-
},
73+
MockPD: pd,
74+
serviceSafePoints: make(map[string]uint64),
75+
globalConfig: make(map[string]string),
76+
resourceGroupManager: newResourceGroupManager(),
6077
}
6178
}
6279

0 commit comments

Comments
 (0)