diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/client/ClientRMProxy.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/client/ClientRMProxy.java index c69a9df561b..65886e5b92e 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/client/ClientRMProxy.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/client/ClientRMProxy.java @@ -151,9 +151,17 @@ public static Text getTokenService(Configuration conf, String address, for (String rmId : HAUtil.getRMHAIds(conf)) { // Set RM_ID to get the corresponding RM_ADDRESS yarnConf.set(YarnConfiguration.RM_HA_ID, rmId); - services.add(SecurityUtil.buildTokenService( - yarnConf.getSocketAddr(address, defaultAddr, defaultPort)) - .toString()); + String tokenService = null; + try { + tokenService = SecurityUtil + .buildTokenService(yarnConf.getSocketAddr( + address, defaultAddr, defaultPort)).toString(); + } catch (IllegalArgumentException e) { + LOG.error("Failed to buildTokenService because of " + + "UnknownHostException: ", e); + continue; + } + services.add(tokenService); } return new Text(Joiner.on(',').join(services)); } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/client/TestClientRMProxy.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/client/TestClientRMProxy.java index 6c31fea7d56..5cf4ed9254c 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/client/TestClientRMProxy.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/client/TestClientRMProxy.java @@ -69,6 +69,25 @@ public void testGetRMDelegationTokenService() { assertTrue("Incorrect token service name", service.contains(defaultRMAddress)); } + + // HA is enabled one rm addr is not available, this is to test even + // one rm's addr is not available, getTokenService() can catch the exception + // from buildTokenService() and get token string. + conf.setBoolean(YarnConfiguration.RM_HA_ENABLED, true); + conf.set(YarnConfiguration.RM_HA_IDS, "rm1,rm2,rm3"); + conf.set(HAUtil.addSuffix(YarnConfiguration.RM_HOSTNAME, "rm1"), + "0.0.0.0"); + conf.set(HAUtil.addSuffix(YarnConfiguration.RM_HOSTNAME, "rm2"), + "0.0.0.0"); + conf.set(HAUtil.addSuffix(YarnConfiguration.RM_HOSTNAME, "rm3"), + ""); + tokenService = ClientRMProxy.getRMDelegationTokenService(conf); + services = tokenService.toString().split(","); + assertEquals(2, services.length); + for (String service : services) { + assertTrue("Incorrect token service name", + service.contains(defaultRMAddress)); + } } @Test