HADOOP-7499. Add method for doing a sanity check on hostnames in NetUtils. (Jeffrey Naisbit via mahadev)

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1156809 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Mahadev Konar 2011-08-11 20:28:52 +00:00
parent 5c8f4964cd
commit 86195ceb18
8 changed files with 49 additions and 110 deletions

View File

@ -314,6 +314,9 @@ Trunk (unreleased changes)
HADOOP-7472. RPC client should deal with IP address change. HADOOP-7472. RPC client should deal with IP address change.
(Kihwal Lee via suresh) (Kihwal Lee via suresh)
HADOOP-7499. Add method for doing a sanity check on hostnames in NetUtils.
(Jeffrey Naisbit via mahadev)
OPTIMIZATIONS OPTIMIZATIONS
HADOOP-7333. Performance improvement in PureJavaCrc32. (Eric Caspole HADOOP-7333. Performance improvement in PureJavaCrc32. (Eric Caspole

View File

@ -17,9 +17,6 @@
*/ */
package org.apache.hadoop.net; package org.apache.hadoop.net;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -91,32 +88,6 @@ private List<String> getCachedHosts(List<String> names) {
return result; return result;
} }
/**
* Resolves host names and adds them to the cache.
* Unlike the 'resolve" method, this won't hide UnknownHostExceptions
*
* @param names to resolve
* @return List of resolved names
* @throws UnknownHostException if any hosts cannot be resolved
*/
public List<String> resolveValidHosts(List<String> names)
throws UnknownHostException {
if (names.isEmpty()) {
return new ArrayList<String>();
}
List<String> addresses = new ArrayList<String>(names.size());
for (String name : names) {
addresses.add(InetAddress.getByName(name).getHostAddress());
}
List<String> uncachedHosts = this.getUncachedHosts(names);
// Resolve the uncached hosts
List<String> resolvedHosts = rawMapping.resolveValidHosts(uncachedHosts);
this.cacheResolvedHosts(uncachedHosts, resolvedHosts);
return this.getCachedHosts(addresses);
}
public List<String> resolve(List<String> names) { public List<String> resolve(List<String> names) {
// normalize all input names to be in the form of IP addresses // normalize all input names to be in the form of IP addresses
names = NetUtils.normalizeHostNames(names); names = NetUtils.normalizeHostNames(names);

View File

@ -18,7 +18,6 @@
package org.apache.hadoop.net; package org.apache.hadoop.net;
import java.util.List; import java.util.List;
import java.net.UnknownHostException;
import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceAudience;
import org.apache.hadoop.classification.InterfaceStability; import org.apache.hadoop.classification.InterfaceStability;
@ -45,23 +44,4 @@ public interface DNSToSwitchMapping {
* @return list of resolved network paths * @return list of resolved network paths
*/ */
public List<String> resolve(List<String> names); public List<String> resolve(List<String> names);
/**
* Resolves a list of DNS-names/IP-addresses and returns back a list of
* switch information (network paths). One-to-one correspondence must be
* maintained between the elements in the lists.
* Consider an element in the argument list - x.y.com. The switch information
* that is returned must be a network path of the form /foo/rack,
* where / is the root, and 'foo' is the switch where 'rack' is connected.
* Note the hostname/ip-address is not part of the returned path.
* The network topology of the cluster would determine the number of
* components in the network path. Unlike 'resolve', names must be
* resolvable
* @param names
* @return list of resolved network paths
* @throws UnknownHostException if any hosts are not resolvable
*/
public List<String> resolveValidHosts(List<String> names)
throws UnknownHostException;
} }

View File

@ -27,6 +27,7 @@
import java.net.SocketAddress; import java.net.SocketAddress;
import java.net.SocketException; import java.net.SocketException;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.net.ConnectException; import java.net.ConnectException;
import java.nio.channels.SocketChannel; import java.nio.channels.SocketChannel;
@ -428,6 +429,35 @@ public static List<String> normalizeHostNames(Collection<String> names) {
return hostNames; return hostNames;
} }
/**
* Performs a sanity check on the list of hostnames/IPs to verify they at least
* appear to be valid.
* @param names - List of hostnames/IPs
* @throws UnknownHostException
*/
public static void verifyHostnames(String[] names) throws UnknownHostException {
for (String name: names) {
if (name == null) {
throw new UnknownHostException("null hostname found");
}
// The first check supports URL formats (e.g. hdfs://, etc.).
// java.net.URI requires a schema, so we add a dummy one if it doesn't
// have one already.
URI uri = null;
try {
uri = new URI(name);
if (uri.getHost() == null) {
uri = new URI("http://" + name);
}
} catch (URISyntaxException e) {
uri = null;
}
if (uri == null || uri.getHost() == null) {
throw new UnknownHostException(name + " is not a valid Inet address");
}
}
}
private static final Pattern ipPattern = // Pattern for matching hostname to ip:port private static final Pattern ipPattern = // Pattern for matching hostname to ip:port
Pattern.compile("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}:?\\d*"); Pattern.compile("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}:?\\d*");

View File

@ -20,7 +20,6 @@
import java.util.*; import java.util.*;
import java.io.*; import java.io.*;
import java.net.UnknownHostException;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
@ -124,17 +123,6 @@ public List<String> resolve(List<String> names) {
return m; return m;
} }
public List<String> resolveValidHosts(List<String> names)
throws UnknownHostException {
List<String> result = this.resolve(names);
if (result != null) {
return result;
} else {
throw new UnknownHostException(
"Unknown host(s) returned from ScriptBasedMapping");
}
}
private String runResolveCommand(List<String> args) { private String runResolveCommand(List<String> args) {
int loopCount = 0; int loopCount = 0;
if (args.size() == 0) { if (args.size() == 0) {

View File

@ -18,7 +18,6 @@
package org.apache.hadoop.net; package org.apache.hadoop.net;
import java.util.*; import java.util.*;
import java.net.UnknownHostException;
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured; import org.apache.hadoop.conf.Configured;
@ -60,19 +59,4 @@ public List<String> resolve(List<String> names) {
return m; return m;
} }
} }
public List<String> resolveValidHosts(List<String> names)
throws UnknownHostException {
List<String> m = new ArrayList<String>();
synchronized (nameToRackMap) {
for (String name : names) {
String rackId;
if ((rackId = nameToRackMap.get(name)) != null) {
m.add(rackId);
} else {
throw new UnknownHostException(name);
}
}
return m;
}
}
} }

View File

@ -72,4 +72,20 @@ public void testGetLocalInetAddress() throws Exception {
assertNull(NetUtils.getLocalInetAddress("invalid-address-for-test")); assertNull(NetUtils.getLocalInetAddress("invalid-address-for-test"));
assertNull(NetUtils.getLocalInetAddress(null)); assertNull(NetUtils.getLocalInetAddress(null));
} }
@Test(expected=UnknownHostException.class)
public void testVerifyHostnamesException() throws UnknownHostException {
String[] names = {"valid.host.com", "1.com", "invalid host here"};
NetUtils.verifyHostnames(names);
}
@Test
public void testVerifyHostnamesNoException() {
String[] names = {"valid.host.com", "1.com"};
try {
NetUtils.verifyHostnames(names);
} catch (UnknownHostException e) {
fail("NetUtils.verifyHostnames threw unexpected UnknownHostException");
}
}
} }

View File

@ -19,7 +19,6 @@
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.net.UnknownHostException;
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configuration;
@ -50,36 +49,4 @@ public void testNoArgsMeansNoResult() {
assertNull(result); assertNull(result);
} }
public void testResolveValidInvalidHostException() {
names = new ArrayList<String>();
names.add("1.com"); // Add invalid hostname that doesn't resolve
boolean exceptionThrown = false;
try {
mapping.resolveValidHosts(names);
} catch (UnknownHostException e) {
exceptionThrown = true;
}
assertTrue(
"resolveValidHosts did not throw UnknownHostException for invalid host",
exceptionThrown);
}
public void testResolveValidHostNoException() {
conf.setInt(ScriptBasedMapping.SCRIPT_ARG_COUNT_KEY,
ScriptBasedMapping.MIN_ALLOWABLE_ARGS);
conf.set(ScriptBasedMapping.SCRIPT_FILENAME_KEY, "echo");
mapping.setConf(conf);
names = new ArrayList<String>();
names.add("some.machine.name");
names.add("other.machine.name");
boolean exceptionThrown = false;
try {
mapping.resolveValidHosts(names);
} catch (UnknownHostException e) {
exceptionThrown = true;
}
assertFalse("resolveValidHosts threw Exception for valid host", exceptionThrown);
}
} }