YARN-2374. Fixed TestDistributedShell#testDSShell failure due to hostname dismatch. Contributed by Varun Vasudev

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1616302 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Jian He 2014-08-06 18:58:50 +00:00
parent 6fa66f2357
commit 9ebeac16eb
2 changed files with 74 additions and 4 deletions

View File

@ -134,6 +134,9 @@ Release 2.6.0 - UNRELEASED
YARN-2051. Fix bug in PBimpls and add more unit tests with reflection. YARN-2051. Fix bug in PBimpls and add more unit tests with reflection.
(Binglin Chang via junping_du) (Binglin Chang via junping_du)
YARN-2374. Fixed TestDistributedShell#testDSShell failure due to hostname
dismatch. (Varun Vasudev via jianhe)
Release 2.5.0 - UNRELEASED Release 2.5.0 - UNRELEASED
INCOMPATIBLE CHANGES INCOMPATIBLE CHANGES

View File

@ -26,13 +26,13 @@
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.URL; import java.net.URL;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import org.junit.Assert; import org.junit.Assert;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configuration;
@ -169,7 +169,9 @@ public void run() {
yarnClient.init(new Configuration(yarnCluster.getConfig())); yarnClient.init(new Configuration(yarnCluster.getConfig()));
yarnClient.start(); yarnClient.start();
String hostName = NetUtils.getHostname(); String hostName = NetUtils.getHostname();
boolean verified = false; boolean verified = false;
String errorMessage = "";
while(!verified) { while(!verified) {
List<ApplicationReport> apps = yarnClient.getApplications(); List<ApplicationReport> apps = yarnClient.getApplications();
if (apps.size() == 0 ) { if (apps.size() == 0 ) {
@ -177,15 +179,22 @@ public void run() {
continue; continue;
} }
ApplicationReport appReport = apps.get(0); ApplicationReport appReport = apps.get(0);
if (appReport.getHost().startsWith(hostName) if(appReport.getHost().equals("N/A")) {
&& appReport.getRpcPort() == -1) { Thread.sleep(10);
continue;
}
errorMessage =
"Expected host name to start with '" + hostName + "', was '"
+ appReport.getHost() + "'. Expected rpc port to be '-1', was '"
+ appReport.getRpcPort() + "'.";
if (checkHostname(appReport.getHost()) && appReport.getRpcPort() == -1) {
verified = true; verified = true;
} }
if (appReport.getYarnApplicationState() == YarnApplicationState.FINISHED) { if (appReport.getYarnApplicationState() == YarnApplicationState.FINISHED) {
break; break;
} }
} }
Assert.assertTrue(verified); Assert.assertTrue(errorMessage, verified);
t.join(); t.join();
LOG.info("Client run completed. Result=" + result); LOG.info("Client run completed. Result=" + result);
Assert.assertTrue(result.get()); Assert.assertTrue(result.get());
@ -212,6 +221,64 @@ public void run() {
.toString(), ApplicationMaster.DSEntity.DS_CONTAINER.toString()); .toString(), ApplicationMaster.DSEntity.DS_CONTAINER.toString());
} }
/*
* NetUtils.getHostname() returns a string in the form "hostname/ip".
* Sometimes the hostname we get is the FQDN and sometimes the short name. In
* addition, on machines with multiple network interfaces, it runs any one of
* the ips. The function below compares the returns values for
* NetUtils.getHostname() accounting for the conditions mentioned.
*/
private boolean checkHostname(String appHostname) throws Exception {
String hostname = NetUtils.getHostname();
if (hostname.equals(appHostname)) {
return true;
}
Assert.assertTrue("Unknown format for hostname " + appHostname,
appHostname.contains("/"));
Assert.assertTrue("Unknown format for hostname " + hostname,
hostname.contains("/"));
String[] appHostnameParts = appHostname.split("/");
String[] hostnameParts = hostname.split("/");
return (compareFQDNs(appHostnameParts[0], hostnameParts[0]) && checkIPs(
hostnameParts[0], hostnameParts[1], appHostnameParts[1]));
}
private boolean compareFQDNs(String appHostname, String hostname)
throws Exception {
if (appHostname.equals(hostname)) {
return true;
}
String appFQDN = InetAddress.getByName(appHostname).getCanonicalHostName();
String localFQDN = InetAddress.getByName(hostname).getCanonicalHostName();
return appFQDN.equals(localFQDN);
}
private boolean checkIPs(String hostname, String localIP, String appIP)
throws Exception {
if (localIP.equals(appIP)) {
return true;
}
boolean appIPCheck = false;
boolean localIPCheck = false;
InetAddress[] addresses = InetAddress.getAllByName(hostname);
for (InetAddress ia : addresses) {
if (ia.getHostAddress().equals(appIP)) {
appIPCheck = true;
continue;
}
if (ia.getHostAddress().equals(localIP)) {
localIPCheck = true;
}
}
return (appIPCheck && localIPCheck);
}
@Test(timeout=90000) @Test(timeout=90000)
public void testDSRestartWithPreviousRunningContainers() throws Exception { public void testDSRestartWithPreviousRunningContainers() throws Exception {
String[] args = { String[] args = {