diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index 3c9b5585f86..453a35df4b3 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -44,6 +44,9 @@ Release 2.0.1-alpha - UNRELEASED 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 8bc5972f6eb..8eddfe1a16d 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 @@ -1034,6 +1034,38 @@ public class Configuration implements Iterable>, } } + /** + * 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 20affe573cc..d26277ccb3d 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 @@ -640,6 +640,26 @@ public class TestConfiguration extends TestCase { 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";