diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index ecaa1bf9d23..1fff0762158 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -209,6 +209,9 @@ Branch-2 ( Unreleased changes ) HADOOP-8368. Use CMake rather than autotools to build native code (ccccabe via tucu) + HADOOP-8524. Allow users to get source of a Configuration + parameter (harsh) + BUG FIXES HADOOP-8372. NetUtils.normalizeHostName() incorrectly handles hostname 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 917f97c69bd..c54070eaafe 100644 --- 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 @@ -1070,6 +1070,38 @@ public void setPattern(String name, Pattern pattern) { } } + /** + * Gets the absolute path to the resource object (file, URL, etc.), for a given + * property name. + * + * @param name - The property name to get the source of. + * @return null - If the property or its source wasn't found or if the property + * was defined in code (i.e. in a Configuration instance, not from a physical + * resource). Otherwise, returns the absolute path of the resource that loaded + * the property name, as a String. + */ + @InterfaceStability.Unstable + public synchronized String getPropertySource(String name) { + if (properties == null) { + // If properties is null, it means a resource was newly added + // but the props were cleared so as to load it upon future + // requests. So lets force a load by asking a properties list. + getProps(); + } + // Return a null right away if our properties still + // haven't loaded or the resource mapping isn't defined + if (properties == null || updatingResource == null) { + return null; + } else { + String source = updatingResource.get(name); + if (source == null || source.equals(UNKNOWN_RESOURCE)) { + return null; + } else { + return source; + } + } + } + /** * A class that represents a set of positive integer ranges. It parses * strings of the form: "2-3,5,7-" where ranges are separated by comma and 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 34a1780142c..4878031262e 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 @@ -663,6 +663,26 @@ public void testPattern() throws IOException { conf.getPattern("test.pattern3", defaultPattern).pattern()); } + public void testPropertySource() throws IOException { + out = new BufferedWriter(new FileWriter(CONFIG)); + startConfig(); + appendProperty("test.foo", "bar"); + endConfig(); + Path fileResource = new Path(CONFIG); + conf.addResource(fileResource); + conf.set("fs.defaultFS", "value"); + assertEquals( + "Resource string returned for a file-loaded property" + + " must be a proper absolute path", + fileResource, + new Path(conf.getPropertySource("test.foo"))); + assertEquals("Resource string returned for a set() property must be null", + null, + conf.getPropertySource("fs.defaultFS")); + assertEquals("Resource string returned for an unset property must be null", + null, conf.getPropertySource("fs.defaultFoo")); + } + public void testSocketAddress() throws IOException { Configuration conf = new Configuration(); final String defaultAddr = "host:1";