From 039c11afb101d14c1fd40df2bb3c01e49a7f64c0 Mon Sep 17 00:00:00 2001 From: BornChanger Date: Wed, 18 Jan 2023 14:36:33 +0800 Subject: [PATCH 1/4] *: add telmetry support for resource control Signed-off-by: BornChanger --- telemetry/data_feature_usage.go | 16 ++++++++++-- telemetry/data_feature_usage_test.go | 39 ++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/telemetry/data_feature_usage.go b/telemetry/data_feature_usage.go index 6dec8edcb023a..6bbb3d8bf448d 100644 --- a/telemetry/data_feature_usage.go +++ b/telemetry/data_feature_usage.go @@ -59,6 +59,7 @@ type featureUsage struct { EnableGlobalMemoryControl bool `json:"enableGlobalMemoryControl"` AutoIDNoCache bool `json:"autoIDNoCache"` IndexMergeUsageCounter *m.IndexMergeUsageCounter `json:"indexMergeUsageCounter"` + ResourceGroupUsage *resourceGroupUsage `json:"resourceGroup"` } type placementPolicyUsage struct { @@ -69,6 +70,11 @@ type placementPolicyUsage struct { NumPartitionWithExplicitPolicies uint64 `json:"numPartitionWithExplicitPolicies"` } +type resourceGroupUsage struct { + Enabled bool `json:"resourceGroupEnabled"` + NumResourceGroups uint64 `json:"numResourceGroups"` +} + func getFeatureUsage(ctx context.Context, sctx sessionctx.Context) (*featureUsage, error) { var usage featureUsage var err error @@ -114,11 +120,12 @@ func getFeatureUsage(ctx context.Context, sctx sessionctx.Context) (*featureUsag return &usage, nil } -// collectFeatureUsageFromInfoschema updates the usage for temporary table, cached table and placement policies. +// collectFeatureUsageFromInfoschema updates the usage for temporary table, cached table, placement policies and resource groups func collectFeatureUsageFromInfoschema(ctx sessionctx.Context, usage *featureUsage) { if usage.PlacementPolicyUsage == nil { usage.PlacementPolicyUsage = &placementPolicyUsage{} } + is := GetDomainInfoSchema(ctx) for _, dbInfo := range is.AllSchemas() { if dbInfo.PlacementPolicyRef != nil { @@ -149,8 +156,13 @@ func collectFeatureUsageFromInfoschema(ctx sessionctx.Context, usage *featureUsa } } } - usage.PlacementPolicyUsage.NumPlacementPolicies += uint64(len(is.AllPlacementPolicies())) + + if usage.ResourceGroupUsage == nil { + usage.ResourceGroupUsage = &resourceGroupUsage{} + } + usage.ResourceGroupUsage.NumResourceGroups = uint64(len(is.AllResourceGroups())) + usage.ResourceGroupUsage.Enabled = variable.EnableResourceControl.Load() } // GetDomainInfoSchema is used by the telemetry package to get the latest schema information diff --git a/telemetry/data_feature_usage_test.go b/telemetry/data_feature_usage_test.go index c303c53f3006b..c693b58c4132f 100644 --- a/telemetry/data_feature_usage_test.go +++ b/telemetry/data_feature_usage_test.go @@ -337,6 +337,45 @@ func TestPlacementPolicies(t *testing.T) { require.Equal(t, uint64(1), usage.PlacementPolicyUsage.NumPartitionWithExplicitPolicies) } +func TestResourceGroups(t *testing.T) { + store := testkit.CreateMockStore(t) + + tk := testkit.NewTestKit(t, store) + + usage, err := telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.Equal(t, uint64(0), usage.ResourceGroupUsage.NumResourceGroups) + require.Equal(t, false, usage.ResourceGroupUsage.Enabled) + + tk.MustExec("set global tidb_enable_resource_control = 'ON'") + tk.MustExec("create resource group x rru_per_sec=100 wru_per_sec=200") + usage, err = telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.Equal(t, true, usage.ResourceGroupUsage.Enabled) + require.Equal(t, uint64(1), usage.ResourceGroupUsage.NumResourceGroups) + + tk.MustExec("create resource group y rru_per_sec=100 wru_per_sec=200") + usage, err = telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.Equal(t, uint64(2), usage.ResourceGroupUsage.NumResourceGroups) + + tk.MustExec("alter resource group y rru_per_sec=100 wru_per_sec=300") + usage, err = telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.Equal(t, uint64(2), usage.ResourceGroupUsage.NumResourceGroups) + + tk.MustExec("drop resource group y") + usage, err = telemetry.GetFeatureUsage(tk.Session()) + require.NoError(t, err) + require.Equal(t, uint64(1), usage.ResourceGroupUsage.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.ResourceGroupUsage.NumResourceGroups) + require.Equal(t, false, usage.ResourceGroupUsage.Enabled) +} + func TestAutoCapture(t *testing.T) { store := testkit.CreateMockStore(t) From 83be3f043f8610c0b98575b8b82e4e31e33cdadd Mon Sep 17 00:00:00 2001 From: BornChanger Date: Wed, 18 Jan 2023 14:50:36 +0800 Subject: [PATCH 2/4] *: fix typo Signed-off-by: BornChanger --- telemetry/data_feature_usage.go | 16 ++++++++-------- telemetry/data_feature_usage_test.go | 18 +++++++++--------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/telemetry/data_feature_usage.go b/telemetry/data_feature_usage.go index 6bbb3d8bf448d..81bf7a9785a3a 100644 --- a/telemetry/data_feature_usage.go +++ b/telemetry/data_feature_usage.go @@ -59,7 +59,7 @@ type featureUsage struct { EnableGlobalMemoryControl bool `json:"enableGlobalMemoryControl"` AutoIDNoCache bool `json:"autoIDNoCache"` IndexMergeUsageCounter *m.IndexMergeUsageCounter `json:"indexMergeUsageCounter"` - ResourceGroupUsage *resourceGroupUsage `json:"resourceGroup"` + ResourceControlUsage *resourceControlUsage `json:"resourceControl"` } type placementPolicyUsage struct { @@ -70,8 +70,8 @@ type placementPolicyUsage struct { NumPartitionWithExplicitPolicies uint64 `json:"numPartitionWithExplicitPolicies"` } -type resourceGroupUsage struct { - Enabled bool `json:"resourceGroupEnabled"` +type resourceControlUsage struct { + Enabled bool `json:"resourceControlEnabled"` NumResourceGroups uint64 `json:"numResourceGroups"` } @@ -120,7 +120,7 @@ func getFeatureUsage(ctx context.Context, sctx sessionctx.Context) (*featureUsag return &usage, nil } -// collectFeatureUsageFromInfoschema updates the usage for temporary table, cached table, placement policies and resource groups +// collectFeatureUsageFromInfoschema updates the usage for temporary table, cached table, placement policies and resource groups. func collectFeatureUsageFromInfoschema(ctx sessionctx.Context, usage *featureUsage) { if usage.PlacementPolicyUsage == nil { usage.PlacementPolicyUsage = &placementPolicyUsage{} @@ -158,11 +158,11 @@ func collectFeatureUsageFromInfoschema(ctx sessionctx.Context, usage *featureUsa } usage.PlacementPolicyUsage.NumPlacementPolicies += uint64(len(is.AllPlacementPolicies())) - if usage.ResourceGroupUsage == nil { - usage.ResourceGroupUsage = &resourceGroupUsage{} + if usage.ResourceControlUsage == nil { + usage.ResourceControlUsage = &resourceControlUsage{} } - usage.ResourceGroupUsage.NumResourceGroups = uint64(len(is.AllResourceGroups())) - usage.ResourceGroupUsage.Enabled = variable.EnableResourceControl.Load() + usage.ResourceControlUsage.NumResourceGroups = uint64(len(is.AllResourceGroups())) + usage.ResourceControlUsage.Enabled = variable.EnableResourceControl.Load() } // GetDomainInfoSchema is used by the telemetry package to get the latest schema information diff --git a/telemetry/data_feature_usage_test.go b/telemetry/data_feature_usage_test.go index c693b58c4132f..a678bc681eb18 100644 --- a/telemetry/data_feature_usage_test.go +++ b/telemetry/data_feature_usage_test.go @@ -344,36 +344,36 @@ func TestResourceGroups(t *testing.T) { usage, err := telemetry.GetFeatureUsage(tk.Session()) require.NoError(t, err) - require.Equal(t, uint64(0), usage.ResourceGroupUsage.NumResourceGroups) - require.Equal(t, false, usage.ResourceGroupUsage.Enabled) + require.Equal(t, uint64(0), usage.ResourceControlUsage.NumResourceGroups) + require.Equal(t, false, usage.ResourceControlUsage.Enabled) tk.MustExec("set global tidb_enable_resource_control = 'ON'") tk.MustExec("create resource group x rru_per_sec=100 wru_per_sec=200") usage, err = telemetry.GetFeatureUsage(tk.Session()) require.NoError(t, err) - require.Equal(t, true, usage.ResourceGroupUsage.Enabled) - require.Equal(t, uint64(1), usage.ResourceGroupUsage.NumResourceGroups) + require.Equal(t, true, usage.ResourceControlUsage.Enabled) + require.Equal(t, uint64(1), usage.ResourceControlUsage.NumResourceGroups) tk.MustExec("create resource group y rru_per_sec=100 wru_per_sec=200") usage, err = telemetry.GetFeatureUsage(tk.Session()) require.NoError(t, err) - require.Equal(t, uint64(2), usage.ResourceGroupUsage.NumResourceGroups) + require.Equal(t, uint64(2), usage.ResourceControlUsage.NumResourceGroups) tk.MustExec("alter resource group y rru_per_sec=100 wru_per_sec=300") usage, err = telemetry.GetFeatureUsage(tk.Session()) require.NoError(t, err) - require.Equal(t, uint64(2), usage.ResourceGroupUsage.NumResourceGroups) + require.Equal(t, uint64(2), 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.ResourceGroupUsage.NumResourceGroups) + require.Equal(t, uint64(1), 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.ResourceGroupUsage.NumResourceGroups) - require.Equal(t, false, usage.ResourceGroupUsage.Enabled) + require.Equal(t, uint64(1), usage.ResourceControlUsage.NumResourceGroups) + require.Equal(t, false, usage.ResourceControlUsage.Enabled) } func TestAutoCapture(t *testing.T) { From 5847cc1e5bf8540c3977b39cd08950e0e91226fd Mon Sep 17 00:00:00 2001 From: BornChanger Date: Wed, 18 Jan 2023 16:18:00 +0800 Subject: [PATCH 3/4] *: fix information_schema copy bug Signed-off-by: BornChanger --- infoschema/builder.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/infoschema/builder.go b/infoschema/builder.go index ffdad1e4c8607..9ec5277e5c79c 100644 --- a/infoschema/builder.go +++ b/infoschema/builder.go @@ -858,6 +858,7 @@ func (b *Builder) InitWithOldInfoSchema(oldSchema InfoSchema) *Builder { b.copySchemasMap(oldIS) b.copyBundlesMap(oldIS) b.copyPoliciesMap(oldIS) + b.copyResourceGroupMap(oldIS) b.copyTemporaryTableIDsMap(oldIS) b.copyReferredForeignKeyMap(oldIS) @@ -885,6 +886,13 @@ func (b *Builder) copyPoliciesMap(oldIS *infoSchema) { } } +func (b *Builder) copyResourceGroupMap(oldIS *infoSchema) { + is := b.is + for _, v := range oldIS.AllResourceGroups() { + is.resourceGroupMap[v.Name.L] = v + } +} + func (b *Builder) copyTemporaryTableIDsMap(oldIS *infoSchema) { is := b.is if len(oldIS.temporaryTableIDs) == 0 { From 8195d50428661d800efdda1aa753b10468572b5a Mon Sep 17 00:00:00 2001 From: BornChanger Date: Wed, 18 Jan 2023 16:22:11 +0800 Subject: [PATCH 4/4] *: adjust case Signed-off-by: BornChanger --- ddl/resource_group_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/ddl/resource_group_test.go b/ddl/resource_group_test.go index c8b53e494d671..0693247b25ce1 100644 --- a/ddl/resource_group_test.go +++ b/ddl/resource_group_test.go @@ -156,6 +156,7 @@ func TestResourceGroupBasic(t *testing.T) { tk.MustQuery("select * from information_schema.resource_groups where group_name = 'y'").Check(testkit.Rows(strconv.FormatInt(g2.ID, 10) + " y 4000 2000")) tk.MustQuery("show create resource group y").Check(testkit.Rows("y CREATE RESOURCE GROUP `y` RRU_PER_SEC=4000 WRU_PER_SEC=2000")) + tk.MustQuery("select count(*) from information_schema.resource_groups").Check(testkit.Rows("2")) tk.MustGetErrCode("create user usr_fail resource group nil_group", mysql.ErrResourceGroupNotExists) tk.MustExec("create user user2") tk.MustGetErrCode("alter user user2 resource group nil_group", mysql.ErrResourceGroupNotExists)