Przeglądaj źródła

HADOOP-18021. Provide a public wrapper of Configuration#substituteVars (#3710)

Contributed by Andras Gyori
Andras Gyori 3 lat temu
rodzic
commit
47ea0d734f

+ 19 - 1
hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/conf/Configuration.java

@@ -1099,6 +1099,20 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
     return result;
   }
 
+  /**
+   * Provides a public wrapper over substituteVars in order to avoid compatibility issues.
+   * See HADOOP-18021 for further details.
+   *
+   * @param expr the literal value of a config key
+   * @return null if expr is null, otherwise the value resulting from expanding
+   * expr using the algorithm above.
+   * @throws IllegalArgumentException when more than
+   * {@link Configuration#MAX_SUBST} replacements are required
+   */
+  public String substituteCommonVariables(String expr) {
+    return substituteVars(expr);
+  }
+
   /**
    * Attempts to repeatedly expand the value {@code expr} by replacing the
    * left-most substring of the form "${var}" in the following precedence order
@@ -1120,13 +1134,17 @@ public class Configuration implements Iterable<Map.Entry<String,String>>,
    * If a cycle is detected then the original expr is returned. Loops
    * involving multiple substitutions are not detected.
    *
+   * In order not to introduce breaking changes (as Oozie for example contains a method with the
+   * same name and same signature) do not make this method public, use substituteCommonVariables
+   * in this case.
+   *
    * @param expr the literal value of a config key
    * @return null if expr is null, otherwise the value resulting from expanding
    * expr using the algorithm above.
    * @throws IllegalArgumentException when more than
    * {@link Configuration#MAX_SUBST} replacements are required
    */
-  public String substituteVars(String expr) {
+  private String substituteVars(String expr) {
     if (expr == null) {
       return null;
     }

+ 11 - 0
hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/conf/TestConfiguration.java

@@ -444,6 +444,17 @@ public class TestConfiguration {
     assertTrue(mock.getInt("my.int", -1) == 42);
   }
 
+  /**
+   * Checks if variable substitution is accessible via a public API.
+   */
+  @Test
+  public void testCommonVariableSubstitution() {
+    conf.set("intvar", String.valueOf(42));
+    String intVar = conf.substituteCommonVariables("${intvar}");
+
+    assertEquals("42", intVar);
+  }
+
   @Test
   public void testEnvDefault() throws IOException {
     Configuration mock = Mockito.spy(conf);

+ 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/UserWeights.java

@@ -54,7 +54,7 @@ public final class UserWeights {
       if (m.find()) {
         String userName = item.getKey().replaceFirst("\\." + USER_WEIGHT, "");
         if (!userName.isEmpty()) {
-          String value = conf.substituteVars(item.getValue());
+          String value = conf.substituteCommonVariables(item.getValue());
           userWeights.data.put(userName, new Float(value));
         }
       }