@ -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)
|
||||
|
||||
@ -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")
|
||||
)
|
||||
|
||||
@ -30,6 +30,7 @@ func NewGroupFromOptions(groupName string, options *model.ResourceGroupSettings)
|
||||
if len(groupName) > MaxGroupNameLength {
|
||||
return nil, ErrTooLongResourceGroupName
|
||||
}
|
||||
|
||||
group := &rmpb.ResourceGroup{
|
||||
Name: groupName,
|
||||
}
|
||||
|
||||
@ -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")
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user