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:
parent
5c8f4964cd
commit
86195ceb18
@ -313,6 +313,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
|
||||||
|
|
||||||
|
@ -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 @@ public class CachedDNSToSwitchMapping implements DNSToSwitchMapping {
|
|||||||
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);
|
||||||
|
@ -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;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -27,6 +27,7 @@ import java.net.Socket;
|
|||||||
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 class NetUtils {
|
|||||||
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*");
|
||||||
|
|
||||||
|
@ -20,7 +20,6 @@ package org.apache.hadoop.net;
|
|||||||
|
|
||||||
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;
|
||||||
@ -123,17 +122,6 @@ implements Configurable
|
|||||||
|
|
||||||
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;
|
||||||
|
@ -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 class StaticMapping extends Configured implements DNSToSwitchMapping {
|
|||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -72,4 +72,20 @@ public class TestNetUtils {
|
|||||||
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");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,6 @@ package org.apache.hadoop.net;
|
|||||||
|
|
||||||
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;
|
||||||
|
|
||||||
@ -49,37 +48,5 @@ public class TestScriptBasedMapping extends TestCase {
|
|||||||
List<String> result = mapping.resolve(names);
|
List<String> result = mapping.resolve(names);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user