Преглед изворни кода

YARN-10652. Capacity Scheduler fails to handle user weights for a user that has a "." (dot) in it

This only fixes the user name resolution for weights in the queues. It
does not add generic support for user names with dots in all use cases
in the capacity scheduler.

Contributed by: Siddharth Ahuja
Wilfred Spiegelenburg пре 4 година
родитељ
комит
f276f1af80

+ 1 - 1
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

@@ -1963,7 +1963,7 @@ public class CapacitySchedulerConfiguration extends ReservationSchedulerConfigur
         getQueuePrefix(queuePath).replaceAll("\\.", "\\\\.")
         + USER_SETTINGS + "\\.";
     String weightKeyRegex =
-        qPathPlusPrefix + "\\w+\\." + USER_WEIGHT;
+        qPathPlusPrefix + "\\S+\\." + USER_WEIGHT;
     Map<String, String> props = getValByRegex(weightKeyRegex);
     for (Entry<String, String> e : props.entrySet()) {
       String userName =

+ 10 - 2
hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/capacity/TestLeafQueue.java

@@ -1660,17 +1660,25 @@ public class TestLeafQueue {
     LeafQueue a = stubLeafQueue((LeafQueue)queues.get(A));
     // Set minimum-user-limit-percent for queue "a" in the configs.
     csConf.setUserLimit(a.getQueuePath(), 50);
-    // Set weight for "user_0" to be 1.5 for the a queue in the configs.
+    // Set weight for "user_0" to be 1.5f for the a queue in the configs.
     csConf.setFloat("yarn.scheduler.capacity." + a.getQueuePath()
         + ".user-settings.user_0." + CapacitySchedulerConfiguration.USER_WEIGHT,
         1.5f);
+    // Set weight for "firstname.lastname" to be 0.7f for the a queue
+    // in the configs. Notice the user contains a dot. This is to test
+    // that weights are accepted for a username that contains dots.
+    csConf.setFloat("yarn.scheduler.capacity." + a.getQueuePath()
+        + ".user-settings.firstname.lastname."
+        + CapacitySchedulerConfiguration.USER_WEIGHT,
+        0.7f);
 
     when(csContext.getClusterResource())
         .thenReturn(Resources.createResource(16 * GB, 32));
     // Verify that configs were updated and parsed correctly.
     Assert.assertNull(a.getUserWeights().get("user_0"));
     a.reinitialize(a, csContext.getClusterResource());
-    assertEquals(1.5, a.getUserWeights().get("user_0").floatValue(), 0.0);
+    assertEquals(1.5f, a.getUserWeights().get("user_0"), 0.0f);
+    assertEquals(0.7f, a.getUserWeights().get("firstname.lastname"), 0.0f);
 
     // set maxCapacity
     a.setMaxCapacity(1.0f);