diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index e8437ac9462..a49b497599f 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -194,6 +194,9 @@ Release 2.7.0 - UNRELEASED HADOOP-11586. Update use of Iterator to Iterable in AbstractMetricsContext.java. (Ray Chiang via aajisaka) + HADOOP-9869. Configuration.getSocketAddr()/getEnum() should use + getTrimmed(). (Tsuyoshi Ozawa via aajisaka) + OPTIMIZATIONS HADOOP-11323. WritableComparator#compare keeps reference to byte array. 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 4271c11808e..3ae47e57c7f 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 @@ -1474,13 +1474,14 @@ public class Configuration implements Iterable>, /** * Return value matching this enumerated type. + * Note that the returned value is trimmed by this method. * @param name Property name * @param defaultValue Value returned if no mapping exists * @throws IllegalArgumentException If mapping is illegal for the type * provided */ public > T getEnum(String name, T defaultValue) { - final String val = get(name); + final String val = getTrimmed(name); return null == val ? defaultValue : Enum.valueOf(defaultValue.getDeclaringClass(), val); @@ -1577,6 +1578,7 @@ public class Configuration implements Iterable>, * Get the value of the name property as a Pattern. * If no such property is specified, or if the specified value is not a valid * Pattern, then DefaultValue is returned. + * Note that the returned value is NOT trimmed by this method. * * @param name property name * @param defaultValue default value @@ -2027,7 +2029,7 @@ public class Configuration implements Iterable>, */ public InetSocketAddress getSocketAddr( String name, String defaultAddress, int defaultPort) { - final String address = get(name, defaultAddress); + final String address = getTrimmed(name, defaultAddress); return NetUtils.createSocketAddr(address, defaultPort, name); } 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 a4020c734ea..74590e962e9 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 @@ -58,6 +58,7 @@ public class TestConfiguration extends TestCase { private Configuration conf; final static String CONFIG = new File("./test-config-TestConfiguration.xml").getAbsolutePath(); final static String CONFIG2 = new File("./test-config2-TestConfiguration.xml").getAbsolutePath(); + final static String CONFIG_FOR_ENUM = new File("./test-config-enum-TestConfiguration.xml").getAbsolutePath(); private static final String CONFIG_MULTI_BYTE = new File( "./test-config-multi-byte-TestConfiguration.xml").getAbsolutePath(); private static final String CONFIG_MULTI_BYTE_SAVED = new File( @@ -78,6 +79,7 @@ public class TestConfiguration extends TestCase { super.tearDown(); new File(CONFIG).delete(); new File(CONFIG2).delete(); + new File(CONFIG_FOR_ENUM).delete(); new File(CONFIG_MULTI_BYTE).delete(); new File(CONFIG_MULTI_BYTE_SAVED).delete(); } @@ -739,6 +741,7 @@ public class TestConfiguration extends TestCase { conf.setEnum("test.enum", Dingo.FOO); assertSame(Dingo.FOO, conf.getEnum("test.enum", Dingo.BAR)); assertSame(Yak.FOO, conf.getEnum("test.enum", Yak.RAB)); + conf.setEnum("test.enum", Dingo.FOO); boolean fail = false; try { conf.setEnum("test.enum", Dingo.BAR); @@ -749,6 +752,26 @@ public class TestConfiguration extends TestCase { assertTrue(fail); } + public void testEnumFromXml() throws IOException { + out=new BufferedWriter(new FileWriter(CONFIG_FOR_ENUM)); + startConfig(); + appendProperty("test.enum"," \t \n FOO \t \n"); + appendProperty("test.enum2"," \t \n Yak.FOO \t \n"); + endConfig(); + + Configuration conf = new Configuration(); + Path fileResource = new Path(CONFIG_FOR_ENUM); + conf.addResource(fileResource); + assertSame(Yak.FOO, conf.getEnum("test.enum", Yak.FOO)); + boolean fail = false; + try { + conf.getEnum("test.enum2", Yak.FOO); + } catch (IllegalArgumentException e) { + fail = true; + } + assertTrue(fail); + } + public void testTimeDuration() { Configuration conf = new Configuration(false); conf.setTimeDuration("test.time.a", 7L, SECONDS); @@ -865,7 +888,11 @@ public class TestConfiguration extends TestCase { conf.set("myAddress", "host2:3"); addr = conf.getSocketAddr("myAddress", defaultAddr, defaultPort); assertEquals("host2:3", NetUtils.getHostPortString(addr)); - + + conf.set("myAddress", " \n \t host4:5 \t \n "); + addr = conf.getSocketAddr("myAddress", defaultAddr, defaultPort); + assertEquals("host4:5", NetUtils.getHostPortString(addr)); + boolean threwException = false; conf.set("myAddress", "bad:-port"); try {