*: visible default resource group (#41606)

close pingcap/tidb#40875
This commit is contained in:
BornChanger
2023-03-14 20:50:39 +08:00
committed by GitHub
parent bd546f88c0
commit a86fd29f1f
9 changed files with 42 additions and 20 deletions

View File

@ -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)

View File

@ -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")
)

View File

@ -30,6 +30,7 @@ func NewGroupFromOptions(groupName string, options *model.ResourceGroupSettings)
if len(groupName) > MaxGroupNameLength {
return nil, ErrTooLongResourceGroupName
}
group := &rmpb.ResourceGroup{
Name: groupName,
}

View File

@ -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")

View File

@ -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)

View File

@ -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.

View File

@ -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()
}

View File

@ -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

View File

@ -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)
}