This is an automated email from the ASF dual-hosted git repository. luozenglin pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push: new 5c076b738b [improvement](resource-group) add test for resource group (#18575) 5c076b738b is described below commit 5c076b738b07a7b9543d0200cdca0d3d70f64ce7 Author: luozenglin <luozeng...@baidu.com> AuthorDate: Tue Apr 18 20:20:50 2023 +0800 [improvement](resource-group) add test for resource group (#18575) Co-authored-by: wangbo <youseebiggirl_...@qq.com> --- .../main/java/org/apache/doris/common/Config.java | 3 +- .../resource/resourcegroup/ResourceGroup.java | 2 +- .../resource/resourcegroup/ResourceGroupMgr.java | 21 ++- .../resourcegroup/ResourceGroupMgrTest.java | 146 +++++++++++++++++++++ .../resource/resourcegroup/ResourceGroupTest.java | 100 ++++++++++++++ .../test_resource_group_tvf.groovy | 4 + .../test_resource_group.groovy} | 15 ++- 7 files changed, 278 insertions(+), 13 deletions(-) diff --git a/fe/fe-common/src/main/java/org/apache/doris/common/Config.java b/fe/fe-common/src/main/java/org/apache/doris/common/Config.java index 2636c7650e..1942ec0834 100644 --- a/fe/fe-common/src/main/java/org/apache/doris/common/Config.java +++ b/fe/fe-common/src/main/java/org/apache/doris/common/Config.java @@ -1738,7 +1738,8 @@ public class Config extends ConfigBase { @ConfField public static boolean enable_pipeline_load = false; - @ConfField + // enable_resource_group should be immutable and temporarily set to mutable during the development test phase + @ConfField(mutable = true, masterOnly = true, expType = ExperimentalType.EXPERIMENTAL) public static boolean enable_resource_group = false; @ConfField(mutable = false, masterOnly = true) diff --git a/fe/fe-core/src/main/java/org/apache/doris/resource/resourcegroup/ResourceGroup.java b/fe/fe-core/src/main/java/org/apache/doris/resource/resourcegroup/ResourceGroup.java index bcf72cb3e2..2c3dfb4caa 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/resource/resourcegroup/ResourceGroup.java +++ b/fe/fe-core/src/main/java/org/apache/doris/resource/resourcegroup/ResourceGroup.java @@ -65,7 +65,7 @@ public class ResourceGroup implements Writable { this.version = 0; } - public static ResourceGroup createResourceGroup(String name, Map<String, String> properties) throws DdlException { + public static ResourceGroup create(String name, Map<String, String> properties) throws DdlException { checkProperties(properties); return new ResourceGroup(Env.getCurrentEnv().getNextId(), name, properties); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/resource/resourcegroup/ResourceGroupMgr.java b/fe/fe-core/src/main/java/org/apache/doris/resource/resourcegroup/ResourceGroupMgr.java index 058eee4471..37c0bc69e6 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/resource/resourcegroup/ResourceGroupMgr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/resource/resourcegroup/ResourceGroupMgr.java @@ -84,7 +84,7 @@ public class ResourceGroupMgr implements Writable, GsonPostProcessable { } public void init() { - if (Config.enable_resource_group) { + if (Config.enable_resource_group || Config.use_fuzzy_session_variable /* for github workflow */) { checkAndCreateDefaultGroup(); } } @@ -114,7 +114,7 @@ public class ResourceGroupMgr implements Writable, GsonPostProcessable { } Map<String, String> properties = Maps.newHashMap(); properties.put(ResourceGroup.CPU_SHARE, "10"); - defaultResourceGroup = ResourceGroup.createResourceGroup(DEFAULT_GROUP_NAME, properties); + defaultResourceGroup = ResourceGroup.create(DEFAULT_GROUP_NAME, properties); nameToResourceGroup.put(DEFAULT_GROUP_NAME, defaultResourceGroup); idToResourceGroup.put(defaultResourceGroup.getId(), defaultResourceGroup); Env.getCurrentEnv().getEditLog().logCreateResourceGroup(defaultResourceGroup); @@ -127,8 +127,11 @@ public class ResourceGroupMgr implements Writable, GsonPostProcessable { } public void createResourceGroup(CreateResourceGroupStmt stmt) throws DdlException { - ResourceGroup resourceGroup = ResourceGroup.createResourceGroup(stmt.getResourceGroupName(), - stmt.getProperties()); + if (!Config.enable_resource_group) { + throw new DdlException("unsupported feature now, coming soon."); + } + + ResourceGroup resourceGroup = ResourceGroup.create(stmt.getResourceGroupName(), stmt.getProperties()); String resourceGroupNameName = resourceGroup.getName(); writeLock(); try { @@ -160,6 +163,16 @@ public class ResourceGroupMgr implements Writable, GsonPostProcessable { return procNode.fetchResult().getRows(); } + // for ut + public Map<String, ResourceGroup> getNameToResourceGroup() { + return nameToResourceGroup; + } + + // for ut + public Map<Long, ResourceGroup> getIdToResourceGroup() { + return idToResourceGroup; + } + @Override public void write(DataOutput out) throws IOException { String json = GsonUtils.GSON.toJson(this); diff --git a/fe/fe-core/src/test/java/org/apache/doris/resource/resourcegroup/ResourceGroupMgrTest.java b/fe/fe-core/src/test/java/org/apache/doris/resource/resourcegroup/ResourceGroupMgrTest.java new file mode 100644 index 0000000000..7c013b4cfb --- /dev/null +++ b/fe/fe-core/src/test/java/org/apache/doris/resource/resourcegroup/ResourceGroupMgrTest.java @@ -0,0 +1,146 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.doris.resource.resourcegroup; + +import org.apache.doris.analysis.CreateResourceGroupStmt; +import org.apache.doris.catalog.Env; +import org.apache.doris.common.Config; +import org.apache.doris.common.DdlException; +import org.apache.doris.common.UserException; +import org.apache.doris.persist.EditLog; +import org.apache.doris.thrift.TPipelineResourceGroup; + +import com.google.common.collect.Maps; +import mockit.Delegate; +import mockit.Expectations; +import mockit.Injectable; +import mockit.Mocked; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicLong; + +public class ResourceGroupMgrTest { + + @Injectable + private EditLog editLog; + + @Mocked + private Env env; + + private AtomicLong id = new AtomicLong(10); + + @Before + public void setUp() throws DdlException { + new Expectations() { + { + env.getEditLog(); + minTimes = 0; + result = editLog; + + env.getNextId(); + minTimes = 0; + result = new Delegate() { + long delegate() { + return id.addAndGet(1); + } + }; + + editLog.logCreateResourceGroup((ResourceGroup) any); + minTimes = 0; + + Env.getCurrentEnv(); + minTimes = 0; + result = env; + } + }; + } + + @Test + public void testCreateResourceGroup() throws DdlException { + Config.enable_resource_group = true; + ResourceGroupMgr resourceGroupMgr = new ResourceGroupMgr(); + Map<String, String> properties1 = Maps.newHashMap(); + properties1.put(ResourceGroup.CPU_SHARE, "10"); + String name1 = "g1"; + CreateResourceGroupStmt stmt1 = new CreateResourceGroupStmt(false, name1, properties1); + resourceGroupMgr.createResourceGroup(stmt1); + + Map<String, ResourceGroup> nameToRG = resourceGroupMgr.getNameToResourceGroup(); + Assert.assertEquals(1, nameToRG.size()); + Assert.assertTrue(nameToRG.containsKey(name1)); + ResourceGroup group1 = nameToRG.get(name1); + Assert.assertEquals(name1, group1.getName()); + + Map<Long, ResourceGroup> idToRG = resourceGroupMgr.getIdToResourceGroup(); + Assert.assertEquals(1, idToRG.size()); + Assert.assertTrue(idToRG.containsKey(group1.getId())); + + Map<String, String> properties2 = Maps.newHashMap(); + properties2.put(ResourceGroup.CPU_SHARE, "20"); + String name2 = "g2"; + CreateResourceGroupStmt stmt2 = new CreateResourceGroupStmt(false, name2, properties2); + resourceGroupMgr.createResourceGroup(stmt2); + + nameToRG = resourceGroupMgr.getNameToResourceGroup(); + Assert.assertEquals(2, nameToRG.size()); + Assert.assertTrue(nameToRG.containsKey(name2)); + ResourceGroup group2 = nameToRG.get(name2); + idToRG = resourceGroupMgr.getIdToResourceGroup(); + Assert.assertEquals(2, idToRG.size()); + Assert.assertTrue(idToRG.containsKey(group2.getId())); + + try { + resourceGroupMgr.createResourceGroup(stmt2); + Assert.fail(); + } catch (DdlException e) { + Assert.assertTrue(e.getMessage().contains("already exist")); + } + + CreateResourceGroupStmt stmt3 = new CreateResourceGroupStmt(true, name2, properties2); + resourceGroupMgr.createResourceGroup(stmt3); + Assert.assertEquals(2, resourceGroupMgr.getIdToResourceGroup().size()); + Assert.assertEquals(2, resourceGroupMgr.getNameToResourceGroup().size()); + } + + @Test + public void testGetResourceGroup() throws UserException { + Config.enable_resource_group = true; + ResourceGroupMgr resourceGroupMgr = new ResourceGroupMgr(); + Map<String, String> properties1 = Maps.newHashMap(); + properties1.put(ResourceGroup.CPU_SHARE, "10"); + String name1 = "g1"; + CreateResourceGroupStmt stmt1 = new CreateResourceGroupStmt(false, name1, properties1); + resourceGroupMgr.createResourceGroup(stmt1); + List<TPipelineResourceGroup> tResourceGroups1 = resourceGroupMgr.getResourceGroup(name1); + Assert.assertEquals(1, tResourceGroups1.size()); + TPipelineResourceGroup tResourceGroup1 = tResourceGroups1.get(0); + Assert.assertEquals(name1, tResourceGroup1.getName()); + Assert.assertTrue(tResourceGroup1.getProperties().containsKey(ResourceGroup.CPU_SHARE)); + + try { + resourceGroupMgr.getResourceGroup("g2"); + Assert.fail(); + } catch (UserException e) { + Assert.assertTrue(e.getMessage().contains("does not exist")); + } + } +} diff --git a/fe/fe-core/src/test/java/org/apache/doris/resource/resourcegroup/ResourceGroupTest.java b/fe/fe-core/src/test/java/org/apache/doris/resource/resourcegroup/ResourceGroupTest.java new file mode 100644 index 0000000000..978d28b8f1 --- /dev/null +++ b/fe/fe-core/src/test/java/org/apache/doris/resource/resourcegroup/ResourceGroupTest.java @@ -0,0 +1,100 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.doris.resource.resourcegroup; + +import org.apache.doris.common.DdlException; +import org.apache.doris.common.proc.BaseProcResult; + +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import org.junit.Assert; +import org.junit.Test; + +import java.util.List; +import java.util.Map; + +public class ResourceGroupTest { + + @Test + public void testCreateNormal() throws DdlException { + Map<String, String> properties1 = Maps.newHashMap(); + properties1.put(ResourceGroup.CPU_SHARE, "10"); + String name1 = "g1"; + ResourceGroup group1 = ResourceGroup.create(name1, properties1); + Assert.assertEquals(name1, group1.getName()); + Assert.assertEquals(1, group1.getProperties().size()); + Assert.assertTrue(group1.getProperties().containsKey(ResourceGroup.CPU_SHARE)); + } + + @Test(expected = DdlException.class) + public void testNotSupportProperty() throws DdlException { + Map<String, String> properties1 = Maps.newHashMap(); + properties1.put(ResourceGroup.CPU_SHARE, "10"); + properties1.put("share", "10"); + String name1 = "g1"; + ResourceGroup.create(name1, properties1); + } + + @Test(expected = DdlException.class) + public void testRequiredProperty() throws DdlException { + Map<String, String> properties1 = Maps.newHashMap(); + String name1 = "g1"; + ResourceGroup.create(name1, properties1); + } + + @Test + public void testCpuShareValue() { + Map<String, String> properties1 = Maps.newHashMap(); + properties1.put(ResourceGroup.CPU_SHARE, "0"); + String name1 = "g1"; + try { + ResourceGroup.create(name1, properties1); + Assert.fail(); + } catch (DdlException e) { + Assert.assertTrue(e.getMessage().contains(ResourceGroup.CPU_SHARE + " requires a positive integer.")); + } + + properties1.put(ResourceGroup.CPU_SHARE, "cpu"); + try { + ResourceGroup.create(name1, properties1); + Assert.fail(); + } catch (DdlException e) { + Assert.assertTrue(e.getMessage().contains(ResourceGroup.CPU_SHARE + " requires a positive integer.")); + } + } + + @Test + public void testGetProcNodeData() throws DdlException { + Map<String, String> properties1 = Maps.newHashMap(); + properties1.put(ResourceGroup.CPU_SHARE, "10"); + String name1 = "g1"; + ResourceGroup group1 = ResourceGroup.create(name1, properties1); + + BaseProcResult result = new BaseProcResult(); + group1.getProcNodeData(result); + List<List<String>> rows = result.getRows(); + Assert.assertEquals(1, rows.size()); + List<List<String>> expectedRows = Lists.newArrayList(); + expectedRows.add(Lists.newArrayList(String.valueOf(group1.getId()), name1, ResourceGroup.CPU_SHARE, "10")); + for (int i = 0; i < expectedRows.size(); ++i) { + for (int j = 0; j < expectedRows.get(i).size(); ++j) { + Assert.assertEquals(expectedRows.get(i).get(j), rows.get(i).get(j)); + } + } + } +} diff --git a/regression-test/suites/correctness_p0/table_valued_function/test_resource_group_tvf.groovy b/regression-test/suites/correctness_p0/table_valued_function/test_resource_group_tvf.groovy index fe0f2a9ab6..a0293a0ee6 100644 --- a/regression-test/suites/correctness_p0/table_valued_function/test_resource_group_tvf.groovy +++ b/regression-test/suites/correctness_p0/table_valued_function/test_resource_group_tvf.groovy @@ -18,9 +18,13 @@ // This suit test the `resource_groups` tvf // TO DO suite("test_resource_groups_tvf") { + sql """ADMIN SET FRONTEND CONFIG ("experimental_enable_resource_group" = "true");""" + def name1 = "test"; sql "create resource group if not exists ${name1} properties('cpu_share'='10');" List<List<Object>> table = sql """ select * from resource_groups(); """ assertTrue(table.size() > 0) assertTrue(table[0].size == 4) // column should be 4 + + sql """ADMIN SET FRONTEND CONFIG ("experimental_enable_resource_group" = "false");""" } \ No newline at end of file diff --git a/regression-test/suites/correctness_p0/table_valued_function/test_resource_group_tvf.groovy b/regression-test/suites/resource_group_p0/test_resource_group.groovy similarity index 71% copy from regression-test/suites/correctness_p0/table_valued_function/test_resource_group_tvf.groovy copy to regression-test/suites/resource_group_p0/test_resource_group.groovy index fe0f2a9ab6..8dc7135547 100644 --- a/regression-test/suites/correctness_p0/table_valued_function/test_resource_group_tvf.groovy +++ b/regression-test/suites/resource_group_p0/test_resource_group.groovy @@ -14,13 +14,14 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. +suite("test_resource_group") { + sql """ADMIN SET FRONTEND CONFIG ("experimental_enable_resource_group" = "true");""" -// This suit test the `resource_groups` tvf -// TO DO -suite("test_resource_groups_tvf") { - def name1 = "test"; + def name1 = "g1"; sql "create resource group if not exists ${name1} properties('cpu_share'='10');" - List<List<Object>> table = sql """ select * from resource_groups(); """ - assertTrue(table.size() > 0) - assertTrue(table[0].size == 4) // column should be 4 + List<List<Object>> results = sql "show resource groups;" + assertTrue(results.size() >= 2) + assertEquals(4, results[0].size()) + + sql """ADMIN SET FRONTEND CONFIG ("experimental_enable_resource_group" = "false");""" } \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org