From a86fd29f1f99402cd0bf9c7ea3ece3ee40cbbf61 Mon Sep 17 00:00:00 2001 From: BornChanger <97348524+BornChanger@users.noreply.github.com> Date: Tue, 14 Mar 2023 20:50:39 +0800 Subject: [PATCH] *: visible default resource group (#41606) close pingcap/tidb#40875 --- ddl/ddl_api.go | 9 +++++---- ddl/resourcegroup/errors.go | 2 ++ ddl/resourcegroup/group.go | 1 + ddl/resourcegrouptest/resource_group_test.go | 10 ++++++++-- executor/ddl.go | 6 +++--- session/bootstrap.go | 17 ++++++++++++++++- session/session.go | 2 +- sessionctx/variable/session.go | 3 --- telemetry/data_feature_usage_test.go | 12 ++++++------ 9 files changed, 42 insertions(+), 20 deletions(-) diff --git a/ddl/ddl_api.go b/ddl/ddl_api.go index 9f2179dbc7..ff81c10f70 100644 --- a/ddl/ddl_api.go +++ b/ddl/ddl_api.go @@ -88,6 +88,8 @@ const ( // Once tiflashCheckPendingTablesLimit is reached, we trigger a limiter detection. tiflashCheckPendingTablesLimit = 100 tiflashCheckPendingTablesRetry = 7 + // DefaultResourceGroupName is the default resource group name. + DefaultResourceGroupName = "default" ) func (d *ddl) CreateSchema(ctx sessionctx.Context, stmt *ast.CreateDatabaseStmt) (err error) { @@ -7826,10 +7828,6 @@ func (d *ddl) AddResourceGroup(ctx sessionctx.Context, stmt *ast.CreateResourceG return infoschema.ErrResourceGroupExists.GenWithStackByArgs(groupName) } - if groupName.L == variable.DefaultResourceGroupName { - return errors.Trace(infoschema.ErrReservedSyntax.GenWithStackByArgs(groupName)) - } - if err := d.checkResourceGroupValidation(groupInfo); err != nil { return err } @@ -7860,6 +7858,9 @@ func (d *ddl) checkResourceGroupValidation(groupInfo *model.ResourceGroupInfo) e // DropResourceGroup implements the DDL interface. func (d *ddl) DropResourceGroup(ctx sessionctx.Context, stmt *ast.DropResourceGroupStmt) (err error) { groupName := stmt.ResourceGroupName + if groupName.L == DefaultResourceGroupName { + return resourcegroup.ErrDroppingInternalResourceGroup + } is := d.GetInfoSchemaWithInterceptor(ctx) // Check group existence. group, ok := is.ResourceGroupByName(groupName) diff --git a/ddl/resourcegroup/errors.go b/ddl/resourcegroup/errors.go index 0893f59876..c3ce5ee3d4 100644 --- a/ddl/resourcegroup/errors.go +++ b/ddl/resourcegroup/errors.go @@ -29,4 +29,6 @@ var ( ErrInvalidResourceGroupDuplicatedMode = errors.New("cannot set RU mode and Raw mode options at the same time") // ErrUnknownResourceGroupMode is from group.go. ErrUnknownResourceGroupMode = errors.New("unknown resource group mode") + // ErrDroppingInternalResourceGroup is from group.go + ErrDroppingInternalResourceGroup = errors.New("can't drop reserved resource group") ) diff --git a/ddl/resourcegroup/group.go b/ddl/resourcegroup/group.go index 6e371a501d..9a9626ad19 100644 --- a/ddl/resourcegroup/group.go +++ b/ddl/resourcegroup/group.go @@ -30,6 +30,7 @@ func NewGroupFromOptions(groupName string, options *model.ResourceGroupSettings) if len(groupName) > MaxGroupNameLength { return nil, ErrTooLongResourceGroupName } + group := &rmpb.ResourceGroup{ Name: groupName, } diff --git a/ddl/resourcegrouptest/resource_group_test.go b/ddl/resourcegrouptest/resource_group_test.go index f8a3c8de0f..4554943f61 100644 --- a/ddl/resourcegrouptest/resource_group_test.go +++ b/ddl/resourcegrouptest/resource_group_test.go @@ -50,6 +50,8 @@ func TestResourceGroupBasic(t *testing.T) { hook.OnJobUpdatedExported.Store(&onJobUpdatedExportedFunc) dom.DDL().SetHook(hook) + tk.MustQuery("select * from information_schema.resource_groups where name = 'default'").Check(testkit.Rows("default 1000000 YES")) + tk.MustExec("set global tidb_enable_resource_control = 'off'") tk.MustGetErrCode("create user usr1 resource group rg1", mysql.ErrResourceGroupSupportDisabled) tk.MustExec("create user usr1") @@ -58,6 +60,10 @@ func TestResourceGroupBasic(t *testing.T) { tk.MustExec("set global tidb_enable_resource_control = 'on'") + tk.MustExec("alter resource group `default` ru_per_sec=10000") + tk.MustQuery("select * from information_schema.resource_groups where name = 'default'").Check(testkit.Rows("default 10000 NO")) + tk.MustContainErrMsg("drop resource group `default`", "can't drop reserved resource group") + tk.MustExec("create resource group x RU_PER_SEC=1000") checkFunc := func(groupInfo *model.ResourceGroupInfo) { require.Equal(t, true, groupInfo.ID != 0) @@ -135,7 +141,7 @@ func TestResourceGroupBasic(t *testing.T) { tk.MustGetErrCode("create resource group x burstable, ru_per_sec=1000, burstable", mysql.ErrParse) tk.MustContainErrMsg("create resource group x burstable, ru_per_sec=1000, burstable", "Dupliated options specified") groups, err := infosync.ListResourceGroups(context.TODO()) - require.Equal(t, 0, len(groups)) + require.Equal(t, 1, len(groups)) require.NoError(t, err) // Check information schema table information_schema.resource_groups @@ -155,7 +161,7 @@ func TestResourceGroupBasic(t *testing.T) { tk.MustQuery("select * from information_schema.resource_groups where name = 'y'").Check(testkit.Rows("y 4000 YES")) tk.MustQuery("show create resource group y").Check(testkit.Rows("y CREATE RESOURCE GROUP `y` RU_PER_SEC=4000 BURSTABLE")) - tk.MustQuery("select count(*) from information_schema.resource_groups").Check(testkit.Rows("2")) + tk.MustQuery("select count(*) from information_schema.resource_groups").Check(testkit.Rows("3")) tk.MustGetErrCode("create user usr_fail resource group nil_group", mysql.ErrResourceGroupNotExists) tk.MustContainErrMsg("create user usr_fail resource group nil_group", "Unknown resource group 'nil_group'") tk.MustExec("create user user2") diff --git a/executor/ddl.go b/executor/ddl.go index 405e245c8f..97bf58c0a3 100644 --- a/executor/ddl.go +++ b/executor/ddl.go @@ -744,21 +744,21 @@ func (e *DDLExec) executeAlterPlacementPolicy(s *ast.AlterPlacementPolicyStmt) e } func (e *DDLExec) executeCreateResourceGroup(s *ast.CreateResourceGroupStmt) error { - if !variable.EnableResourceControl.Load() { + if !variable.EnableResourceControl.Load() && !e.ctx.GetSessionVars().InRestrictedSQL { return infoschema.ErrResourceGroupSupportDisabled } return domain.GetDomain(e.ctx).DDL().AddResourceGroup(e.ctx, s) } func (e *DDLExec) executeAlterResourceGroup(s *ast.AlterResourceGroupStmt) error { - if !variable.EnableResourceControl.Load() { + if !variable.EnableResourceControl.Load() && !e.ctx.GetSessionVars().InRestrictedSQL { return infoschema.ErrResourceGroupSupportDisabled } return domain.GetDomain(e.ctx).DDL().AlterResourceGroup(e.ctx, s) } func (e *DDLExec) executeDropResourceGroup(s *ast.DropResourceGroupStmt) error { - if !variable.EnableResourceControl.Load() { + if !variable.EnableResourceControl.Load() && !e.ctx.GetSessionVars().InRestrictedSQL { return infoschema.ErrResourceGroupSupportDisabled } return domain.GetDomain(e.ctx).DDL().DropResourceGroup(e.ctx, s) diff --git a/session/bootstrap.go b/session/bootstrap.go index 8ce75e373e..98be176e74 100644 --- a/session/bootstrap.go +++ b/session/bootstrap.go @@ -563,6 +563,9 @@ const ( step INT(11), key(state) );` + + // CreateDefaultResourceGroup is the statement to create the default resource group + CreateDefaultResourceGroup = "CREATE RESOURCE GROUP IF NOT EXISTS `default` RU_PER_SEC=1000000 BURSTABLE;" ) // bootstrap initiates system DB for a store. @@ -824,11 +827,13 @@ const ( version135 = 135 // version136 prepare the tables for the distributed task. version136 = 136 + // version137 introduces some reserved resource groups + version137 = 137 ) // currentBootstrapVersion is defined as a variable, so we can modify its value for testing. // please make sure this is the largest version -var currentBootstrapVersion int64 = version136 +var currentBootstrapVersion int64 = version137 // DDL owner key's expired time is ManagerSessionTTL seconds, we should wait the time and give more time to have a chance to finish it. var internalSQLTimeout = owner.ManagerSessionTTL + 15 @@ -953,6 +958,7 @@ var ( upgradeToVer134, upgradeToVer135, upgradeToVer136, + upgradeToVer137, } ) @@ -2378,6 +2384,13 @@ func upgradeToVer136(s Session, ver int64) { doReentrantDDL(s, fmt.Sprintf("ALTER TABLE mysql.%s ADD INDEX idx_task_key(task_key)", ddl.BackgroundSubtaskTable), dbterror.ErrDupKeyName) } +func upgradeToVer137(s Session, ver int64) { + if ver >= version137 { + return + } + doReentrantDDL(s, CreateDefaultResourceGroup) +} + func writeOOMAction(s Session) { comment := "oom-action is `log` by default in v3.0.x, `cancel` by default in v4.0.11+" mustExecute(s, `INSERT HIGH_PRIORITY INTO %n.%n VALUES (%?, %?, %?) ON DUPLICATE KEY UPDATE VARIABLE_VALUE= %?`, @@ -2490,6 +2503,8 @@ func doDDLWorks(s Session) { mustExecute(s, CreateTTLJobHistory) // Create tidb_global_task table mustExecute(s, CreateGlobalTask) + // Create default resource group + mustExecute(s, CreateDefaultResourceGroup) } // doBootstrapSQLFile executes SQL commands in a file as the last stage of bootstrap. diff --git a/session/session.go b/session/session.go index 6424bff287..205292576f 100644 --- a/session/session.go +++ b/session/session.go @@ -2193,7 +2193,7 @@ func (s *session) ExecuteStmt(ctx context.Context, stmtNode ast.StmtNode) (sqlex // Observe the resource group query total counter if the resource control is enabled and the // current session is attached with a resource group. resourceGroupName := s.GetSessionVars().ResourceGroupName - if len(resourceGroupName) > 0 && resourceGroupName != variable.DefaultResourceGroupName { + if len(resourceGroupName) > 0 { metrics.ResourceGroupQueryTotalCounter.WithLabelValues(resourceGroupName).Inc() } diff --git a/sessionctx/variable/session.go b/sessionctx/variable/session.go index cfd26460b3..92d6845d44 100644 --- a/sessionctx/variable/session.go +++ b/sessionctx/variable/session.go @@ -66,9 +66,6 @@ import ( "golang.org/x/exp/slices" ) -// DefaultResourceGroupName is the default resource group name. -const DefaultResourceGroupName = "default" - var ( // PreparedStmtCount is exported for test. PreparedStmtCount int64 diff --git a/telemetry/data_feature_usage_test.go b/telemetry/data_feature_usage_test.go index a144e70bac..d45a38892d 100644 --- a/telemetry/data_feature_usage_test.go +++ b/telemetry/data_feature_usage_test.go @@ -361,7 +361,7 @@ func TestResourceGroups(t *testing.T) { usage, err := telemetry.GetFeatureUsage(tk.Session()) require.NoError(t, err) - require.Equal(t, uint64(0), usage.ResourceControlUsage.NumResourceGroups) + require.Equal(t, uint64(1), usage.ResourceControlUsage.NumResourceGroups) require.Equal(t, true, usage.ResourceControlUsage.Enabled) tk.MustExec("set global tidb_enable_resource_control = 'ON'") @@ -369,27 +369,27 @@ func TestResourceGroups(t *testing.T) { usage, err = telemetry.GetFeatureUsage(tk.Session()) require.NoError(t, err) require.Equal(t, true, usage.ResourceControlUsage.Enabled) - require.Equal(t, uint64(1), usage.ResourceControlUsage.NumResourceGroups) + require.Equal(t, uint64(2), usage.ResourceControlUsage.NumResourceGroups) tk.MustExec("create resource group y ru_per_sec=100") usage, err = telemetry.GetFeatureUsage(tk.Session()) require.NoError(t, err) - require.Equal(t, uint64(2), usage.ResourceControlUsage.NumResourceGroups) + require.Equal(t, uint64(3), usage.ResourceControlUsage.NumResourceGroups) tk.MustExec("alter resource group y ru_per_sec=200") usage, err = telemetry.GetFeatureUsage(tk.Session()) require.NoError(t, err) - require.Equal(t, uint64(2), usage.ResourceControlUsage.NumResourceGroups) + require.Equal(t, uint64(3), usage.ResourceControlUsage.NumResourceGroups) tk.MustExec("drop resource group y") usage, err = telemetry.GetFeatureUsage(tk.Session()) require.NoError(t, err) - require.Equal(t, uint64(1), usage.ResourceControlUsage.NumResourceGroups) + require.Equal(t, uint64(2), usage.ResourceControlUsage.NumResourceGroups) tk.MustExec("set global tidb_enable_resource_control = 'OFF'") usage, err = telemetry.GetFeatureUsage(tk.Session()) require.NoError(t, err) - require.Equal(t, uint64(1), usage.ResourceControlUsage.NumResourceGroups) + require.Equal(t, uint64(2), usage.ResourceControlUsage.NumResourceGroups) require.Equal(t, false, usage.ResourceControlUsage.Enabled) }