diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/HAUtil.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/HAUtil.java index 18f9896..e19d5c0 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/HAUtil.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/HAUtil.java @@ -78,9 +78,14 @@ public static String getRMHAId(Configuration conf) { return rmId; } + private static String getConfKeyForRMInstance(String prefix, + Configuration conf) { + return addSuffix(prefix, getRMHAId(conf)); + } + private static String getConfValueForRMInstance(String prefix, Configuration conf) { - String confKey = addSuffix(prefix, getRMHAId(conf)); + String confKey = getConfKeyForRMInstance(prefix, conf); String retVal = conf.get(confKey); if (LOG.isTraceEnabled()) { LOG.trace("getConfValueForRMInstance: prefix = " + prefix + @@ -97,7 +102,28 @@ static String getConfValueForRMInstance(String prefix, String defaultValue, } private static void setConfValue(String prefix, Configuration conf) { - conf.set(prefix, getConfValueForRMInstance(prefix, conf)); + String confKey = null; + String confValue = null; + try { + confKey = getConfKeyForRMInstance(prefix, conf); + confValue = getConfValueForRMInstance(prefix, conf); + conf.set(prefix, confValue); + } catch (YarnRuntimeException yre) { + // Error at getRMHAId() + throw yre; + } catch (IllegalArgumentException iae) { + String errmsg; + if (confKey == null) { + // Error at addSuffix + errmsg = YarnConfiguration.RM_HA_ID + + " cannot be allowed to start with '.'"; + } else { + // Error at Configuration#set + errmsg = confKey + " needs to be set correctly" + + "in a HA configuration. Configured value is: " + confValue; + } + throwBadConfigurationException(errmsg); + } } public static void setAllRpcAddresses(Configuration conf) { diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/conf/TestHAUtil.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/conf/TestHAUtil.java index e0e46c4..eff1ffd 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/conf/TestHAUtil.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/conf/TestHAUtil.java @@ -36,6 +36,7 @@ private static final String RM2_ADDRESS = "localhost:8022"; private static final String RM1_NODE_ID = "rm1"; private static final String RM2_NODE_ID = "rm2"; + private static final String RM_INVALID_NODE_ID = ".rm"; @Before public void setUp() { @@ -76,4 +77,58 @@ public void testSetGetRpcAddresses() throws Exception { RM1_ADDRESS, conf.get(confKey)); } } + + @Test + public void testErrorHandlingOfSetGetRpcAddresses() throws Exception { + conf.clear(); + try { + HAUtil.setAllRpcAddresses(conf); + } catch (YarnRuntimeException e) { + assertEquals("YarnRuntimeException by getRMId()", + "Invalid configuration! " +YarnConfiguration.RM_HA_ID + + " needs to be set in a HA configuration" , e.getMessage()); + } + + conf.set(YarnConfiguration.RM_HA_ID, RM_INVALID_NODE_ID); + conf.set(YarnConfiguration.RM_HA_IDS, RM_INVALID_NODE_ID); + for (String confKey : HAUtil.RPC_ADDRESS_CONF_KEYS) { + // simulate xml with invalid node id + conf.set(confKey + RM_INVALID_NODE_ID, RM_INVALID_NODE_ID); + } + try { + HAUtil.setAllRpcAddresses(conf); + } catch (YarnRuntimeException e) { + assertEquals("YarnRuntimeException by addSuffix()", + "Invalid configuration! " + YarnConfiguration.RM_HA_ID + + " cannot be allowed to start with '.'", e.getMessage()); + } + + conf.clear(); + // simulate the case HAUtil.RPC_ADDRESS_CONF_KEYS are not set + conf.set(YarnConfiguration.RM_HA_ID, RM1_NODE_ID); + conf.set(YarnConfiguration.RM_HA_IDS, RM1_NODE_ID); + try { + HAUtil.setAllRpcAddresses(conf); + fail("should throw YarnRuntimeException. by Configuration#set()"); + } catch (YarnRuntimeException e) { + String confKey = HAUtil.addSuffix(YarnConfiguration.RM_ADDRESS, RM1_NODE_ID); + assertEquals("YarnRuntimeException by Configuration#set()", + "Invalid configuration! " + confKey + " needs to be set correctly" + + "in a HA configuration. Configured value is: null", + e.getMessage()); + } + + // simulate the case YarnConfiguration.RM_HA_IDS is not set + conf.clear(); + conf.set(YarnConfiguration.RM_HA_ID, RM1_NODE_ID); + for (String confKey : HAUtil.RPC_ADDRESS_CONF_KEYS) { + conf.set(HAUtil.addSuffix(confKey, RM1_NODE_ID), RM1_ADDRESS); + } + try { + HAUtil.setAllRpcAddresses(conf); + } catch (Exception e) { + fail("Should not throw any exception" + + "even if YarnConfiguration.RM_HA_IDS is not set"); + } + } }