diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/ServerName.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/ServerName.java index 91e4c9d0b5b..b08101c3d8a 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/ServerName.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/ServerName.java @@ -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: * <hostname> '{@link #SERVERNAME_SEPARATOR}' <port> '{@link #SERVERNAME_SEPARATOR}' <startcode>. - * For example, if hostname is example.org, port is 1234, + * For example, if hostname is www.example.org, port is 1234, * and the startcode for the regionserver is 1212121212, then - * the {@link #toString()} would be example.org,1234,1212121212. + * the {@link #toString()} would be www.example.org,1234,1212121212. * *

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 { 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 { public static final List EMPTY_SERVER_LIST = new ArrayList(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 { 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 { } public String getHostname() { - return hostname; + return hostnameOnly; } public int getPort() { @@ -162,13 +185,14 @@ public class ServerName implements Comparable { } /** + * For internal use only. * @param hostName * @param port * @param startcode * @return Server name made of the concatenation of hostname, port and * startcode formatted as <hostname> ',' <port> ',' <startcode> */ - 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 { * {@link Addressing#createHostAndPortStr(String, int)} */ public String getHostAndPort() { - return Addressing.createHostAndPortStr(this.hostname, this.port); + return Addressing.createHostAndPortStr(this.hostnameOnly, this.port); } /** diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java index 660f95d80a7..fe73c445c12 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java @@ -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); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java index b85aff11d6a..97e0e3773dc 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java @@ -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, diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.java index 1a3d69c9443..d54fbac2ad5 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.java @@ -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]); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/Replication.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/Replication.java index 0d26e241c1d..7b84ccdfb25 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/Replication.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/Replication.java @@ -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) { diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/JVMClusterUtil.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/JVMClusterUtil.java index 7d0f775a4ce..149b057f81b 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/JVMClusterUtil.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/JVMClusterUtil.java @@ -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; } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/TestServerName.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/TestServerName.java index 52a7c1a938d..453123adcf3 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/TestServerName.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/TestServerName.java @@ -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