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