HBASE-8645 Change ServerName so it uses hostname only, not FQDN hostnames
git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1490072 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
7188830e6b
commit
b5bdfb6f3f
|
@ -18,6 +18,7 @@
|
|||
*/
|
||||
package org.apache.hadoop.hbase;
|
||||
|
||||
import com.google.common.net.InetAddresses;
|
||||
import com.google.protobuf.InvalidProtocolBufferException;
|
||||
import org.apache.hadoop.classification.InterfaceAudience;
|
||||
import org.apache.hadoop.classification.InterfaceStability;
|
||||
|
@ -33,16 +34,15 @@ import java.util.regex.Pattern;
|
|||
|
||||
/**
|
||||
* Instance of an HBase ServerName.
|
||||
* A server name is used uniquely identifying a server instance and is made
|
||||
* of the combination of hostname, port, and startcode. The startcode
|
||||
* distingushes restarted servers on same hostname and port (startcode is
|
||||
* usually timestamp of server startup). The {@link #toString()} format of
|
||||
* ServerName is safe to use in the filesystem and as znode name up in
|
||||
* ZooKeeper. Its format is:
|
||||
* A server name is used uniquely identifying a server instance in a cluster and is made
|
||||
* of the combination of hostname, port, and startcode. The startcode distingushes restarted
|
||||
* servers on same hostname and port (startcode is usually timestamp of server startup). The
|
||||
* {@link #toString()} format of ServerName is safe to use in the filesystem and as znode name
|
||||
* up in ZooKeeper. Its format is:
|
||||
* <code><hostname> '{@link #SERVERNAME_SEPARATOR}' <port> '{@link #SERVERNAME_SEPARATOR}' <startcode></code>.
|
||||
* For example, if hostname is <code>example.org</code>, port is <code>1234</code>,
|
||||
* For example, if hostname is <code>www.example.org</code>, port is <code>1234</code>,
|
||||
* and the startcode for the regionserver is <code>1212121212</code>, then
|
||||
* the {@link #toString()} would be <code>example.org,1234,1212121212</code>.
|
||||
* the {@link #toString()} would be <code>www.example.org,1234,1212121212</code>.
|
||||
*
|
||||
* <p>You can obtain a versioned serialized form of this class by calling
|
||||
* {@link #getVersionedBytes()}. To deserialize, call {@link #parseVersionedServerName(byte[])}
|
||||
|
@ -83,7 +83,7 @@ public class ServerName implements Comparable<ServerName> {
|
|||
public static final String UNKNOWN_SERVERNAME = "#unknown#";
|
||||
|
||||
private final String servername;
|
||||
private final String hostname;
|
||||
private final String hostnameOnly;
|
||||
private final int port;
|
||||
private final long startcode;
|
||||
|
||||
|
@ -95,10 +95,23 @@ public class ServerName implements Comparable<ServerName> {
|
|||
public static final List<ServerName> EMPTY_SERVER_LIST = new ArrayList<ServerName>(0);
|
||||
|
||||
public ServerName(final String hostname, final int port, final long startcode) {
|
||||
this.hostname = hostname;
|
||||
// Drop the domain is there is one; no need of it in a local cluster. With it, we get long
|
||||
// unwieldy names.
|
||||
this.hostnameOnly = hostname;
|
||||
this.port = port;
|
||||
this.startcode = startcode;
|
||||
this.servername = getServerName(hostname, port, startcode);
|
||||
this.servername = getServerName(this.hostnameOnly, port, startcode);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param hostname
|
||||
* @return hostname minus the domain, if there is one (will do pass-through on ip addresses)
|
||||
*/
|
||||
static String getHostNameMinusDomain(final String hostname) {
|
||||
if (InetAddresses.isInetAddress(hostname)) return hostname;
|
||||
String [] parts = hostname.split("\\.");
|
||||
if (parts == null || parts.length == 0) return hostname;
|
||||
return parts[0];
|
||||
}
|
||||
|
||||
public ServerName(final String serverName) {
|
||||
|
@ -134,6 +147,16 @@ public class ServerName implements Comparable<ServerName> {
|
|||
return getServerName();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Return a SHORT version of {@link ServerName#toString()}, one that has the host only,
|
||||
* minus the domain, and the port only -- no start code; the String is for us internally mostly
|
||||
* tying threads to their server. Not for external use. It is lossy and will not work in
|
||||
* in compares, etc.
|
||||
*/
|
||||
public String toShortString() {
|
||||
return Addressing.createHostAndPortStr(getHostNameMinusDomain(this.hostnameOnly), this.port);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return {@link #getServerName()} as bytes with a short-sized prefix with
|
||||
* the ServerName#VERSION of this class.
|
||||
|
@ -150,7 +173,7 @@ public class ServerName implements Comparable<ServerName> {
|
|||
}
|
||||
|
||||
public String getHostname() {
|
||||
return hostname;
|
||||
return hostnameOnly;
|
||||
}
|
||||
|
||||
public int getPort() {
|
||||
|
@ -162,13 +185,14 @@ public class ServerName implements Comparable<ServerName> {
|
|||
}
|
||||
|
||||
/**
|
||||
* For internal use only.
|
||||
* @param hostName
|
||||
* @param port
|
||||
* @param startcode
|
||||
* @return Server name made of the concatenation of hostname, port and
|
||||
* startcode formatted as <code><hostname> ',' <port> ',' <startcode></code>
|
||||
*/
|
||||
public static String getServerName(String hostName, int port, long startcode) {
|
||||
static String getServerName(String hostName, int port, long startcode) {
|
||||
final StringBuilder name = new StringBuilder(hostName.length() + 1 + 5 + 1 + 13);
|
||||
name.append(hostName);
|
||||
name.append(SERVERNAME_SEPARATOR);
|
||||
|
@ -197,7 +221,7 @@ public class ServerName implements Comparable<ServerName> {
|
|||
* {@link Addressing#createHostAndPortStr(String, int)}
|
||||
*/
|
||||
public String getHostAndPort() {
|
||||
return Addressing.createHostAndPortStr(this.hostname, this.port);
|
||||
return Addressing.createHostAndPortStr(this.hostnameOnly, this.port);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -420,7 +420,7 @@ MasterServices, Server {
|
|||
", hbase.cluster.distributed=" + this.conf.getBoolean("hbase.cluster.distributed", false));
|
||||
|
||||
// set the thread name now we have an address
|
||||
setName(MASTER + "-" + this.serverName.toString());
|
||||
setName(MASTER + ":" + this.serverName.toShortString());
|
||||
|
||||
Replication.decorateMasterConfiguration(this.conf);
|
||||
|
||||
|
|
|
@ -1508,7 +1508,7 @@ public class HRegionServer implements ClientProtos.ClientService.BlockingInterfa
|
|||
private void startServiceThreads() throws IOException {
|
||||
String n = Thread.currentThread().getName();
|
||||
// Start executor services
|
||||
this.service = new ExecutorService(getServerName().toString());
|
||||
this.service = new ExecutorService(getServerName().toShortString());
|
||||
this.service.startExecutorService(ExecutorType.RS_OPEN_REGION,
|
||||
conf.getInt("hbase.regionserver.executor.openregion.threads", 3));
|
||||
this.service.startExecutorService(ExecutorType.RS_OPEN_META,
|
||||
|
|
|
@ -358,7 +358,7 @@ class MemStoreFlusher implements FlushRequester {
|
|||
|
||||
synchronized void start(UncaughtExceptionHandler eh) {
|
||||
ThreadFactory flusherThreadFactory = Threads.newDaemonThreadFactory(
|
||||
server.getServerName().toString() + "-MemStoreFlusher", eh);
|
||||
server.getServerName().toShortString() + "-MemStoreFlusher", eh);
|
||||
for (int i = 0; i < flushHandlers.length; i++) {
|
||||
flushHandlers[i] = new FlushHandler();
|
||||
flusherThreadFactory.newThread(flushHandlers[i]);
|
||||
|
|
|
@ -101,7 +101,7 @@ public class Replication implements WALActionsListener,
|
|||
this.replication = isReplication(this.conf);
|
||||
this.scheduleThreadPool = Executors.newScheduledThreadPool(1,
|
||||
new ThreadFactoryBuilder()
|
||||
.setNameFormat(server.getServerName() + "Replication Statistics #%d")
|
||||
.setNameFormat(server.getServerName().toShortString() + "Replication Statistics #%d")
|
||||
.setDaemon(true)
|
||||
.build());
|
||||
if (replication) {
|
||||
|
|
|
@ -48,7 +48,7 @@ public class JVMClusterUtil {
|
|||
private final HRegionServer regionServer;
|
||||
|
||||
public RegionServerThread(final HRegionServer r, final int index) {
|
||||
super(r, "RegionServer:" + index + ";" + r.getServerName());
|
||||
super(r, "RS:" + index + ";" + r.getServerName().toShortString());
|
||||
this.regionServer = r;
|
||||
}
|
||||
|
||||
|
@ -109,7 +109,7 @@ public class JVMClusterUtil {
|
|||
private final HMaster master;
|
||||
|
||||
public MasterThread(final HMaster m, final int index) {
|
||||
super(m, "Master:" + index + ";" + m.getServerName());
|
||||
super(m, "M:" + index + ";" + m.getServerName().toShortString());
|
||||
this.master = m;
|
||||
}
|
||||
|
||||
|
|
|
@ -31,6 +31,30 @@ import org.junit.experimental.categories.Category;
|
|||
|
||||
@Category(SmallTests.class)
|
||||
public class TestServerName {
|
||||
@Test
|
||||
public void testGetHostNameMinusDomain() {
|
||||
assertEquals("2607:f0d0:1002:51::4",
|
||||
ServerName.getHostNameMinusDomain("2607:f0d0:1002:51::4"));
|
||||
assertEquals("2607:f0d0:1002:0051:0000:0000:0000:0004",
|
||||
ServerName.getHostNameMinusDomain("2607:f0d0:1002:0051:0000:0000:0000:0004"));
|
||||
assertEquals("1.1.1.1", ServerName.getHostNameMinusDomain("1.1.1.1"));
|
||||
assertEquals("x", ServerName.getHostNameMinusDomain("x"));
|
||||
assertEquals("x", ServerName.getHostNameMinusDomain("x.y.z"));
|
||||
assertEquals("asf000", ServerName.getHostNameMinusDomain("asf000.sp2.ygridcore.net"));
|
||||
ServerName sn = new ServerName("asf000.sp2.ygridcore.net", 1, 1);
|
||||
assertEquals("asf000.sp2.ygridcore.net,1,1", sn.toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testShortString() {
|
||||
ServerName sn = new ServerName("asf000.sp2.ygridcore.net", 1, 1);
|
||||
assertEquals("asf000:1", sn.toShortString());
|
||||
sn = new ServerName("2607:f0d0:1002:0051:0000:0000:0000:0004", 1, 1);
|
||||
assertEquals("2607:f0d0:1002:0051:0000:0000:0000:0004:1", sn.toShortString());
|
||||
sn = new ServerName("1.1.1.1", 1, 1);
|
||||
assertEquals("1.1.1.1:1", sn.toShortString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRegexPatterns() {
|
||||
assertTrue(Pattern.matches(Addressing.VALID_PORT_REGEX, "123"));
|
||||
|
@ -46,8 +70,8 @@ public class TestServerName {
|
|||
final String snStr = "www.example.org,1234,5678";
|
||||
ServerName sn = new ServerName(snStr);
|
||||
byte [] versionedBytes = sn.getVersionedBytes();
|
||||
assertEquals(snStr, ServerName.parseVersionedServerName(versionedBytes).toString());
|
||||
final String hostnamePortStr = "www.example.org:1234";
|
||||
assertEquals(sn.toString(), ServerName.parseVersionedServerName(versionedBytes).toString());
|
||||
final String hostnamePortStr = sn.getHostAndPort();
|
||||
byte [] bytes = Bytes.toBytes(hostnamePortStr);
|
||||
String expecting =
|
||||
hostnamePortStr.replace(":", ServerName.SERVERNAME_SEPARATOR) +
|
||||
|
@ -69,8 +93,8 @@ public class TestServerName {
|
|||
assertEquals(sn.toString(),
|
||||
ServerName.getServerName("www.example.org:1234", 5678));
|
||||
assertEquals(sn.toString(),
|
||||
"www.example.org" + ServerName.SERVERNAME_SEPARATOR +
|
||||
"1234" + ServerName.SERVERNAME_SEPARATOR + "5678");
|
||||
"www.example.org" + ServerName.SERVERNAME_SEPARATOR + "1234" +
|
||||
ServerName.SERVERNAME_SEPARATOR + "5678");
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
Loading…
Reference in New Issue