From 47ea0d734fa290e2fac1b4d09f42a128c7294fd9 Mon Sep 17 00:00:00 2001 From: Andras Gyori Date: Fri, 3 Dec 2021 17:44:58 +0100 Subject: [PATCH] HADOOP-18021. Provide a public wrapper of Configuration#substituteVars (#3710) Contributed by Andras Gyori --- .../org/apache/hadoop/conf/Configuration.java | 20 ++++++++++++++++++- .../apache/hadoop/conf/TestConfiguration.java | 11 ++++++++++ .../scheduler/capacity/UserWeights.java | 2 +- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/conf/Configuration.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/conf/Configuration.java index 7ceaad37b1d..28be4beb51e 100755 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/conf/Configuration.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/conf/Configuration.java @@ -1099,6 +1099,20 @@ public class Configuration implements Iterable>, 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>, * 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; } diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/conf/TestConfiguration.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/conf/TestConfiguration.java index 3748eed1224..731fbc430b7 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/conf/TestConfiguration.java +++ b/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); 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/UserWeights.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/UserWeights.java index 7bdc1bc8045..a9d755227ff 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/UserWeights.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/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)); } }