diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/HAUtil.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/HAUtil.java index 3720fab..87abbf5 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/HAUtil.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/HAUtil.java @@ -23,6 +23,7 @@ import org.apache.commons.logging.LogFactory; import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.http.HttpConfig; import org.apache.hadoop.yarn.exceptions.YarnRuntimeException; import java.util.Collection; @@ -58,25 +59,25 @@ public static boolean isHAEnabled(Configuration conf) { */ public static void verifyAndSetConfiguration(Configuration conf) throws YarnRuntimeException { - verifyAndSetRMHAIds(conf); - verifyAndSetRMHAId(conf); + verifyAndSetRMHAIdsList(conf); + verifyAndSetCurrentRMHAId(conf); verifyAndSetAllRpcAddresses(conf); } - private static void verifyAndSetRMHAIds(Configuration conf) { + private static void verifyAndSetRMHAIdsList(Configuration conf) { Collection ids = conf.getTrimmedStringCollection(YarnConfiguration.RM_HA_IDS); - if (ids.size() <= 0) { + if (ids.size() < 2) { throwBadConfigurationException( getInvalidValueMessage(YarnConfiguration.RM_HA_IDS, - conf.get(YarnConfiguration.RM_HA_IDS))); - } else if (ids.size() == 1) { - LOG.warn(getRMHAIdsWarningMessage(ids.toString())); + conf.get(YarnConfiguration.RM_HA_IDS) + + "\nHA mode requires atleast two RMs")); } StringBuilder setValue = new StringBuilder(); for (String id: ids) { + verifyRpcAddressesForRMHAId(id.trim(), conf); setValue.append(id); setValue.append(","); } @@ -84,7 +85,7 @@ private static void verifyAndSetRMHAIds(Configuration conf) { setValue.substring(0, setValue.length() - 1)); } - private static void verifyAndSetRMHAId(Configuration conf) { + private static void verifyAndSetCurrentRMHAId(Configuration conf) { String rmId = conf.getTrimmed(YarnConfiguration.RM_HA_ID); if (rmId == null) { throwBadConfigurationException( @@ -125,7 +126,9 @@ private static void verifyAndSetConfValue(String prefix, Configuration conf) { public static void verifyAndSetAllRpcAddresses(Configuration conf) { for (String confKey : YarnConfiguration.RM_RPC_ADDRESS_CONF_KEYS) { - verifyAndSetConfValue(confKey, conf); + if (!excapeRPCAddressVerification(conf, confKey)) { + verifyAndSetConfValue(confKey, conf); + } } } @@ -211,4 +214,31 @@ public static String addSuffix(String key, String suffix) { } return key + "." + suffix; } + + private static void verifyRpcAddressesForRMHAId(String RMId, + Configuration conf) { + for (String prefix : YarnConfiguration.RM_RPC_ADDRESS_CONF_KEYS) { + if (excapeRPCAddressVerification(conf, prefix)) { + continue; + } + try { + String confKey = addSuffix(prefix, RMId); + if (conf.getTrimmed(confKey) == null) { + throwBadConfigurationException(getNeedToSetValueMessage(confKey)); + } + } catch (IllegalArgumentException iae) { + throwBadConfigurationException(iae.getMessage()); + } + } + } + + private static boolean excapeRPCAddressVerification(Configuration conf, + String prefix) { + if ((prefix.equals(YarnConfiguration.RM_WEBAPP_ADDRESS) && HttpConfig + .isSecure()) || (prefix.equals(YarnConfiguration. + RM_WEBAPP_HTTPS_ADDRESS) && !HttpConfig.isSecure())) { + return true; + } + return false; + } } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/conf/TestHAUtil.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/conf/TestHAUtil.java index 0577006..37e4abf 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/conf/TestHAUtil.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/conf/TestHAUtil.java @@ -43,7 +43,6 @@ private static final String RM1_NODE_ID = RM1_NODE_ID_UNTRIMMED.trim(); private static final String RM2_NODE_ID = "rm2"; private static final String RM3_NODE_ID = "rm3"; - private static final String RM_INVALID_NODE_ID = ".rm"; private static final String RM_NODE_IDS_UNTRIMMED = RM1_NODE_ID_UNTRIMMED + "," + RM2_NODE_ID; private static final String RM_NODE_IDS = RM1_NODE_ID + "," + RM2_NODE_ID; @@ -100,46 +99,46 @@ public void testVerifyAndSetConfiguration() throws Exception { } conf.clear(); - conf.set(YarnConfiguration.RM_HA_IDS, RM_INVALID_NODE_ID); + conf.set(YarnConfiguration.RM_HA_IDS, RM1_NODE_ID); try { HAUtil.verifyAndSetConfiguration(conf); } catch (YarnRuntimeException e) { - assertEquals("YarnRuntimeException by getRMId()", - HAUtil.BAD_CONFIG_MESSAGE_PREFIX + - HAUtil.getNeedToSetValueMessage(YarnConfiguration.RM_HA_ID), - e.getMessage()); + assertEquals("YarnRuntimeException by getRMIds()", + expectedExceptionMessage(HAUtil.getInvalidValueMessage( + YarnConfiguration.RM_HA_IDS, conf.get(YarnConfiguration.RM_HA_IDS) + + "\nHA mode requires atleast two RMs")), e.getMessage()); } conf.clear(); - conf.set(YarnConfiguration.RM_HA_ID, RM_INVALID_NODE_ID); - conf.set(YarnConfiguration.RM_HA_IDS, RM_INVALID_NODE_ID); + conf.set(YarnConfiguration.RM_HA_IDS, RM1_NODE_ID + "," + + RM2_NODE_ID); for (String confKey : YarnConfiguration.RM_RPC_ADDRESS_CONF_KEYS) { - // simulate xml with invalid node id - conf.set(confKey + RM_INVALID_NODE_ID, RM_INVALID_NODE_ID); + // configuration key itself cannot contains space/tab/return chars. + conf.set(HAUtil.addSuffix(confKey, RM1_NODE_ID), RM1_ADDRESS_UNTRIMMED); + conf.set(HAUtil.addSuffix(confKey, RM2_NODE_ID), RM2_ADDRESS); } try { HAUtil.verifyAndSetConfiguration(conf); } catch (YarnRuntimeException e) { - assertEquals("YarnRuntimeException by addSuffix()", - HAUtil.BAD_CONFIG_MESSAGE_PREFIX + - HAUtil.getInvalidValueMessage(YarnConfiguration.RM_HA_ID, - RM_INVALID_NODE_ID), - e.getMessage()); + assertEquals("YarnRuntimeException by getRMId()", + expectedExceptionMessage( + HAUtil.getNeedToSetValueMessage(YarnConfiguration.RM_HA_ID)), + e.getMessage()); } conf.clear(); // simulate the case HAUtil.RM_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); + conf.set(YarnConfiguration.RM_HA_IDS, RM1_NODE_ID + "," + RM2_NODE_ID); try { HAUtil.verifyAndSetConfiguration(conf); - fail("Should throw YarnRuntimeException. by Configuration#set()"); + fail("Should throw YarnRuntimeException by verifyRpcAddressesForRMHAId"); } catch (YarnRuntimeException e) { String confKey = HAUtil.addSuffix(YarnConfiguration.RM_ADDRESS, RM1_NODE_ID); - assertEquals("YarnRuntimeException by Configuration#set()", - HAUtil.BAD_CONFIG_MESSAGE_PREFIX + HAUtil.getNeedToSetValueMessage(confKey), - e.getMessage()); + assertEquals("YarnRuntimeException by verifyAndSetRpcAddressesForRMHAId", + expectedExceptionMessage(HAUtil.getNeedToSetValueMessage(confKey)), + e.getMessage()); } // simulate the case YarnConfiguration.RM_HA_IDS doesn't contain @@ -150,14 +149,14 @@ public void testVerifyAndSetConfiguration() throws Exception { for (String confKey : YarnConfiguration.RM_RPC_ADDRESS_CONF_KEYS) { conf.set(HAUtil.addSuffix(confKey, RM1_NODE_ID), RM1_ADDRESS_UNTRIMMED); conf.set(HAUtil.addSuffix(confKey, RM2_NODE_ID), RM2_ADDRESS); + conf.set(HAUtil.addSuffix(confKey, RM3_NODE_ID), RM2_ADDRESS); } try { HAUtil.verifyAndSetConfiguration(conf); } catch (YarnRuntimeException e) { assertEquals("YarnRuntimeException by getRMId()'s validation", - HAUtil.BAD_CONFIG_MESSAGE_PREFIX + - HAUtil.getRMHAIdNeedToBeIncludedMessage("[rm2, rm3]", RM1_NODE_ID), - e.getMessage()); + expectedExceptionMessage(HAUtil.getRMHAIdNeedToBeIncludedMessage( + "[rm2, rm3]", RM1_NODE_ID)), e.getMessage()); } } @@ -170,4 +169,8 @@ public void testGetConfKeyForRMInstance() { HAUtil.getConfKeyForRMInstance(YarnConfiguration.NM_ADDRESS, conf) .contains(HAUtil.getRMHAId(conf))); } + + private String expectedExceptionMessage(String msg) { + return HAUtil.BAD_CONFIG_MESSAGE_PREFIX + msg; + } } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMHA.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMHA.java index d1fbf1c..604227b 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMHA.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/TestRMHA.java @@ -46,14 +46,20 @@ private static final String RM1_ADDRESS = "0.0.0.0:0"; private static final String RM1_NODE_ID = "rm1"; + private static final String RM2_ADDRESS = "1.1.1.1:1"; + private static final String RM2_NODE_ID = "rm2"; + @Before public void setUp() throws Exception { Configuration conf = new YarnConfiguration(); conf.setBoolean(YarnConfiguration.RM_HA_ENABLED, true); - conf.set(YarnConfiguration.RM_HA_IDS, RM1_NODE_ID); + conf.set(YarnConfiguration.RM_HA_IDS, RM1_NODE_ID + "," + RM2_NODE_ID); for (String confKey : YarnConfiguration.RM_RPC_ADDRESS_CONF_KEYS) { conf.set(HAUtil.addSuffix(confKey, RM1_NODE_ID), RM1_ADDRESS); } + for (String confKey : YarnConfiguration.RM_RPC_ADDRESS_CONF_KEYS) { + conf.set(HAUtil.addSuffix(confKey, RM2_NODE_ID), RM2_ADDRESS); + } conf.set(YarnConfiguration.RM_HA_ID, RM1_NODE_ID); rm = new MockRM(conf); diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/TestZKRMStateStore.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/TestZKRMStateStore.java index 924a30f..d1d2200 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/TestZKRMStateStore.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/recovery/TestZKRMStateStore.java @@ -143,7 +143,9 @@ private Configuration createHARMConf( conf.set(YarnConfiguration.ZK_RM_STATE_STORE_ADDRESS, hostPort); conf.set(YarnConfiguration.RM_HA_ID, rmId); for (String rpcAddress : YarnConfiguration.RM_RPC_ADDRESS_CONF_KEYS) { - conf.set(HAUtil.addSuffix(rpcAddress, rmId), "localhost:0"); + for(String id : HAUtil.getRMHAIds(conf)) { + conf.set(HAUtil.addSuffix(rpcAddress, id), "localhost:0"); + } } conf.set(HAUtil.addSuffix(YarnConfiguration.RM_ADMIN_ADDRESS, rmId), "localhost:" + adminPort); diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-tests/src/test/java/org/apache/hadoop/yarn/server/MiniYARNCluster.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-tests/src/test/java/org/apache/hadoop/yarn/server/MiniYARNCluster.java index 9829e86..0ceace1 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-tests/src/test/java/org/apache/hadoop/yarn/server/MiniYARNCluster.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-tests/src/test/java/org/apache/hadoop/yarn/server/MiniYARNCluster.java @@ -296,7 +296,9 @@ private void setHARMConfiguration(Configuration conf) { String hostname = MiniYARNCluster.getHostname(); conf.set(YarnConfiguration.RM_HA_ID, rmId); for (String confKey : YarnConfiguration.RM_RPC_ADDRESS_CONF_KEYS) { - conf.set(HAUtil.addSuffix(confKey, rmId), hostname + ":0"); + for(String id : HAUtil.getRMHAIds(conf)) { + conf.set(HAUtil.addSuffix(confKey, id), hostname + ":0"); + } } }