From 381cb2dabc4e55e0ec88f42534c1bf9f47498ca6 Mon Sep 17 00:00:00 2001 From: Josh Elser Date: Tue, 29 Sep 2015 12:51:46 -0400 Subject: [PATCH] HBASE-14594 Use new 3-arg DNS.getDefaultHost method Ensures that on systems with multi-homed networks and security enabled, hostname resolution occurs as intended. Reflection included to work around the fact that the new Hadoop DNS method is only included in >=2.8.0-SNAPSHOT. --- .../apache/hadoop/hbase/zookeeper/HQuorumPeer.java | 2 +- .../java/org/apache/hadoop/hbase/AuthUtil.java | 2 +- .../java/org/apache/hadoop/hbase/util/DNS.java | 67 ++++++++++++++++++++++ .../org/apache/hadoop/hbase/rest/RESTServer.java | 2 +- .../hadoop/hbase/rest/filter/AuthFilter.java | 2 +- .../hadoop/hbase/regionserver/RSRpcServices.java | 2 +- .../hadoop/hbase/thrift/ThriftServerRunner.java | 2 +- .../apache/hadoop/hbase/thrift2/ThriftServer.java | 2 +- 8 files changed, 74 insertions(+), 7 deletions(-) create mode 100644 hbase-common/src/main/java/org/apache/hadoop/hbase/util/DNS.java diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/zookeeper/HQuorumPeer.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/zookeeper/HQuorumPeer.java index 738c9c2..226796a 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/zookeeper/HQuorumPeer.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/zookeeper/HQuorumPeer.java @@ -27,8 +27,8 @@ import org.apache.hadoop.hbase.HBaseInterfaceAudience; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.classification.InterfaceAudience; import org.apache.hadoop.hbase.classification.InterfaceStability; +import org.apache.hadoop.hbase.util.DNS; import org.apache.hadoop.hbase.util.Strings; -import org.apache.hadoop.net.DNS; import org.apache.hadoop.util.StringUtils; import org.apache.zookeeper.server.ServerConfig; import org.apache.zookeeper.server.ZooKeeperServerMain; diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/AuthUtil.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/AuthUtil.java index 05107e6..cb7ab83 100644 --- a/hbase-common/src/main/java/org/apache/hadoop/hbase/AuthUtil.java +++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/AuthUtil.java @@ -27,9 +27,9 @@ import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.classification.InterfaceAudience; import org.apache.hadoop.hbase.classification.InterfaceStability; import org.apache.hadoop.hbase.security.UserProvider; +import org.apache.hadoop.hbase.util.DNS; import org.apache.hadoop.hbase.util.Strings; import org.apache.hadoop.hbase.util.Threads; -import org.apache.hadoop.net.DNS; import org.apache.hadoop.security.UserGroupInformation; /** diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DNS.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DNS.java new file mode 100644 index 0000000..d105a34 --- /dev/null +++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/DNS.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to you under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.hbase.util; + +import java.lang.reflect.Method; +import java.net.UnknownHostException; + +import org.apache.hadoop.hbase.classification.InterfaceAudience; + +/** + * Wrapper around Hadoop's DNS class to hide reflection. + */ +@InterfaceAudience.Private +public final class DNS { + private static boolean HAS_NEW_DNS_GET_DEFAULT_HOST_API; + private static Method GET_DEFAULT_HOST_METHOD; + + static { + try { + GET_DEFAULT_HOST_METHOD = org.apache.hadoop.net.DNS.class + .getMethod("getDefaultHost", String.class, String.class, boolean.class); + HAS_NEW_DNS_GET_DEFAULT_HOST_API = true; + } catch (Exception e) { + HAS_NEW_DNS_GET_DEFAULT_HOST_API = false; + } + } + + private DNS() {} + + /** + * Wrapper around DNS.getDefaultHost(String, String), calling + * DNS.getDefaultHost(String, String, boolean) when available. + * + * @param strInterface The network interface to query. + * @param nameserver The DNS host name. + * @return The default host names associated with IPs bound to the network interface. + */ + public static String getDefaultHost(String strInterface, String nameserver) + throws UnknownHostException { + if (HAS_NEW_DNS_GET_DEFAULT_HOST_API) { + try { + // Hadoop-2.8 includes a String, String, boolean variant of getDefaultHost + // which properly handles multi-homed systems with Kerberos. + return (String) GET_DEFAULT_HOST_METHOD.invoke(null, strInterface, nameserver, true); + } catch (Exception e) { + // If we can't invoke the method as it should exist, throw an exception + throw new RuntimeException("Failed to invoke DNS.getDefaultHost via reflection", e); + } + } else { + return org.apache.hadoop.net.DNS.getDefaultHost(strInterface, nameserver); + } + } +} diff --git a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/RESTServer.java b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/RESTServer.java index e937064..ad8c65d 100644 --- a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/RESTServer.java +++ b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/RESTServer.java @@ -38,10 +38,10 @@ import org.apache.hadoop.hbase.HBaseInterfaceAudience; import org.apache.hadoop.hbase.http.InfoServer; import org.apache.hadoop.hbase.rest.filter.AuthFilter; import org.apache.hadoop.hbase.security.UserProvider; +import org.apache.hadoop.hbase.util.DNS; import org.apache.hadoop.hbase.util.HttpServerUtil; import org.apache.hadoop.hbase.util.Strings; import org.apache.hadoop.hbase.util.VersionInfo; -import org.apache.hadoop.net.DNS; import org.mortbay.jetty.Connector; import org.mortbay.jetty.Server; import org.mortbay.jetty.nio.SelectChannelConnector; diff --git a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/filter/AuthFilter.java b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/filter/AuthFilter.java index 6d68cdd..e5208af 100644 --- a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/filter/AuthFilter.java +++ b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/filter/AuthFilter.java @@ -32,8 +32,8 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; +import org.apache.hadoop.hbase.util.DNS; import org.apache.hadoop.hbase.util.Strings; -import org.apache.hadoop.net.DNS; import org.apache.hadoop.security.SecurityUtil; import org.apache.hadoop.security.authentication.server.AuthenticationFilter; diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java index 31ac688..540f98a 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java @@ -159,11 +159,11 @@ import org.apache.hadoop.hbase.regionserver.wal.WALEdit; import org.apache.hadoop.hbase.util.ByteStringer; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.Counter; +import org.apache.hadoop.hbase.util.DNS; import org.apache.hadoop.hbase.util.EnvironmentEdgeManager; import org.apache.hadoop.hbase.util.Pair; import org.apache.hadoop.hbase.util.Strings; import org.apache.hadoop.hbase.zookeeper.ZKSplitLog; -import org.apache.hadoop.net.DNS; import org.apache.zookeeper.KeeperException; import com.google.protobuf.ByteString; diff --git a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServerRunner.java b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServerRunner.java index 109e874..6f0e779 100644 --- a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServerRunner.java +++ b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServerRunner.java @@ -98,8 +98,8 @@ import org.apache.hadoop.hbase.thrift.generated.TRowResult; import org.apache.hadoop.hbase.thrift.generated.TScan; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.ConnectionCache; +import org.apache.hadoop.hbase.util.DNS; import org.apache.hadoop.hbase.util.Strings; -import org.apache.hadoop.net.DNS; import org.apache.hadoop.security.SaslRpcServer.SaslGssCallbackHandler; import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.security.authorize.ProxyUsers; diff --git a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/ThriftServer.java b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/ThriftServer.java index be7ba5f..f6c6f6c 100644 --- a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/ThriftServer.java +++ b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/ThriftServer.java @@ -60,8 +60,8 @@ import org.apache.hadoop.hbase.thrift.CallQueue; import org.apache.hadoop.hbase.thrift.CallQueue.Call; import org.apache.hadoop.hbase.thrift.ThriftMetrics; import org.apache.hadoop.hbase.thrift2.generated.THBaseService; +import org.apache.hadoop.hbase.util.DNS; import org.apache.hadoop.hbase.util.Strings; -import org.apache.hadoop.net.DNS; import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.security.SaslRpcServer.SaslGssCallbackHandler; import org.apache.hadoop.util.GenericOptionsParser; -- 2.1.2