From 271742e74550bdfedc40c8e2629dd3a0a545c900 Mon Sep 17 00:00:00 2001 From: husharp Date: Fri, 12 May 2023 09:21:21 +0800 Subject: [PATCH 1/4] update Signed-off-by: husharp --- ddl/resourcegrouptest/resource_group_test.go | 45 ++++++++++++++------ planner/optimize.go | 12 ++++++ session/session.go | 2 +- 3 files changed, 46 insertions(+), 13 deletions(-) diff --git a/ddl/resourcegrouptest/resource_group_test.go b/ddl/resourcegrouptest/resource_group_test.go index 74618225ce28d..b2220daf12066 100644 --- a/ddl/resourcegrouptest/resource_group_test.go +++ b/ddl/resourcegrouptest/resource_group_test.go @@ -111,21 +111,21 @@ func TestResourceGroupBasic(t *testing.T) { tk.MustExec("create resource group y RU_PER_SEC=4000") checkFunc = func(groupInfo *model.ResourceGroupInfo) { - require.Equal(t, true, groupInfo.ID != 0) - require.Equal(t, "y", groupInfo.Name.L) - require.Equal(t, groupID.Load(), groupInfo.ID) - require.Equal(t, uint64(4000), groupInfo.RURate) - require.Equal(t, int64(4000), groupInfo.BurstLimit) + re.Equal(true, groupInfo.ID != 0) + re.Equal("y", groupInfo.Name.L) + re.Equal(groupID.Load(), groupInfo.ID) + re.Equal(uint64(4000), groupInfo.RURate) + re.Equal(int64(4000), groupInfo.BurstLimit) } g = testResourceGroupNameFromIS(t, tk.Session(), "y") checkFunc(g) tk.MustExec("alter resource group y BURSTABLE RU_PER_SEC=5000") checkFunc = func(groupInfo *model.ResourceGroupInfo) { - require.Equal(t, true, groupInfo.ID != 0) - require.Equal(t, "y", groupInfo.Name.L) - require.Equal(t, groupID.Load(), groupInfo.ID) - require.Equal(t, uint64(5000), groupInfo.RURate) - require.Equal(t, int64(-1), groupInfo.BurstLimit) + re.Equal(true, groupInfo.ID != 0) + re.Equal("y", groupInfo.Name.L) + re.Equal(groupID.Load(), groupInfo.ID) + re.Equal(uint64(5000), groupInfo.RURate) + re.Equal(int64(-1), groupInfo.BurstLimit) } g = testResourceGroupNameFromIS(t, tk.Session(), "y") checkFunc(g) @@ -142,8 +142,8 @@ 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, 1, len(groups)) - require.NoError(t, err) + re.Equal(1, len(groups)) + re.NoError(err) // Check information schema table information_schema.resource_groups tk.MustExec("create resource group x RU_PER_SEC=1000 PRIORITY=LOW") @@ -345,3 +345,24 @@ func TestNewResourceGroupFromOptions(t *testing.T) { } } } + +func TestBindHints(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + re := require.New(t) + + tk.MustExec("drop resource group if exists rg1") + tk.MustExec("create resource group rg1 RU_PER_SEC=1000") + + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int)") + + tk.MustExec("create global binding for select * from t using select /*+ resource_group(rg1) */ * from t") + tk.MustQuery("select * from t") + re.Equal("rg1", tk.Session().GetSessionVars().StmtCtx.ResourceGroup) + re.Equal("", tk.Session().GetSessionVars().ResourceGroupName) + tk.MustQuery("select a, b from t") + re.Equal("", tk.Session().GetSessionVars().StmtCtx.ResourceGroup) + re.Equal("", tk.Session().GetSessionVars().ResourceGroupName) +} diff --git a/planner/optimize.go b/planner/optimize.go index 8c319f585912e..9b0da24126c48 100644 --- a/planner/optimize.go +++ b/planner/optimize.go @@ -279,6 +279,18 @@ func Optimize(ctx context.Context, sctx sessionctx.Context, node ast.Node, is in sessVars.StmtCtx.AppendWarning(err) } } + + // Override the resource group if necessary + // TODO: we didn't check the existence of the hinted resource group now to save the cost per query + if curStmtHints.HasResourceGroup { + if variable.EnableResourceControl.Load() { + sessVars.ResourceGroupName = curStmtHints.ResourceGroup + } else { + err := infoschema.ErrResourceGroupSupportDisabled + sessVars.StmtCtx.AppendWarning(err) + } + } + plan, curNames, cost, err := optimize(ctx, sctx, node, is) if err != nil { binding.Status = bindinfo.Invalid diff --git a/session/session.go b/session/session.go index ca9ea291d1a2c..b0e27d8069178 100644 --- a/session/session.go +++ b/session/session.go @@ -2168,7 +2168,7 @@ func (s *session) ExecuteStmt(ctx context.Context, stmtNode ast.StmtNode) (sqlex // Transform abstract syntax tree to a physical plan(stored in executor.ExecStmt). compiler := executor.Compiler{Ctx: s} stmt, err := compiler.Compile(ctx, stmtNode) - // session resource-group might be changed by query hint, ensure the resoure it back when + // session resource-group might be changed by query hint, ensure restore it back when // the execution finished. if s.GetSessionVars().ResourceGroupName != originalResourceGroup { defer func() { From 0ea43c62bf44758fd8190dfb67eb39b038a766a1 Mon Sep 17 00:00:00 2001 From: husharp Date: Fri, 12 May 2023 10:52:17 +0800 Subject: [PATCH 2/4] update bazel Signed-off-by: husharp --- ddl/resourcegrouptest/BUILD.bazel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddl/resourcegrouptest/BUILD.bazel b/ddl/resourcegrouptest/BUILD.bazel index cb638a4201852..6568f8deda848 100644 --- a/ddl/resourcegrouptest/BUILD.bazel +++ b/ddl/resourcegrouptest/BUILD.bazel @@ -6,7 +6,7 @@ go_test( srcs = ["resource_group_test.go"], flaky = True, race = "on", - shard_count = 4, + shard_count = 5, deps = [ "//ddl/internal/callback", "//ddl/resourcegroup", From 937c1661af4588b39ed27e4b20c8347ccabbbdc2 Mon Sep 17 00:00:00 2001 From: husharp Date: Fri, 12 May 2023 20:06:34 +0800 Subject: [PATCH 3/4] update Signed-off-by: husharp --- planner/optimize.go | 34 ++++++++++++---------------------- 1 file changed, 12 insertions(+), 22 deletions(-) diff --git a/planner/optimize.go b/planner/optimize.go index 9b0da24126c48..ff70fd901ab14 100644 --- a/planner/optimize.go +++ b/planner/optimize.go @@ -180,17 +180,6 @@ func Optimize(ctx context.Context, sctx sessionctx.Context, node ast.Node, is in } } - // Override the resource group if necessary - // TODO: we didn't check the existence of the hinted resource group now to save the cost per query - if originStmtHints.HasResourceGroup { - if variable.EnableResourceControl.Load() { - sessVars.ResourceGroupName = originStmtHints.ResourceGroup - } else { - err := infoschema.ErrResourceGroupSupportDisabled - sessVars.StmtCtx.AppendWarning(err) - } - } - txnManger := sessiontxn.GetTxnManager(sctx) if _, isolationReadContainTiKV := sessVars.IsolationReadEngines[kv.TiKV]; isolationReadContainTiKV { var fp core.Plan @@ -280,17 +269,6 @@ func Optimize(ctx context.Context, sctx sessionctx.Context, node ast.Node, is in } } - // Override the resource group if necessary - // TODO: we didn't check the existence of the hinted resource group now to save the cost per query - if curStmtHints.HasResourceGroup { - if variable.EnableResourceControl.Load() { - sessVars.ResourceGroupName = curStmtHints.ResourceGroup - } else { - err := infoschema.ErrResourceGroupSupportDisabled - sessVars.StmtCtx.AppendWarning(err) - } - } - plan, curNames, cost, err := optimize(ctx, sctx, node, is) if err != nil { binding.Status = bindinfo.Invalid @@ -327,6 +305,18 @@ func Optimize(ctx context.Context, sctx sessionctx.Context, node ast.Node, is in // Restore the hint to avoid changing the stmt node. hint.BindHint(stmtNode, originHints) } + + // Override the resource group if necessary + // TODO: we didn't check the existence of the hinted resource group now to save the cost per query + if sessVars.StmtCtx.StmtHints.HasResourceGroup { + if variable.EnableResourceControl.Load() { + sessVars.ResourceGroupName = sessVars.StmtCtx.StmtHints.ResourceGroup + } else { + err := infoschema.ErrResourceGroupSupportDisabled + sessVars.StmtCtx.AppendWarning(err) + } + } + if sessVars.StmtCtx.EnableOptimizerDebugTrace && bestPlanFromBind != nil { core.DebugTraceBestBinding(sctx, chosenBinding.Hint) } From 6b8dba7caef3541b9f8b51b8d736be70292e7c5b Mon Sep 17 00:00:00 2001 From: husharp Date: Fri, 12 May 2023 20:07:55 +0800 Subject: [PATCH 4/4] update Signed-off-by: husharp --- planner/optimize.go | 1 - 1 file changed, 1 deletion(-) diff --git a/planner/optimize.go b/planner/optimize.go index ff70fd901ab14..4ba9191af4ce1 100644 --- a/planner/optimize.go +++ b/planner/optimize.go @@ -268,7 +268,6 @@ func Optimize(ctx context.Context, sctx sessionctx.Context, node ast.Node, is in sessVars.StmtCtx.AppendWarning(err) } } - plan, curNames, cost, err := optimize(ctx, sctx, node, is) if err != nil { binding.Status = bindinfo.Invalid