diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/AbstractCSQueue.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/AbstractCSQueue.java index 12ce05f2791..b0912215a29 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/AbstractCSQueue.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/AbstractCSQueue.java @@ -1614,6 +1614,12 @@ void updateEffectiveResources(Resource clusterResource) { } } + public CapacitySchedulerConfiguration getTemplateConfiguration() { + return isDynamicQueue() ? new AutoCreatedQueueTemplateConfig( + csContext.getConfiguration(), getQueuePath()) : + csContext.getConfiguration(); + } + public boolean isDynamicQueue() { readLock.lock(); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/AutoCreatedQueueTemplateConfig.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/AutoCreatedQueueTemplateConfig.java new file mode 100644 index 00000000000..00804fa053c --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/AutoCreatedQueueTemplateConfig.java @@ -0,0 +1,138 @@ +/** + * 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.hadoop.yarn.server.resourcemanager.scheduler.capacity; + +import org.apache.hadoop.conf.Configuration; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Represents a configuration that handles template entries based on + * template settings. + */ +public class AutoCreatedQueueTemplateConfig + extends CapacitySchedulerConfiguration { + public static final String AUTO_QUEUE_TEMPLATE_PREFIX = PREFIX + + AUTO_QUEUE_CREATION_V2_PREFIX + ".template."; + private static final String WILDCARD_QUEUE = "*"; + private static final int MAX_WILDCARD_LEVEL = 2; + + private final String queuePath; + + public AutoCreatedQueueTemplateConfig(Configuration configuration, + String queuePath) { + super(configuration); + this.queuePath = queuePath; + setTemplateConfigEntries(); + } + + /** + * Set the template configuration entries. Explicit templates always take + * precedence over wildcard values. An example template precedence + * hierarchy of root.a.b.c from highest to lowest: + * yarn.scheduler.capacity.auto-queue-creation-v2.template.root.a.b.capacity + * yarn.scheduler.capacity.auto-queue-creation-v2.template.root.a.*.capacity + * yarn.scheduler.capacity.auto-queue-creation-v2.template.root.*.*.capacity + */ + private void setTemplateConfigEntries() { + HashMap templateEntries = new HashMap<>(); + List queuePathParts = new ArrayList<>(Arrays.asList( + queuePath.split("\\."))); + + if (queuePathParts.size() <= 1) { + // This is either root or an empty queue name + return; + } else { + // Only dealing with parents, thus removing the LeafQueue part + queuePathParts.remove(queuePathParts.size() - 1); + } + int queueHierarchyParts = queuePathParts.size(); + + // start with the most explicit format (without wildcard) + int wildcardLevel = 0; + // root can not be wildcarded + int supportedWildcardLevel = Math.min(queueHierarchyParts - 1, + MAX_WILDCARD_LEVEL); + Set alreadySetProps = getPropsWithPrefix( + getQueuePrefix(queuePath)).keySet(); + + while (wildcardLevel <= supportedWildcardLevel) { + // Get all config entries with the specified prefix + String templateQueuePath = String.join(".", queuePathParts); + Map props = getPropsWithPrefix( + getAutoQueueTemplatePrefix(templateQueuePath)); + for (Map.Entry entry : props.entrySet()) { + // Do not include invalid configuration keys and do not overwrite + // properties with template, that are already set in the configuration. + if (!isPropValid(entry.getKey()) || alreadySetProps.contains( + entry.getKey())) { + continue; + } + templateEntries.putIfAbsent(entry.getKey(), entry.getValue()); + } + + for (int i = 0; i <= wildcardLevel; ++i) { + queuePathParts.set(queuePathParts.size() - 1 - i, WILDCARD_QUEUE); + } + + ++wildcardLevel; + } + + setConfigFromTemplateEntries(templateEntries); + } + + private void setConfigFromTemplateEntries( + HashMap templateEntries) { + for (Map.Entry entry : templateEntries.entrySet()) { + set(getQueuePrefix(queuePath) + entry.getKey(), entry.getValue()); + } + } + + private String getAutoQueueTemplatePrefix(String queue) { + return AUTO_QUEUE_TEMPLATE_PREFIX + queue + DOT; + } + + /** + * Checks, if the given property is a valid configuration entry. + *

+ * It is necessary to check property keys beforehand, to exclude configuration + * settings from lower queue levels (because there is no uniform way to + * distinguish whether a part of a key is a part of a queue path or a + * configuration property name). This is limited however to one-part keys + * (eg. capacity) or two-parts keys with an enable tag + * (eg. preemption.enabled) + * Example: for 'root.a' exclude 'root.a.b.capacity' but include + * 'root.a.preemption.enabled' + * + * @param propKey property key to check + * @return true if property is valid, false otherwise + */ + private static boolean isPropValid(String propKey) { + String[] keyParts = propKey.split("\\."); + boolean isSwitchProperty = keyParts.length == 2 + && (keyParts[1].endsWith("enabled") || keyParts[1].endsWith("enable")); + return keyParts.length == 1 || isSwitchProperty; + } + +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacitySchedulerConfiguration.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacitySchedulerConfiguration.java index 08b38a1707e..bb3ef3a1125 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacitySchedulerConfiguration.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/CapacitySchedulerConfiguration.java @@ -2009,7 +2009,7 @@ public void setDefaultLifetimePerQueue(String queue, long defaultLifetime) { AUTO_CREATE_CHILD_QUEUE_PREFIX + "enabled"; @Private - private static final String AUTO_QUEUE_CREATION_V2_PREFIX = + protected static final String AUTO_QUEUE_CREATION_V2_PREFIX = "auto-queue-creation-v2."; @Private diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/LeafQueue.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/LeafQueue.java index 6bf8d0a471a..84237bde255 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/LeafQueue.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/LeafQueue.java @@ -563,8 +563,7 @@ protected void reinitialize( public void reinitialize( CSQueue newlyParsedQueue, Resource clusterResource) throws IOException { - reinitialize(newlyParsedQueue, clusterResource, - csContext.getConfiguration()); + reinitialize(newlyParsedQueue, clusterResource, getTemplateConfiguration()); } @Override diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/ParentQueue.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/ParentQueue.java index f79ffcbb33c..7f78e2adcc2 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/ParentQueue.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/ParentQueue.java @@ -30,6 +30,7 @@ import org.apache.hadoop.thirdparty.com.google.common.collect.ImmutableList; import org.apache.hadoop.thirdparty.com.google.common.collect.ImmutableMap; import org.apache.commons.lang3.StringUtils; +import org.apache.hadoop.thirdparty.com.google.common.collect.Sets; import org.apache.hadoop.yarn.exceptions.YarnRuntimeException; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.SchedulerDynamicEditException; import org.slf4j.Logger; @@ -475,8 +476,8 @@ private CapacitySchedulerConfiguration getConfForAutoCreatedQueue( String childQueuePath, boolean isLeaf) { // Copy existing config CapacitySchedulerConfiguration dupCSConfig = - new CapacitySchedulerConfiguration( - csContext.getConfiguration(), false); + new AutoCreatedQueueTemplateConfig(csContext.getConfiguration(), + childQueuePath); if (isLeaf) { // set to -1, to disable it dupCSConfig.setUserLimitFactor(childQueuePath, -1); @@ -617,13 +618,24 @@ public void reinitialize(CSQueue newlyParsedQueue, ParentQueue newlyParsedParentQueue = (ParentQueue) newlyParsedQueue; // Set new configs - setupQueueConfigs(clusterResource, csContext.getConfiguration()); + setupQueueConfigs(clusterResource, getTemplateConfiguration()); // Re-configure existing child queues and add new ones // The CS has already checked to ensure all existing child queues are present! Map currentChildQueues = getQueuesMap(childQueues); Map newChildQueues = getQueuesMap( newlyParsedParentQueue.childQueues); + + for (String queue : Sets.difference(currentChildQueues.keySet(), + newChildQueues.keySet())) { + CSQueue candidate = currentChildQueues.get(queue); + if (candidate instanceof AbstractCSQueue) { + if (((AbstractCSQueue) candidate).isDynamicQueue()) { + candidate.reinitialize(candidate, clusterResource); + } + } + } + for (Map.Entry e : newChildQueues.entrySet()) { String newChildQueueName = e.getKey(); CSQueue newChildQueue = e.getValue(); @@ -1194,7 +1206,9 @@ public void updateClusterResource(Resource clusterResource, // For dynamic queue, we will set weight to 1 every time, because it // is possible new labels added to the parent. if (((AbstractCSQueue) queue).isDynamicQueue()) { - queue.getQueueCapacities().setWeight(nodeLabel, 1f); + if (queue.getQueueCapacities().getWeight(nodeLabel) == -1f) { + queue.getQueueCapacities().setWeight(nodeLabel, 1f); + } } } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestAutoCreatedQueueTemplateConfig.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestAutoCreatedQueueTemplateConfig.java new file mode 100644 index 00000000000..cf3a2271369 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestAutoCreatedQueueTemplateConfig.java @@ -0,0 +1,137 @@ +/** + * 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.hadoop.yarn.server.resourcemanager.scheduler.capacity; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.Map; + +public class TestAutoCreatedQueueTemplateConfig { + private static final String TEST_QUEUE_ABC = "root.a.b.c"; + private static final String TEST_QUEUE_AB = "root.a.b"; + private static final String TEST_QUEUE_A = "root.a"; + private static final String ROOT = "root"; + private CapacitySchedulerConfiguration conf; + + @Before + public void setUp() throws Exception { + conf = new CapacitySchedulerConfiguration(); + conf.setQueues("root", new String[]{"a"}); + conf.setQueues("a", new String[]{"b"}); + conf.setQueues("b", new String[]{"c"}); + } + + @Test + public void testNonWildCardTemplate() { + conf.set(getTemplateKey(TEST_QUEUE_AB, "capacity"), "6w"); + AutoCreatedQueueTemplateConfig templateConfig = + new AutoCreatedQueueTemplateConfig(conf, TEST_QUEUE_ABC); + + Assert.assertEquals("weight is not set", 6f, + templateConfig.getNonLabeledQueueWeight(TEST_QUEUE_ABC), 10e-6); + + } + + @Test + public void testOneLevelWildcardTemplate() { + conf.set(getTemplateKey("root.a.*", "capacity"), "6w"); + AutoCreatedQueueTemplateConfig templateConfig = + new AutoCreatedQueueTemplateConfig(conf, TEST_QUEUE_ABC); + + Assert.assertEquals("weight is not set", 6f, + templateConfig.getNonLabeledQueueWeight(TEST_QUEUE_ABC), 10e-6); + + } + + @Test + public void testTwoLevelsWildcardTemplate() { + conf.set(getTemplateKey("root.*.*", "capacity"), "6w"); + AutoCreatedQueueTemplateConfig templateConfig = + new AutoCreatedQueueTemplateConfig(conf, TEST_QUEUE_ABC); + + Assert.assertEquals("weight is not set", 6f, + templateConfig.getNonLabeledQueueWeight(TEST_QUEUE_ABC), 10e-6); + } + + @Test + public void testIgnoredWhenRootWildcarded() { + conf.set(getTemplateKey("*", "capacity"), "6w"); + AutoCreatedQueueTemplateConfig templateConfig = + new AutoCreatedQueueTemplateConfig(conf, TEST_QUEUE_A); + + Assert.assertEquals("weight is set", -1f, + templateConfig.getNonLabeledQueueWeight(TEST_QUEUE_A), 10e-6); + } + + @Test + public void testIgnoredWhenNoParent() { + conf.set(getTemplateKey("root", "capacity"), "6w"); + AutoCreatedQueueTemplateConfig templateConfig = + new AutoCreatedQueueTemplateConfig(conf, ROOT); + + Assert.assertEquals("weight is set", -1f, + templateConfig.getNonLabeledQueueWeight(ROOT), 10e-6); + } + + @Test + public void testTemplatePrecedence() { + conf.set(getTemplateKey("root.a.b", "capacity"), "6w"); + conf.set(getTemplateKey("root.a.*", "capacity"), "4w"); + conf.set(getTemplateKey("root.*.*", "capacity"), "2w"); + + AutoCreatedQueueTemplateConfig templateConfig = + new AutoCreatedQueueTemplateConfig(conf, TEST_QUEUE_ABC); + + Assert.assertEquals( + "explicit template does not have the highest precedence", 6f, + templateConfig.getNonLabeledQueueWeight(TEST_QUEUE_ABC), 10e-6); + + CapacitySchedulerConfiguration newConf = + new CapacitySchedulerConfiguration(); + newConf.set(getTemplateKey("root.a.*", "capacity"), "4w"); + newConf.set(getTemplateKey("root.*.*", "capacity"), "2w"); + + AutoCreatedQueueTemplateConfig newTemplateConfig = + new AutoCreatedQueueTemplateConfig(newConf, TEST_QUEUE_ABC); + + Assert.assertEquals("precedence is invalid", 4f, + newTemplateConfig.getNonLabeledQueueWeight(TEST_QUEUE_ABC), 10e-6); + } + + @Test + public void testIgnoreLowerQueueTemplates() { + conf.set(getTemplateKey("root.a.b", "capacity"), "6w"); + + AutoCreatedQueueTemplateConfig templateConfig = + new AutoCreatedQueueTemplateConfig(conf, TEST_QUEUE_A); + + Map props = templateConfig.getPropsWithPrefix( + CapacitySchedulerConfiguration.getQueuePrefix(TEST_QUEUE_A)); + Assert.assertTrue("root.a has an invalid property set", + props.isEmpty()); + + } + + private String getTemplateKey(String queuePath, String entryKey) { + return AutoCreatedQueueTemplateConfig.AUTO_QUEUE_TEMPLATE_PREFIX + + queuePath + "." + entryKey; + } +} \ No newline at end of file diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerNewQueueAutoCreation.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerNewQueueAutoCreation.java index 4facf943b6e..e88c3c30e2f 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerNewQueueAutoCreation.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestCapacitySchedulerNewQueueAutoCreation.java @@ -18,6 +18,7 @@ package org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity; +import org.apache.hadoop.yarn.api.records.QueueState; import org.apache.hadoop.yarn.api.records.ApplicationAttemptId; import org.apache.hadoop.yarn.api.records.ApplicationId; import org.apache.hadoop.yarn.conf.YarnConfiguration; @@ -565,6 +566,87 @@ public void testAutoCreateQueueMaxQueuesLimit() throws Exception { } } + @Test + public void testAutoCreatedQueueTemplateConfig() throws Exception { + startScheduler(); + csConf.set(AutoCreatedQueueTemplateConfig.AUTO_QUEUE_TEMPLATE_PREFIX + + "root.a.*.capacity", "6w"); + cs.reinitialize(csConf, mockRM.getRMContext()); + + LeafQueue a2 = createQueue("root.a.a-auto.a2"); + Assert.assertEquals("weight is not set by template", 6f, + a2.getQueueCapacities().getWeight(), 1e-6); + + cs.reinitialize(csConf, mockRM.getRMContext()); + a2 = (LeafQueue) cs.getQueue("root.a.a-auto.a2"); + Assert.assertEquals("weight is overridden", 6f, + a2.getQueueCapacities().getWeight(), 1e-6); + + csConf.setNonLabeledQueueWeight("root.a.a-auto.a2", 4f); + cs.reinitialize(csConf, mockRM.getRMContext()); + Assert.assertEquals("weight is not explicitly set", 4f, + a2.getQueueCapacities().getWeight(), 1e-6); + } + + @Test + public void testAutoCreatedQueueConfigChange() throws Exception { + startScheduler(); + LeafQueue a2 = createQueue("root.a.a-auto.a2"); + csConf.setNonLabeledQueueWeight("root.a.a-auto.a2", 4f); + cs.reinitialize(csConf, mockRM.getRMContext()); + + Assert.assertEquals("weight is not explicitly set", 4f, + a2.getQueueCapacities().getWeight(), 1e-6); + + a2 = (LeafQueue) cs.getQueue("root.a.a-auto.a2"); + csConf.setState("root.a.a-auto.a2", QueueState.STOPPED); + cs.reinitialize(csConf, mockRM.getRMContext()); + Assert.assertEquals("root.a.a-auto.a2 has not been stopped", + QueueState.STOPPED, a2.getState()); + + csConf.setState("root.a.a-auto.a2", QueueState.RUNNING); + cs.reinitialize(csConf, mockRM.getRMContext()); + Assert.assertEquals("root.a.a-auto.a2 is not running", + QueueState.RUNNING, a2.getState()); + + } + + @Test + public void testAutoCreateQueueState() throws Exception { + startScheduler(); + + createQueue("root.e.e1"); + csConf.setState("root.e", QueueState.STOPPED); + csConf.setState("root.e.e1" ,QueueState.STOPPED); + csConf.setState("root.a" ,QueueState.STOPPED); + cs.reinitialize(csConf, mockRM.getRMContext()); + + // Make sure the static queue state. + Assert.assertEquals(cs.getQueue("root.a").getState(), + QueueState.STOPPED); + // If not set, default is parent queue state + Assert.assertEquals(cs.getQueue("root.a.a1").getState(), + QueueState.STOPPED); + + // Make sure the dynamic queue state. + Assert.assertEquals(cs.getQueue("root.e").getState(), + QueueState.STOPPED); + Assert.assertEquals(cs.getQueue("root.e.e1").getState(), + QueueState.STOPPED); + + // Make root.e state to RUNNING + csConf.setState("root.e" ,QueueState.RUNNING); + cs.reinitialize(csConf, mockRM.getRMContext()); + Assert.assertEquals(cs.getQueue("root.e.e1").getState(), + QueueState.STOPPED); + + // Make root.e.e1 state to RUNNING + csConf.setState("root.e.e1" ,QueueState.RUNNING); + cs.reinitialize(csConf, mockRM.getRMContext()); + Assert.assertEquals(cs.getQueue("root.e.e1").getState(), + QueueState.RUNNING); + } + private LeafQueue createQueue(String queuePath) throws YarnException { return autoQueueHandler.autoCreateQueue( CSQueueUtils.extractQueuePath(queuePath));